Code : Tout sélectionner
Enumeration
#WND_MAIN
#DLG_MAIN_BUTCAPTURE
#DLG_MAIN_POPUP
#DLG_MAIN_POPUP_SAUVEBMP
#DLG_MAIN_POPUP_SAUVEJPG
#DLG_MAIN_POPUP_SAUVZON
#DLG_MAIN_POPUP_RECOMM
#DLG_MAIN_POPUP_QUITTER
EndEnumeration
Structure STRU_zone_rect
xdep.w
ydep.w
xfin.w
yfin.w
Width.w
Height.w
ImageCourante.w
EndStructure
Global WinWidth.w
Global WinHeight.w
Global sur_demande.b
Global zone_ecran.b
Global FlagCapture.b
Global Mx.w
Global My.w
Global zone_rect.STRU_zone_rect
Global debut_rect.b
Procedure drawLocalPointAs(cx.w,cy.w)
If StartDrawing(WindowOutput(#WND_MAIN))
FrontColor(RGB(238, 0, 0))
LineXY(cx-2,cy,cx+2,cy)
LineXY(cx,cy-2,cx,cy+2)
FrontColor(RGB(28, 53, 210))
StopDrawing()
EndIf
EndProcedure
Procedure rectangleElastique(x1.w,y1.w,x2.w,y2.w,cas.b)
StartDrawing(WindowOutput(#WND_MAIN))
DrawingMode(cas)
LineXY(x1,y1,x2,y1)
LineXY(x2,y1,x2,y2)
LineXY(x2,y2,x1,y2)
LineXY(x1,y2,x1,y1)
If cas=2
Delay(10)
LineXY(x1,y1,x2,y1)
LineXY(x2,y1,x2,y2)
LineXY(x2,y2,x1,y2)
LineXY(x1,y2,x1,y1)
EndIf
StopDrawing()
EndProcedure
Procedure CaptureScreen(left.l, top.l, Width.l, Height.l)
dm.DEVMODE ;structure for CreateDC()
srcDC.l
trgDC.l
BMPHandle.l
srcDC = CreateDC_("DISPLAY", "", "", dm)
trgDC = CreateCompatibleDC_(srcDC)
BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height)
SelectObject_( trgDC, BMPHandle)
BitBlt_( trgDC, 0, 0, Width, Height, srcDC, left, top, #SRCCOPY)
OpenClipboard_(#Null)
EmptyClipboard_()
SetClipboardData_(2, BMPHandle)
;CloseClipboard_()
DeleteDC_( trgDC)
ReleaseDC_( BMPHandle, srcDC)
ProcedureReturn
EndProcedure
Procedure Initialisation()
WinWidth = GetSystemMetrics_(#SM_CXFULLSCREEN)
WinHeight = GetSystemMetrics_(#SM_CYFULLSCREEN)
FlagCapture = 0
debut_rect = 0
ImageCourante = 0
; result = OpenPreferences("PhotoGraph.prefs") : Debug result
; sur_demande = ReadPreferenceLong("SUR DEMANDE",1)
; zone_ecran = ReadPreferenceLong("ZONE ECRAN",0)
; ClosePreferences()
; If result = 0 ; crée le fichier préférence
; result = CreatePreferences("PhotoGraph.prefs") : Debug result
; WritePreferenceLong("SUR DEMANDE",sur_demande)
; WritePreferenceLong("ZONE ECRAN",zone_ecran)
; ClosePreferences()
; EndIf
EndProcedure
Procedure main_window()
If OpenWindow(#WND_MAIN, 0, 0, 150, 25,"Capture d'écran v0.4b",#PB_Window_SystemMenu | #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
If CreatePopupMenu(#DLG_MAIN_POPUP)
MenuItem(#DLG_MAIN_POPUP_SAUVEBMP,"Sauver en BMP")
MenuItem(#DLG_MAIN_POPUP_SAUVEJPG,"Sauver en JPG")
MenuItem(#DLG_MAIN_POPUP_SAUVZON,"Découper zone")
MenuItem(#DLG_MAIN_POPUP_RECOMM,"Recommencer")
MenuBar()
MenuItem(#DLG_MAIN_POPUP_QUITTER,"Quitter")
EndIf
If CreateGadgetList(WindowID(#WND_MAIN))
ButtonGadget(#DLG_MAIN_BUTCAPTURE,0,0,150,25,"Capturer l'écran")
EndIf
Repeat
EventID.l = WaitWindowEvent()
Mx = WindowMouseX(#WND_MAIN)-4 : My = WindowMouseY(#WND_MAIN)-22
Select EventID
Case #WM_RBUTTONDOWN
DisplayPopupMenu(#DLG_MAIN_POPUP,WindowID(#WND_MAIN))
Case #WM_LBUTTONDOWN
Select debut_rect
Case 1
zone_rect\xdep = Mx
zone_rect\ydep = My
drawLocalPointAs(zone_rect\xdep,zone_rect\ydep)
debut_rect = 2
Case 2
zone_rect\xfin = Mx
zone_rect\yfin = My
rectangleElastique(zone_rect\xdep,zone_rect\ydep,zone_rect\xfin,zone_rect\yfin,0)
debut_rect = 0
If zone_rect\xfin<zone_rect\xdep
tmp = zone_rect\xfin
zone_rect\xfin = zone_rect\xdep
zone_rect\xdep = tmp
EndIf
If zone_rect\yfin<zone_rect\ydep
tmp = zone_rect\yfin
zone_rect\yfin = zone_rect\ydep
zone_rect\ydep = tmp
EndIf
zone_rect\Width = zone_rect\xfin-zone_rect\xdep
zone_rect\Height = zone_rect\yfin-zone_rect\ydep
CreateImage(1, zone_rect\Width, zone_rect\Height)
ImageCourante = 1
GrabImage(0,1,zone_rect\xdep,zone_rect\ydep,zone_rect\Width,zone_rect\Height)
StartDrawing(WindowOutput(#WND_MAIN)) ; dessine l'image caturée...
DrawImage(ImageID(1) , 0, 0)
StopDrawing()
ResizeWindow(#WND_MAIN,(WinWidth/2)-(zone_rect\Width/2),(WinHeight/2)-(zone_rect\Height/2),zone_rect\Width,zone_rect\Height)
EndSelect
Case #WM_MOUSEMOVE
If debut_rect = 2
rectangleElastique(zone_rect\xdep,zone_rect\ydep,Mx,My,2)
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case #DLG_MAIN_POPUP_SAUVEBMP
NomFichier$ = SaveFileRequester("Emplacement de l'image","*.bmp","Fichiers Bitmap|*.bmp",0)
SaveImage(ImageCourante,NomFichier$,#PB_ImagePlugin_BMP )
Case #DLG_MAIN_POPUP_SAUVEJPG
NomFichier$ = SaveFileRequester("Emplacement de l'image","*.jpg","Fichiers JPEG|*.jpg",0)
UseJPEGImageEncoder()
SaveImage(ImageCourante,NomFichier$,#PB_ImagePlugin_JPEG )
Case #DLG_MAIN_POPUP_SAUVZON
debut_rect = 1
Case #DLG_MAIN_POPUP_RECOMM
FlagCapture = 0 ; empèche l'appel à #PB_EventRepaint
ImageCourante = 0
HideMenu(#DLG_MAIN_POPUP,1)
ResizeWindow(#WND_MAIN,WinWidth-100, WinHeight-25,100,25)
HideGadget( #DLG_MAIN_BUTCAPTURE,0) ; montre le bouton
Case #DLG_MAIN_POPUP_QUITTER
Quit = 1
EndSelect
Case #PB_Event_Repaint ;; au cas ou la fenetre est cachée permet de réafficher l'image
If FlagCapture = 1
StartDrawing(WindowOutput(#WND_MAIN)) ; dessine l'image caturée...
DrawImage(ImageID(ImageCourante) , 0, 0)
StopDrawing()
EndIf
Case #PB_Event_Gadget
Select EventGadget()
Case #DLG_MAIN_BUTCAPTURE
HideGadget( #DLG_MAIN_BUTCAPTURE,1) ; cache le bouton
HideWindow(#WND_MAIN,1) ; cache fenetre avec le bouton
CaptureScreen(0,0,WinWidth,WinHeight) ; capture l'écran
ciHwnd = GetClipboardData_(#CF_BITMAP)
If ciHwnd
GetObject_(ciHwnd, SizeOf(BITMAP), bm.BITMAP)
CreateImage(0, WinWidth, WinHeight)
StartDrawing(ImageOutput(#WND_MAIN))
DrawImage(ciHwnd, 0, 0)
StopDrawing()
EndIf
ResizeWindow(#WND_MAIN,0,0,WinWidth,WinHeight) ; redimensionne la fenetre avec le bouton
HideWindow(#WND_MAIN,0) ; montre la fenêtre
StartDrawing(WindowOutput(#WND_MAIN)) ; dessine l'image caturée...
DrawImage(ImageID(0) , 0, 0)
StopDrawing()
FlagCapture = 1
DisplayPopupMenu(#DLG_MAIN_POPUP,WindowID(#WND_MAIN),WinWidth/2,WinHeight/2)
EndSelect
Case #PB_Event_CloseWindow ; If the user has pressed on the close button
Quit = 1
EndSelect
Until Quit <> 0
EndIf
EndProcedure
Initialisation()
main_window()
End
Venom a plus qu'à s'en inspirer pour parfaire son prog. Nico en avait fait un très bien aux fonctions biens pensées et gérées il y a quelques temps, et qui m'avait servi au boulot pour extraire des photos d'une vidéo en image par image. Je ne sais où il est casé mais en cherchant bien il doit pas être loin