[VB] Grijs checkbox in treeview

Pagina: 1
Acties:

  • sewer
  • Registratie: November 2000
  • Nu online
Ik wil in Visual Basic een grijs checkbox in mijn treeview, zoals in onderstaand plaatje.

Afbeeldingslocatie: http://members.home.nl/ralph74/treeview.jpg
Bij de nodes waar enkele (maar niet alle) children zijn aangevinkt moet dus een grijs aangevinkt checkbox komen te staan. Helaas kan je bij de standaard treeview in VB per node alleen maar instellen of hij gechecked is of niet.

Dus toen bedacht ik me dat ik maar zelf zo'n checkboxje erover heen teken. Ik heb het form waar de treeview gesubclassed naar een module en daar de de windowsmessage WM_NOTIFY opgevangen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Dim tMessage As NMHDR
    Dim lCode As Long
    Dim tTVRedrawMessage As NMTVCUSTOMDRAW
    
    Dim objRect As RECT
    
    'Abort this function if the windowsmessage is not WM_NOTIFY
    If Msg <> WM_NOTIFY Then
     SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
     Exit Function
    End If
    
    
    CopyMemory tMessage, ByVal lp, Len(tMessage)
    lCode = tMessage.code

Vervolgens wil ik ingrijpen bij NM_CustomDraw, en zelf maar wat tekenen via DrawFrameControl. Volgens mij moet dat in de CDDS_ITEMPOSTPAINT (toch :?)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    Select Case lCode
      Case NM_CUSTOMDRAW
        CopyMemory tTVRedrawMessage, ByVal lp, Len(tTVRedrawMessage)
        
        Select Case tTVRedrawMessage.nmcmd.dwDrawStage
          Case CDDS_PREPAINT
            SubClass1_WndMessage = CDRF_NOTIFYITEMDRAW
            Exit Function
          Case CDDS_POSTPAINT
            SubClass1_WndMessage = CDRF_NOTIFYITEMDRAW
            Exit Function
          Case CDDS_ITEMPREPAINT
            'do nothing?
          Case CDDS_ITEMPOSTPAINT
            objRect.Top = tTVRedrawMessage.nmcmd.rc.Top
            objRect.Left = tTVRedrawMessage.nmcmd.rc.Left
            objRect.Bottom = tTVRedrawMessage.nmcmd.rc.Top + 15
            objRect.Right = TVRedrawMessage.nmcmd.rc.Top + 15
            DrawFrameControl tTVRedrawMessage.nmcmd.hDC, objRect, DFC_BUTTON, DFCS_BUTTONPUSH
          Case Else
            SubClass1_WndMessage = CDRF_DODEFAULT
            Exit Function
        End select
      Case Else 'Not NM_CUSTOMDRAW
        SubClass1_WndMessage = CallWindowProc(OldWindowProc, hwnd, Msg, wp, lp)
    End Select

Mijn probleem is dat ik helemaal geen CDDS_POSTPAINT en CDDS_ITEMPOSTPAINT messages krijg van mijn treeview, alleen maar CDDS_PREPAINT en CDDS_ITEMPREPAINT :? Maar als ik wat teken bij CDDS_ITEMPREPAINT dan wordt dat daarna meteen overschreven met datgene wat de treeview-control wilt tekenen. Dus die prepaint kan ik volgens mij niet gebruiken. Iemand een idee?

  • sewer
  • Registratie: November 2000
  • Nu online
Ben eruit :)

Het lag er aan dat ik bij CDDS_ITEMPREPAINT helemaal geen message meer terugstuurde |:( Nu ik CDRF_NOTIFYPOSTPAINT terug geef krijg ik wel mooi een CDDS_ITEMPOSTPAINT message :)

Daarna is het makkelijk, gewoon een checked grijs checkbox tekenen:
DrawFrameControl tTVRedrawMessage.nmcmd.hDC, objRect, DFC_BUTTON, (DFCS_INACTIVE Or DFCS_FLAT Or DFCS_BUTTONCHECK Or DFCS_CHECKED)

Zit alleen nog even te pielen om te bepalen waar die checkboxjes precies staan in de treeview (dat is bijv. afhankelijk van hoe lang de stippelijntjes gedefinieerd zijn (indentation) en op welk niveau ik in de treeview zit). Maar dat gaat wel lukken, eerst :Z