code qui permet de capturer l'image de la fenêtre et les gadgets qui la composent
ces 2 codes ne sont pas portables, ils utilisent tout 2 des appels aux api de windows
si tu parviens à faire une capture d'écran portable tout OS, j'achète...
Code : Tout sélectionner
; fonctionne
Enumeration
#FEN_PRINCIPALE
#Gadget_button
#Gadget_string
#gadget_list
#Img_ZoneGraphique
#GDT_SCR_ZONE_DESSIN
#GDT_IMG_ZONE_DESSIN
EndEnumeration
Structure STRU_FENETRE
coord_X.w:coord_Y.w:Largeur.w:Hauteur.w
options.l
titre.s
Coord_X_Barre_chg_vue.w : Coord_Y_Barre_chg_vue.w
Largeur_Barre_chg_vue.w : Hauteur_Barre_chg_vue.w
Scr_Area_X.w:Scr_Area_Y.w:Scr_Area_Largeur.w:Scr_Area_Hauteur.w
Scr_Area_Largeur_Max.w : Scr_Area_Hauteur_Max.w
Scr_Area_deplacement.w
Scr_Area_options.l
EndStructure
Global INFO.STRU_FENETRE
Procedure.l capture_Gadget(PX.w,PY.w,PW.w,PH.w)
dm.DEVMODE ;structure for CreateDC()
srcDC.l
trgDC.l
BMPHandle.l
largeur_bordure_fenetre.w = GetSystemMetrics_(#SM_CXDLGFRAME)+GetSystemMetrics_(#SM_CXBORDER)
hauteur_bordure_fenetre.w = GetSystemMetrics_(#SM_CYDLGFRAME)+GetSystemMetrics_(#SM_CYMENUSIZE)+2*GetSystemMetrics_(#SM_CYBORDER)
srcDC = CreateDC_("DISPLAY", "", "", dm)
trgDC = CreateCompatibleDC_(srcDC)
BMPHandle = CreateCompatibleBitmap_(srcDC, PW, PH)
SelectObject_( trgDC, BMPHandle)
;BitBlt_( trgDC, 0, 0, PW, PH, srcDC, INFO\coord_X+largeur_bordure_fenetre+PX, INFO\coord_Y+PY+hauteur_bordure_fenetre, #SRCCOPY)
BitBlt_( trgDC, 0, 0, PW, PH, srcDC, largeur_bordure_fenetre+PX, PY+hauteur_bordure_fenetre, #SRCCOPY)
OpenClipboard_(#Null)
EmptyClipboard_()
SetClipboardData_(#CF_BITMAP , BMPHandle)
DeleteDC_( trgDC)
ReleaseDC_( BMPHandle, srcDC)
ciHwnd = GetClipboardData_(#CF_BITMAP)
If ciHwnd
GetObject_(ciHwnd, SizeOf(BITMAP), bm.BITMAP)
result.l = CreateImage(#PB_Any, PW, PH)
StartDrawing(ImageOutput(result))
DrawImage(ciHwnd, 0, 0)
StopDrawing()
EndIf
CloseClipboard_()
ProcedureReturn result
EndProcedure
Procedure.l capture_window(PX.w,PY.w,PW.w,PH.w)
dm.DEVMODE ;structure for CreateDC()
srcDC.l
trgDC.l
BMPHandle.l
largeur_bordure_fenetre.w = 2*GetSystemMetrics_(#SM_CXDLGFRAME)+2*GetSystemMetrics_(#SM_CXBORDER)
hauteur_bordure_fenetre.w = 2*GetSystemMetrics_(#SM_CYDLGFRAME)+3*GetSystemMetrics_(#SM_CYBORDER)+GetSystemMetrics_(#SM_CYMENUSIZE)
srcDC = CreateDC_("DISPLAY", "", "", dm)
trgDC = CreateCompatibleDC_(srcDC)
BMPHandle = CreateCompatibleBitmap_(srcDC, PW+largeur_bordure_fenetre, PH+hauteur_bordure_fenetre)
SelectObject_( trgDC, BMPHandle)
BitBlt_( trgDC, 0, 0, PW+largeur_bordure_fenetre, PH+hauteur_bordure_fenetre, srcDC, PX, PY, #SRCCOPY)
OpenClipboard_(#Null)
EmptyClipboard_()
SetClipboardData_(#CF_BITMAP , BMPHandle)
DeleteDC_( trgDC)
ReleaseDC_( BMPHandle, srcDC)
ciHwnd = GetClipboardData_(#CF_BITMAP)
If ciHwnd
GetObject_(ciHwnd, SizeOf(BITMAP), bm.BITMAP)
result.l = CreateImage(#PB_Any, PW+largeur_bordure_fenetre, PH+hauteur_bordure_fenetre)
StartDrawing(ImageOutput(result))
DrawImage(ciHwnd, 0, 0)
StopDrawing()
EndIf
CloseClipboard_()
ProcedureReturn result
EndProcedure
Procedure WindowCallback(WindowID, Message, lParam, wParam)
If Message = #WM_PAINT
StartDrawing(ImageOutput(WindowID))
DrawImage(ImageID(#Img_ZoneGraphique), 0, 0)
StopDrawing()
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
Procedure RedessineZoneGraphique()
couleur.w = $FF
If IsImage(#Img_ZoneGraphique)<>0
FreeImage(#Img_ZoneGraphique)
EndIf
If CreateImage(#Img_ZoneGraphique, INFO\Scr_Area_Largeur_Max,INFO\Scr_Area_Hauteur_Max)
StartDrawing(ImageOutput(#Img_ZoneGraphique))
Box(0,0,INFO\Scr_Area_Largeur_Max,INFO\Scr_Area_Hauteur_Max,RGB(128,128,128))
StopDrawing()
EndIf
EndProcedure
Procedure Draw_Window(PX.w,PY.w,Id_window.l)
StartDrawing(WindowOutput(#FEN_PRINCIPALE)) ; dessine l'image caturée...
DrawImage(ImageID(Id_window) , PX, PY)
StopDrawing()
EndProcedure
Procedure Draw_Gadget(PX.w,PY.w,Id_gadget.l)
StartDrawing(WindowOutput(#FEN_PRINCIPALE)) ; dessine l'image caturée...
DrawImage(ImageID(Id_gadget) , PX, PY)
StopDrawing()
EndProcedure
Procedure Open_FenetrePrincipale()
LB_quit.b = 0
LL_event.l = 0
INFO\coord_X = 100 : INFO\coord_Y = 100
INFO\Largeur = 400 : INFO\Hauteur = 400
INFO\options = #PB_Window_SystemMenu | #PB_Window_SizeGadget
INFO\titre = "RAD 0.1.5"
INFO\Scr_Area_X = 5 : INFO\Scr_Area_Y = 5
INFO\Scr_Area_Largeur = INFO\Largeur-INFO\Scr_Area_X : INFO\Scr_Area_Hauteur = INFO\Hauteur
INFO\Scr_Area_Largeur_Max = 1600 : INFO\Scr_Area_Hauteur_Max = 1200
INFO\Scr_Area_deplacement = 30
INFO\Scr_Area_options = #PB_ScrollArea_Single
If OpenWindow(#FEN_PRINCIPALE,INFO\coord_X,INFO\coord_Y,INFO\Largeur,INFO\Hauteur,INFO\titre,INFO\options)
If CreateGadgetList(WindowID(#FEN_PRINCIPALE))
col.w = 5 : lig.w = 5 : haut1.w = 20
ButtonGadget(#Gadget_button,10,20,80,20,"Bouton1")
StringGadget(#Gadget_string,10,50,120,20,"String1")
ListIconGadget(#gadget_list,10,70,200,200,"Essai",50)
;ScrollAreaGadget(#GDT_SCR_ZONE_DESSIN, INFO\Scr_Area_X, INFO\Scr_Area_Y,INFO\Scr_Area_Largeur,INFO\Scr_Area_Hauteur, INFO\Scr_Area_Largeur_Max, INFO\Scr_Area_Hauteur_Max,INFO\Scr_Area_deplacement ,INFO\Scr_Area_options)
;ImageGadget(#GDT_IMG_ZONE_DESSIN,0,0,INFO\Scr_Area_Largeur_Max,INFO\Scr_Area_Hauteur_Max,UseImage(#Img_ZoneGraphique))
;CloseGadgetList()
EndIf
INFO\coord_X = WindowX(#FEN_PRINCIPALE) : INFO\coord_Y = WindowY(#FEN_PRINCIPALE)
;capture_Gadget(0,0,80,20)
;HideGadget(#Gadget_button,1)
LB_quit = 0
Repeat
LL_event = WaitWindowEvent()
Select LL_event
Case #PB_Event_Gadget
Select EventGadget()
Case #Gadget_button
gadget1.l = capture_Gadget(INFO\coord_X+10,INFO\coord_Y+20,80,20)
HideGadget(#Gadget_button,1)
gadget2.l = capture_Gadget(INFO\coord_X+10,INFO\coord_Y+50,120,20)
HideGadget(#Gadget_string,1)
gadget3.l = capture_Gadget(INFO\coord_X+10,INFO\coord_Y+70,200,200)
HideGadget(#gadget_list,1)
fenetre1.l = capture_window(INFO\coord_X,INFO\coord_Y,INFO\Largeur,INFO\Hauteur)
ResizeWindow(#FEN_PRINCIPALE,-1,-1,INFO\Largeur+50,INFO\Hauteur+70)
Draw_Window(25,25,fenetre1)
Draw_Gadget(25+5,25+25,gadget1)
Draw_Gadget(25+15,25+45,gadget2)
Draw_Gadget(25+25,25+65,gadget1)
Draw_Gadget(25+25,25+105,gadget3)
EndSelect
Case #PB_Event_CloseWindow
LB_quit = 2
EndSelect
Until LB_quit > 0
EndIf
EndProcedure
Open_FenetrePrincipale()
; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 56
; FirstLine = 52
; Folding = -