Dessiner la bordure d'un EditorGadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Dessiner la bordure d'un EditorGadget

Message par nico »

Par défaut, l'EditorGadget à une bordure en 3D (Sous XP c'est moche, tous les autres gadgets ont une bordure simple), le code change le style en lui appliquant une bordure simple et redessine celui-ci qui est normalement noir.

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