Code : Tout sélectionner
Procedure NouvelleProc( hWnd, Msg, wParam, lParam)
Protected OriginProc.l,hdc.l,hpen.l,Old_Pen.l,Width.l,Height.l,result.l
Protected Dim PointXY.POINT(4),Rect.RECT
;Ici on récupère l'adresse d'origine de la procédure grâce à la
;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre
;voir la fonction SetProp_(...).
OriginProc= GetProp_(hWnd, "OriginProc")
Select Msg
Case #WM_NCPAINT
; j'appelle la procédure d'origine pour qu'elle dessine les ascenceurs
; elle va aussi dessiner une bordure noir, mais on va redessiner celle-ci
result=CallWindowProc_(OriginProc,hWnd,Msg,wParam,lParam)
; On récupère les dimensions du Gadget
GetWindowRect_(hWnd,@Rect.RECT)
Width=Rect\right-Rect\left
Height=Rect\Bottom-Rect\top
; On crée une suite de points qui servira à la fonction Polyline
; pour dessiner un rectangle avec la couleur du Pen créé
PointXY(0)\X=0:PointXY(0)\Y=0
PointXY(1)\X=Width-1:PointXY(1)\Y=0
PointXY(2)\X=Width-1:PointXY(2)\Y=Height-1
PointXY(3)\X=0:PointXY(3)\Y=Height-1
PointXY(4)\X=0:PointXY(4)\Y=0
; On récupère le Hdc du Gadget
hdc = GetWindowDC_(hwnd)
; on crée un Pen et on l'associe au Hdc
hpen=CreatePen_(#PS_SOLID, 1, RGB(0,0,255))
Old_Pen=SelectObject_(hdc,hpen)
; On dessine le rectangle
Polyline_(hdc, @PointXY(0), 5)
; On remet l'ancien Pen au Hdc
SelectObject_(hdc,Old_Pen)
; On détruit notre Pen
DeleteObject_(hpen)
; On libère le Hdc
ReleaseDC_(hwnd,hdc)
ProcedureReturn result
Case #WM_NCDESTROY
;Remettre la procédure d'origine
SetWindowLong_(hWnd, #GWL_WNDPROC, OriginProc)
;Supprimer la donnée associée à la fenêtre.
RemoveProp_(hWnd,"OriginProc")
EndSelect
;On renvoie tous les autres évènements à la procédure d'origine.
ProcedureReturn CallWindowProc_(OriginProc,hWnd,Msg,wParam,lParam)
EndProcedure
If OpenWindow(0, 0, 0, 320, 170, "EditorGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CreateGadgetList(WindowID(0))
EditorGadget(0, 10, 10, 300, 150)
For a = 0 To 20
AddGadgetItem(0, a, "Ligne "+Str(a))
Next
; On retire la bordure CLIENTEDGE du Gadget
SetWindowLong_(GadgetID(0),#GWL_EXSTYLE,GetWindowLong_(GadgetID(0),#GWL_EXSTYLE) & ~ #WS_EX_CLIENTEDGE)
; On lui met une bordure simple
SetWindowLong_(GadgetID(0),#GWL_STYLE,GetWindowLong_(GadgetID(0),#GWL_STYLE) | #WS_BORDER)
; On force le gadget à se redessiner
SetWindowPos_(GadgetID(0),0,0,0,0,0,#SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)
;Avec cette fonction, on récupère l'adresse d'origine de la procédure
;pour ensuite la restituer, une fois le traitement terminé.
OriginProc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @NouvelleProc())
;Cette fonction est très utile car elle permet d'associer une nouvelle donnée
;à n'importe quelles fenêtres créées en utlisant une chaine de caractère pour
;l'identification; ça évite d'utiliser une valeur globale.
;Ici on associe la valeur OriginProc identifiée par la chaine "OriginProc"
;au StringGadget
SetProp_(GadgetID(0), "OriginProc", OriginProc)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf