pour faire un exemple de dessin dans la fenêtre child avec une partie du tracer caché
ou de charger une image dans la fenêtre child plus grande que la fenêtre parent.
ceci permet une ergonomie de manipulation click droit et d'intervention click gauche
on peut aussi utiliser le click molette "MBUTTON" pour garder le click droit en pop menu
Code : Tout sélectionner
; Version de PB : 4.30 et en ;;;; 420
:
; Auteur : Le Soldat Inconnu
;
; Explication du programme :
; Pour faire des programmes de test rapidement,
; il ne reste qu'a rajouter les gadgets et la gestion des évènements.
:
; Auteur : gnozal
; pour le mode deplacement fenetre child click droit
;
;
Global X_Depart.l, Y_Depart.l, X_Fin.l, Y_Fin.l
coBack1=255:coBack2=255:coBack3=255 ;fond blanc
cofront1=0:cofront2=0:cofront3=0 ;crayon
Procedure Cercle0()
x2 = Abs(Pow(X_Fin - X_Depart, 2))
y2 = Abs(Pow(Y_Fin- Y_Depart, 2))
Radius = Sqr(x2 + y2)
x2=X_Fin-X_Depart
y2=Y_Fin-Y_Depart
Circle(X_Depart,Y_Depart,1,RGB(cofront1,cofront2,cofront3))
Circle(X_Depart,Y_Depart,Radius,RGB(cofront1,cofront2,cofront3))
EndProcedure
Procedure line0()
LineXY(X_Depart, Y_Depart, X_Fin, Y_Fin, RGB(cofront1,cofront2,cofront3))
EndProcedure
; Création de la fenêtre et de la GadgetList
hWnd0=OpenWindow(0,0,0,600,400,"Parent",#PB_Window_SystemMenu | #PB_Window_ScreenCentered |#WS_CLIPCHILDREN)
; CreateGadgetList(WindowID(0)) ################# PB420
hBrush0 = CreateSolidBrush_(RGB(128, 128, 128))
SetClassLong_(hWnd0, #GCL_HBRBACKGROUND, hBrush0)
hWnd1=OpenWindow(1, 0, 0, 1200 , 800, "Child", #PB_Window_BorderLess|#PB_Window_Invisible)
; CreateGadgetList(WindowID(1)) ################# PB420
hBrush1 = CreateSolidBrush_(RGB(255, 255, 255))
SetClassLong_(hWnd1, #GCL_HBRBACKGROUND, hBrush1)
SetParent_(WindowID(1), WindowID(0))
CreateImage(0, WindowWidth(1),WindowHeight(1)) ; Image de ce qui est fixe
CreateImage(1, WindowWidth(1),WindowHeight(1)) ; image de ce qui est en cours dêtre dessiné
ImageGadget(0,0, 0, WindowWidth(1),WindowHeight(1), ImageID(1))
CopyImage(0,1)
StartDrawing(WindowOutput(1))
FillArea(0,0,RGB(coBack1,coBack2,coBack3), RGB(coBack1,coBack2,coBack3)) ;couleur de fond de l'image
StopDrawing()
HideWindow(1,0)
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventType()
Case #WM_LBUTTONDOWN
Case 0 ; Evenement sur l'image
; On commence le dessin
X_Depart = WindowMouseX(1)
Y_Depart = WindowMouseY(1)
Dessin_Commence = 1
EndSelect
Case #WM_MOUSEMOVE
If Dessin_Commence
StartDrawing(ImageOutput(1))
DrawingMode(4) ; obtenir un cercle ou autre cloture vide
DrawImage(ImageID(0), 0, 0)
FillArea(0,0,RGB(coBack1,coBack2,coBack3), RGB(coBack1,coBack2,coBack3)) ;couleur de fond de l'image
X_Fin = WindowMouseX(1)
Y_Fin = WindowMouseY(1)
;######### commandes dessin
Cercle0()
;line0()
;###########################
StopDrawing()
SetGadgetState(0, ImageID(1))
EndIf
Case #WM_LBUTTONUP ; On termine le dessin
Dessin_Commence = 0
; On redessine sur l'image 0 le dessin final
StartDrawing(ImageOutput(0))
DrawingMode(4) ; obtenir un cercle ou autre cloture vide
FillArea(0,0,RGB(coBack1,coBack2,coBack3), RGB(coBack1,coBack2,coBack3)) ;couleur de fond de l'image
X_Fin = WindowMouseX(1)
Y_Fin = WindowMouseY(1)
;######### dessin definif
Cercle0()
;line0()
;###########################
StopDrawing()
Case #WM_RBUTTONDOWN
GetWindowRect_(hWnd1, @Rectangle.RECT)
GetCursorPos_(@Curseur.POINT)
;If PtInRect_(@Rectangle, Curseur\x , Curseur\y) ; ################# PB420
If PtInRect_(@Rectangle, Curseur\y << 32 + Curseur\x) ; ################# PB430
GetWindowRect_(hWnd0, @Rectangle0.RECT)
; A adapter en fonction des caractéristiques de la fenêtre
RelX = Rectangle0\left - Rectangle\left + Curseur\x + GetSystemMetrics_(#SM_CXDLGFRAME)
RelY = Rectangle0\top - Rectangle\top + Curseur\y + GetSystemMetrics_(#SM_CYCAPTION) + GetSystemMetrics_(#SM_CXDLGFRAME)
WinX = Curseur\x - RelX
WinY = Curseur\y - RelY
ResizeWindow(1, WinX, WinY, #PB_Ignore, #PB_Ignore)
MovingWindow = #True
EndIf
Case #WM_RBUTTONUP
MovingWindow = #False
EndSelect
If MovingWindow
GetCursorPos_(@Curseur.POINT)
WinX = Curseur\x - RelX
WinY = Curseur\y - RelY
ResizeWindow(1, WinX, WinY, #PB_Ignore, #PB_Ignore)
EndIf
Until Event = #PB_Event_CloseWindow
End