Page 1 sur 1

Dessiner sur une image uniquement avec l'API

Publié : jeu. 03/févr./2005 0:13
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 :(

Publié : jeu. 03/févr./2005 18:52
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)

Publié : jeu. 03/févr./2005 19:03
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