Ik wil in Visual Basic een grijs checkbox in mijn treeview, zoals in onderstaand plaatje.

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:
Vervolgens wil ik ingrijpen bij NM_CustomDraw, en zelf maar wat tekenen via DrawFrameControl. Volgens mij moet dat in de CDDS_ITEMPOSTPAINT (toch
)
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?

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