CustomDraw with TreeViews

This is the forum for miscellaneous technical/programming questions.

Moderator: 2ffat

CustomDraw with TreeViews

Postby greg221b » Thu Sep 09, 2004 10:30 pm

Hi -
I'm trying to change the foreground colour of items in a tree view using CustomDraw.
I capture the CDDS_PREPAINT drawstage - and set msg.Result = CDRF_NOTIFYITEMDRAW and dispatch this to the parent form.
However, no following interaction with the tree view results in a CDDS_ITEMPREPAINT drawstage being generated - hence I'm unable to do anything. :(
If anyone could help me understand this I'd be eternally thankful -
Greg.
greg221b
 

Postby Damon » Sat Sep 11, 2004 9:26 am

Hi Greg,
The CDDS_ITEMPREPAINT notification should be coming through; could you post a snippet of your code that handles the WM_NOTIFY message? Also, you mentioned that you're dispatching the custom draw messages to the parent form. In order for this to work, the tree-view must be a direct child of the parent form (not, e.g., placed upon a TPanel that's on the form).

Damon
User avatar
Damon
BCBJ Editor and Admin
BCBJ Editor and Admin
 
Posts: 285
Joined: Wed May 26, 2004 11:25 pm
Location: Stillwater, OK, USA

Some code...

Postby greg221b » Mon Sep 20, 2004 10:35 pm

Thanks for your reply Damon -
here is the code I am using:

void __fastcall TForm1::WMNotify(TMessage &Msg)
{
LPNM_TREEVIEW lpnm = (NM_TREEVIEW*)Msg.LParam;
LPNMTVCUSTOMDRAW lptvcd = (NMTVCUSTOMDRAW*)Msg.LParam;
// see if the message is a Custom Draw message
if (lpnm->hdr.code == NM_CUSTOMDRAW)
{
// see if the message is from the TreeView
if (lpnm->hdr.hwndFrom == TreeView1->Handle)
{
// grab a pointer to the NMTVCUSTDRAW structure
//LPNMTVCUSTOMDRAW
lptvcd = (NMTVCUSTOMDRAW *)Msg.LParam;

// check the drawing stage
switch (lptvcd->nmcd.dwDrawStage)
{
// prior to painting...
case CDDS_PREPAINT:
{
// tell Windows we want individual
// notification of each item being drawn
ULONG JItem = lptvcd->nmcd.dwItemSpec;
Msg.Result = CDRF_NOTIFYITEMDRAW;
break;
}
// notification of each item...
case CDDS_ITEMPREPAINT:
{
// change the font of the first item for example
// for TreeViews, dwItemSpec corresponds to ItemId
ULONG HItem = (ULONG)TreeView1->Items->Item[0]->ItemId;
ULONG IItem = (ULONG)TreeView1->Items->Item[1]->ItemId;
//****
if (lptvcd->nmcd.dwItemSpec == HItem)
{
SelectObject(lptvcd->nmcd.hdc, NewFont->Handle);
}

// determine the state of the TreeView item
UINT State = lptvcd->nmcd.uItemState;

// change background color (clHighlight if selected
// item otherwise TreeView's color
if (State & CDIS_SELECTED)
lptvcd->clrTextBk = ColorToRGB(clAqua);
else
lptvcd->clrTextBk = ColorToRGB(TreeView1->Color);

// tell Windows we changed an attribute
Msg.Result = CDRF_NEWFONT;
break;
}

//otherwise, let Windows draw the Node
default: Msg.Result = CDRF_DODEFAULT;
return;
}
}
}
....
}

Yes, I was getting the CDDS_ITEMPREPAINT message - it
was my inexperience that stopped me seeing that -
my problem seems to be that at the line marked ****,
lptvcd->nmcd.dwItemSpec never seems to correlate to
the two items I am looking at - which are (ULONG)TreeView1->Items->Item[0]->ItemId & ...->Item[1]->...,
hence I am unable to change the colour/fonts of these items.

If anyone could help me I'd very very grateful,
Thanks, Greg.
greg221b
 


Return to Technical

Who is online

Users browsing this forum: No registered users and 13 guests

cron