Dessiner sur une image uniquement avec l'API

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Dessiner sur une image uniquement avec l'API

Message par Le Soldat Inconnu »

Salut,

bon, voilà mon problème :
j'ai un thread qui doit utilisé un startdrawing et le prog principal également

or PB ne supporte qu'un startdrawing à la fois

Les dessins que je dois faire dans le thread sont des fonction de l'API (le thread me permet de faire un dessin long en arrière plan sans gêner le reste qui dessine quand même sur des images)

voila un code ou j'ai essayé mais rien

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
; 
; Explication du programme :
; Dessiner une icône associée à un fichier


; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
  End
EndIf

; On récupère l'ImageList
; C'est ici que ce fait le choix entre icône 16*16 (#SHGFI_SMALLICON) ou 32*32 (#SHGFI_LARGEICON)
hImageList16.l = SHGetFileInfo_(0, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON)
hImageList32.l = SHGetFileInfo_(0, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_LARGEICON)

IconPath.s = "C:\Windows\"
SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON) ; On récupère la position de l'icône dans l'ImageList

; la je veux pour voir desiner sur une image en utilisant uniquement l'API
; car j'ai besoin de 2 startdrawing en même temps, un dans le prog principale, l'autre dans un thread
CreateImage(0, 50, 50) ; On crée une image
HDC = CreateCompatibleDC_(GetDC_(UseImage(0)))
  ImageList_Draw_(hImageList16, InfosFile\iIcon, HDC, 1, 1, #ILD_TRANSPARENT) ; On dessine l'icône 16*16 à partir de l'ImageList 16*16
  ImageList_Draw_(hImageList32, InfosFile\iIcon, HDC, 17, 17, #ILD_TRANSPARENT) ; On dessine l'icône 32*32 à partir de l'ImageList 32*32
ReleaseDC_(0, HDC)
ImageGadget(0, 10, 10, 50, 50, UseImage(0))

; la c'est pour vérifier que le dessin marche bien avec un startdrawing de PB
CreateImage(1, 50, 50) ; On crée une image
HDC = StartDrawing(ImageOutput())
  ImageList_Draw_(hImageList16, InfosFile\iIcon, HDC, 1, 1, #ILD_TRANSPARENT) ; On dessine l'icône 16*16 à partir de l'ImageList 16*16
  ImageList_Draw_(hImageList32, InfosFile\iIcon, HDC, 17, 17, #ILD_TRANSPARENT) ; On dessine l'icône 32*32 à partir de l'ImageList 32*32
StopDrawing()
ImageGadget(1, 70, 10, 50, 50, UseImage(1))

Repeat
  Event = WaitWindowEvent()
  
  
  
Until Event = #PB_EventCloseWindow

End
Il me semblait avoir déjà vu la méthode ici mais pas moyen de mettre la main dessus :(
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Code : Tout sélectionner

hDC=GetDC_(0) 
Hbitmap=CreateCompatibleBitmap_(hDC,50,50)
hmemdc=CreateCompatibleDC_(hDC)
SelectObject_(hmemdc,Hbitmap) 
ImageList_Draw_(hImageList16, InfosFile\iIcon, hmemdc, 1, 1, #ILD_TRANSPARENT) 
ImageList_Draw_(hImageList32, InfosFile\iIcon, hmemdc, 17, 17, #ILD_TRANSPARENT)
Debug ReleaseDC_(0, hDC)
DeleteDC_(hmemdc)
ImageGadget(0, 10, 10, 50, 50, Hbitmap) 

; Noublie pas à la fin du progrmme
DeleteObject_(Hbitmap)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Merci

mon image existant déjà (c'est pour rajouter des icônes dessus), j'ai modifié comme ça :

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu 
; Version de PB : 3.9 
; 
; Explication du programme : 
; Dessiner une icône associée à un fichier 


; Création de la fenêtre et de la GadgetList 
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0 
  End 
EndIf 

; On récupère l'ImageList 
; C'est ici que ce fait le choix entre icône 16*16 (#SHGFI_SMALLICON) ou 32*32 (#SHGFI_LARGEICON) 
hImageList16.l = SHGetFileInfo_(0, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_SMALLICON) 
hImageList32.l = SHGetFileInfo_(0, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_SYSICONINDEX | #SHGFI_LARGEICON) 

IconPath.s = "C:\Windows\" 
SHGetFileInfo_(IconPath, 0, @InfosFile.SHFILEINFO, SizeOf(SHFILEINFO), #SHGFI_ICON) ; On récupère la position de l'icône dans l'ImageList 

; la je veux pour voir desiner sur une image en utilisant uniquement l'API 
; car j'ai besoin de 2 startdrawing en même temps, un dans le prog principale, l'autre dans un thread 
CreateImage(0, 50, 50) ; On crée une image 
StartDrawing(ImageOutput()) 
  Box(0, 0, 50, 50, GetSysColor_(#COLOR_3DFACE))
StopDrawing()

HDC = GetDC_(WindowID())
HCDC = CreateCompatibleDC_(HDC) 
SelectObject_(HCDC, UseImage(0))
  ImageList_Draw_(hImageList16, InfosFile\iIcon, HCDC, 1, 1, #ILD_TRANSPARENT) ; On dessine l'icône 16*16 à partir de l'ImageList 16*16 
  ImageList_Draw_(hImageList32, InfosFile\iIcon, HCDC, 17, 17, #ILD_TRANSPARENT) ; On dessine l'icône 32*32 à partir de l'ImageList 32*32 
ReleaseDC_(0, HDC) 
DeleteDC_(HCDC)
ImageGadget(0, 10, 10, 50, 50, UseImage(0)) 

; la c'est pour vérifier que le dessin marche bien avec un startdrawing de PB 
CreateImage(1, 50, 50) ; On crée une image 
StartDrawing(ImageOutput()) 
  Box(0, 0, 50, 50, GetSysColor_(#COLOR_3DFACE))
StopDrawing()

HDC = StartDrawing(ImageOutput()) 
  ImageList_Draw_(hImageList16, InfosFile\iIcon, HDC, 1, 1, #ILD_TRANSPARENT) ; On dessine l'icône 16*16 à partir de l'ImageList 16*16 
  ImageList_Draw_(hImageList32, InfosFile\iIcon, HDC, 17, 17, #ILD_TRANSPARENT) ; On dessine l'icône 32*32 à partir de l'ImageList 32*32 
StopDrawing() 
ImageGadget(1, 70, 10, 50, 50, UseImage(1)) 

Repeat 
  Event = WaitWindowEvent() 
  
  
  
Until Event = #PB_EventCloseWindow 

End
Il y a un truc que j'ai pas compris, pourquoi tu mets GetDC_(0) et pas GetDC(WindowID()) ?

Pour moi GetDC(0) renvoie le DC de l'écran
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre