dessiner sois meme les gadget

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

dessiner sois meme les gadget

Message par cederavic »

ce qui est bien, c'est que l'on peut dessiner sois meme les gadget, ce qui est ch*** c'est qu'il faut "controler" les evenement des gadget sois meme, tout ce passe dan le callback. j'ai fait une dll en C qui permet de convertir le type lparam en DRAWITEMSTRUCT (car pb nous le renvoi en long donc impossible de recuperer les info nessecaire) voilas les fonctions de la dll elle renvoi le contenu des champs de DRAWITEMSTRUCT:
HDC GetOwnControlhDC(lparam);
UINT GetOwnControlCtlType(lparam);
UINT GetOwnControlCtlID(lparam);
UINT GetOwnControlitemID(lparam);
UINT GetOwnControlitemAction(lparam);
UINT GetOwnControlitemState(lparam);
HWND GetOwnControlhwndItem(lparam);
RECT GetOwnControlrcItem(lparam);
DWORD GetOwnControlitemData(lparam);
que vous pouvez telecharger ici : www.serveurperso.com/~cederavic/OwnControl.dll

et voilas le code d'example :

Code : Tout sélectionner

Declare wincb(hWnd, uMsg, wParam, lParam)

Global buttonevent : buttonevent = -1; pour savoir si le bouton a ete cliquer

hb = CreateSolidBrush_(RGB(170, 150, 255))
hb2 = CreateSolidBrush_(RGB(200, 180, 255))
fnt = CreateFont_(10, 10, 0, 0, 900, #false, #false, #false, #ANSI_CHARSET, #OUT_DEFAULT_PRECIS, #CLIP_DEFAULT_PRECIS , #DEFAULT_QUALITY , #DEFAULT_PITCH, "Courier")
hwnd = OpenWindow(0, 0, 0, 400, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "MFC Custom Control")

  SetWindowCallback(@wincb())
  CreateGadgetList(hwnd)
    ButtonGadget(0, 10, 10, 100, 50, "Button", #BS_OWNERDRAW) ; bs_ownerdraw dit a windows que c'est nous qui dessinon le bouton
    
    OpenLibrary(0, "OwnControl.dll")

Repeat

  wevent = WindowEvent()
  
  Select buttonevent
    Case #BN_CLICKED ; simple click
      Debug "Le bouton à été cliqué"
      buttonevent = -1 
    Default
      buttonevent = -1
  EndSelect
  

Until wevent = #WM_Close

Procedure wincb(hWnd, uMsg, wParam, lParam)

Static hb, hb2, fnt

  Select uMsg
  
    Case #WM_DRAWITEM
      hb = CreateSolidBrush_(RGB(170, 150, 255)) ; creer le brush 1
      hb2 = CreateSolidBrush_(RGB(200, 180, 255)) ; creer le brush 2
      fnt = CreateFont_(10, 10, 0, 0, 900, #false, #false, #false, #ANSI_CHARSET, #OUT_DEFAULT_PRECIS, #CLIP_DEFAULT_PRECIS , #DEFAULT_QUALITY , #DEFAULT_PITCH, "Courier") ; creer la font
      hdc = CallCFunction(0, "GetOwnControlhDC", lParam) ; recupere le dc
      rect.RECT : rect\left = 0 : rect\Top = 0 : rect\right = 100 : rect\bottom = 50
      stat = CallCFunction(0, "GetOwnControlitemState", lParam) ; recupere l'etat
      If stat = 17
        SelectObject_(hdc, hb)
        SetBkMode_(hdc, #TRANSPARENT)
        RoundRect_(hdc, 0, 0, 100, 50, 40, 40)
      Else
        SelectObject_(hdc, hb2)
        SetBkMode_(hdc, #TRANSPARENT)
        RoundRect_(hdc, 0, 0, 100, 50, 40, 40)
      EndIf
      
      SelectObject_(hdc, fnt)
      SetBkMode_(hdc, #TRANSPARENT)
      DrawText_(hdc, GetGadgetText(0), Len(GetGadgetText(0)), @rect, #DT_CENTER | #DT_VCENTER)
      
      DeleteObject_(hb)
      DeleteObject_(hb2)
      DeleteObject_(fnt)
      
    Case #WM_COMMAND 
      Select wParam
        Case #BN_CLICKED ; simple click
          buttonevent = #BN_CLICKED 
          
      EndSelect
      
  EndSelect

  ProcedureReturn DefWindowProc_(hWnd, uMsg, wParam, lParam)
EndProcedure
voilas de quoi vous amuser :) je sais je sais, c'est pas tres bien commenté... mais le code y est :p
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

je pense faire une dll qui gere le callback tout seul, il suffira jute d'envoi un pointeur vers un proc ki dessinera vos gadget... mais seulement si vous etes sage :p
KarLKoX
Messages : 1191
Inscription : jeu. 26/févr./2004 15:36
Localisation : France
Contact :

Re: dessiner sois meme les gadget

Message par KarLKoX »

cederavic a écrit :j'ai fait une dll en C qui permet de convertir le type lparam en DRAWITEMSTRUCT (car pb nous le renvoi en long donc impossible de recuperer les info nessecaire)
Euh, pb gère ca sans problème avec un *myDrawItem.DRAWITEMSTRUCT = lparam
"Qui baise trop bouffe un poil." P. Desproges
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

8O le pir c'est que j'ai essayer plein de fois, et j'y suis jamais arriver... je vient d'essayer la et effectivement la ça marche... :mad: bo c'est pas grave, je peut toujours faire ce que j'ai dit avant :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Tu sais que ça ne marchera pas avec Window XP, il te faudra faire une deuxième procédure pour que ça fonctionne avec les Thèmes!
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

j'ai pa windows XP, et j'ai HORREUR de lui :P donc je peut pas esssayer
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

:oops: en fait, c'est seulement vrai si tu dessines un réel boutton......

donc ça marche bien :)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

ah tan mieu :D
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

voila le code modifier, et meme pas besoin de gerer les evenement dans le callback, suffit dutiliser les commande de PB! il y a 1 bouton et 1 combobox, ce truc est tout simplement GENIAL!!!! je vais faire un exemple pour touts les control :)

Code : Tout sélectionner

Declare wincb(hWnd, uMsg, wParam, lParam)
Declare OwnDrawProc(CtlType, CtlID, itemID, itemAction, itemState, hwndItem, hDC, rcItem, itemData)

Global *oldcb

hwnd = OpenWindow(0, 0, 0, 400, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "MFC Custom Control")

  *oldcb = SetWindowLong_(hwnd, #GWL_WNDPROC, @wincb())
  CreateGadgetList(hwnd)
    ButtonGadget(0, 10, 10, 100, 50, "Button", #BS_OWNERDRAW)
    ComboBoxGadget(1, 10, 100, 100, 500, #CBS_OWNERDRAWFIXED)
      AddGadgetItem(1, -1, "test1")
      AddGadgetItem(1, -1, "test2")
      AddGadgetItem(1, -1, "test3")
      AddGadgetItem(1, -1, "test4")

Repeat

  wevent = WindowEvent()
  
  Select wevent
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case 0
          Debug "bouton"
          
        Case 1
          Debug "combobox"
      EndSelect
  EndSelect

Until wevent = #WM_Close

Procedure wincb(hWnd, uMsg, wParam, lParam)



  Select uMsg
  
    Case #WM_DRAWITEM
      *drawitem.DRAWITEMSTRUCT = lParam
      res = OwnDrawProc(*drawitem\CtlType, *drawitem\CtlID, *drawitem\itemID, *drawitem\itemAction, *drawitem\itemState, *drawitem\hwndItem, *drawitem\hDC, *drawitem\rcItem, *drawitem\itemData)
      
  EndSelect
  
  res = CallFunctionFast(*oldcb, hWnd, uMsg, wParam, lParam)
  ProcedureReturn res
EndProcedure

Procedure OwnDrawProc(CtlType, CtlID, itemID, itemAction, itemState, hwndItem, hDC, rcItem, itemData)
  Select CtlType
      
    Case #ODT_BUTTON   ;Owner-drawn button
      If itemState = 17
        For x = 0 To 100
          M=(50-X)
          hb3 = CreatePen_(#PS_SOLID, 1, RGB((170*M+200*X)/50,(150*M+180*X)/50,(255*M+255*X)/50))

          SelectObject_(hdc, hb3)
          MoveToEx_(hdc, x, 0, #NULL)
          LineTo_(hdc, x, 50)
          DeleteObject_(hb3)
        Next
        hb3 = CreatePen_(#PS_SOLID, 1, RGB(80, 80, 80))
        SelectObject_(hdc, hb3)
        MoveToEx_(hdc, 0, 0, 0) : LineTo_(hdc, 99, 0)
        MoveToEx_(hdc, 0, 49, 0) : LineTo_(hdc, 99, 49)
        MoveToEx_(hdc, 0, 0, 0) : LineTo_(hdc, 0, 49)
        MoveToEx_(hdc, 99, 0, 0) : LineTo_(hdc, 99, 50)
        DeleteObject_(hb3)
      Else
        For x = 0 To 100
          M=(50-X)
          hb3 = CreatePen_(#PS_SOLID, 1, RGB((200*M+170*X)/50,(180*M+150*X)/50,(255*M+255*X)/50))

          SelectObject_(hdc, hb3)
          MoveToEx_(hdc, x, 0, #NULL)
          LineTo_(hdc, x, 50)
          DeleteObject_(hb3)
        Next
        hb3 = CreatePen_(#PS_SOLID, 1, RGB(80, 80, 80))
        SelectObject_(hdc, hb3)
        MoveToEx_(hdc, 0, 0, 0) : LineTo_(hdc, 99, 0)
        MoveToEx_(hdc, 0, 49, 0) : LineTo_(hdc, 99, 49)
        MoveToEx_(hdc, 0, 0, 0) : LineTo_(hdc, 0, 49)
        MoveToEx_(hdc, 99, 0, 0) : LineTo_(hdc, 99, 50)
        DeleteObject_(hb3)
      
      EndIf
      rect.RECT : rect\left = 0 : rect\Top = 0 : rect\right = 100 : rect\bottom = 50
      fnt = CreateFont_(10, 10, 0, 0, 900, #false, #false, #false, #ANSI_CHARSET, #OUT_DEFAULT_PRECIS, #CLIP_DEFAULT_PRECIS , #DEFAULT_QUALITY , #DEFAULT_PITCH, "Courier")
      SelectObject_(hdc, fnt)
      SetBkMode_(hdc, #TRANSPARENT)
      text.s = GetGadgetText(0)
      DrawText_(hdc, @text, Len(text), @rect, #DT_CENTER | #DT_VCENTER)
      DeleteObject_(fnt)
      
    Case #ODT_COMBOBOX ;Owner-drawn combo box
      
      If itemAction = #ODA_SELECT 
        If itemState <> #ODS_SELECTED
          *rect.RECT = rcItem
          xt = *rect\left
          y = *rect\Top
          ty = *rect\bottom
          tx = *rect\right
          For x = xt To tx
            M=(tx-X)
            hp = CreatePen_(#PS_SOLID, 1, RGB((170*M+220*X)/tx,(150*M+200*X)/tx,(255*M+255*X)/tx))
            SelectObject_(hdc, hp)
              MoveToEx_(hdc, x, y, #NULL)
              LineTo_(hdc, x, ty)
            DeleteObject_(hp)
          Next
          fnt = CreateFont_(10, 10, 0, 0, 900, #false, #false, #false, #ANSI_CHARSET, #OUT_DEFAULT_PRECIS, #CLIP_DEFAULT_PRECIS , #DEFAULT_QUALITY , #DEFAULT_PITCH, "Courier")
          SelectObject_(hdc, fnt)
          SetBkMode_(hdc, #TRANSPARENT)
          text.s = GetGadgetItemText(1, itemID, 0)
          SetTextColor_(hdc, RGB(180, 80, 60))
          DrawText_(hdc, @text, Len(text), rcItem, #DT_CENTER | #DT_VCENTER)
          DeleteObject_(fnt)
        Else
          hb = CreateSolidBrush_(RGB(120, 100, 200))
          *rect.RECT = rcItem
          SelectObject_(hdc, hb)
          RoundRect_(hdc, *rect\left + 10, *rect\Top, *rect\right - 10, *rect\bottom, 10, 10)
          DeleteObject_(hb)
          fnt = CreateFont_(10, 10, 0, 0, 200, #false, #false, #false, #ANSI_CHARSET, #OUT_DEFAULT_PRECIS, #CLIP_DEFAULT_PRECIS , #DEFAULT_QUALITY , #DEFAULT_PITCH, "Courier")
          SelectObject_(hdc, fnt)
          SetBkMode_(hdc, #TRANSPARENT)
          text.s = GetGadgetItemText(1, itemID, 0)
          SetTextColor_(hdc, RGB(180, 220, 150))
          DrawText_(hdc, @text, Len(text), rcItem, #DT_CENTER | #DT_VCENTER)
          DeleteObject_(fnt)
        EndIf
      ElseIf itemAction = #ODA_DRAWENTIRE 
        *rect.RECT = rcItem
        xt = *rect\left
        y = *rect\Top
        ty = *rect\bottom
        tx = *rect\right
        For x = xt To tx
          M=(tx-X)
          hp = CreatePen_(#PS_SOLID, 1, RGB((170*M+220*X)/tx,(150*M+200*X)/tx,(255*M+255*X)/tx))
          SelectObject_(hdc, hp)
            MoveToEx_(hdc, x, y, #NULL)
            LineTo_(hdc, x, ty)
          DeleteObject_(hp)
        Next
        fnt = CreateFont_(10, 10, 0, 0, 900, #false, #false, #false, #ANSI_CHARSET, #OUT_DEFAULT_PRECIS, #CLIP_DEFAULT_PRECIS , #DEFAULT_QUALITY , #DEFAULT_PITCH, "Courier")
        SelectObject_(hdc, fnt)
        SetBkMode_(hdc, #TRANSPARENT)
        text.s = GetGadgetItemText(1, itemID, 0)
        SetTextColor_(hdc, RGB(180, 80, 60))
        DrawText_(hdc, @text, Len(text), rcItem, #DT_CENTER | #DT_VCENTER)
        DeleteObject_(fnt)
      EndIf
      
          
    Case #ODT_LISTBOX  ;Owner-drawn list box
          Debug "listbox"
          
    Case #ODT_LISTVIEW ;List view control
          Debug "listview"
          
    Case #ODT_MENU     ;Owner-drawn menu item
          Debug "menu"
          
    Case #ODT_TAB      ;Tab control
          Debug "tab"
      
  EndSelect
  
  ProcedureReturn DefWindowProc_(hWnd, uMsg, wParam, lParam)
EndProcedure
Répondre