0 out of 2 rated this helpful - Rate this topic

NM_CUSTOMDRAW (list view) notification code

Applies to: desktop apps only

Sent by a list-view control to notify its parent windows about drawing operations. This notification code is sent in the form of a WM_NOTIFY message.

NM_CUSTOMDRAW

    lpNMCustomDraw = (LPNMLVCUSTOMDRAW) lParam;

Parameters

lParam

Pointer to a NMLVCUSTOMDRAW structure that contains information about the drawing operation. The first member of this structure, nmcd, is a pointer to an NMCUSTOMDRAW structure. The dwItemSpec member of the structure pointed to by nmcd contains the identifier of the item being drawn and the lItemlParam member contains its application-defined data.

Return value

The value your application can return depends on the current drawing stage. The dwDrawStage member of the associated NMCUSTOMDRAW structure holds a value that specifies the drawing stage. You must return one of the following values.

Return codeDescription
CDRF_DODEFAULT

The control will draw itself. It will not send any additional NM_CUSTOMDRAW notification codes for this paint cycle. This occurs when dwDrawStage equals CDDS_PREPAINT.

CDRF_DOERASE

Windows Vista. The control will not draw the focus rectangle around an item.

CDRF_NOTIFYITEMDRAW

The control will notify the parent of any item-related drawing operations. It will send NM_CUSTOMDRAW notification codes before and after drawing items. This occurs when dwDrawStage equals CDDS_PREPAINT.

CDRF_NOTIFYPOSTERASE

The control will notify the parent after erasing an item. This occurs when dwDrawStage equals CDDS_PREPAINT.

CDRF_NOTIFYPOSTPAINT

The control will notify the parent after painting an item. This occurs when dwDrawStage equals CDDS_PREPAINT.

CDRF_NEWFONT

The application specified a new font for the item; the control will use the new font. For more information about changing fonts, see Changing fonts and colors. This occurs when dwDrawStage equals CDDS_ITEMPREPAINT.

CDRF_NOTIFYSUBITEMDRAW

Version 4.71. Your application will receive an NM_CUSTOMDRAW control code with dwDrawStage set to CDDS_ITEMPREPAINT | CDDS_SUBITEM before each list-view subitem is drawn. You can then specify font and color for each subitem separately or return CDRF_DODEFAULT for default processing. This occurs when dwDrawStage equals CDDS_ITEMPREPAINT.

CDRF_SKIPDEFAULT

The application drew the item manually. The control will not draw the item. This occurs when dwDrawStage equals CDDS_ITEMPREPAINT.

CDRF_SKIPPOSTPAINT

Windows Vista. The control will only paint the background.

 

Remarks

Version 5.80. If you change the font by returning CDRF_NEWFONT, the list-view control might display clipped text. This behavior is necessary for backward compatibility with earlier versions of the common controls. If you want to change the font of a list-view control, you will get better results if you send a CCM_SETVERSION message with the wParam value set to 5 before adding any items to the control.

Requirements

Minimum supported client

Windows 2000 Professional

Minimum supported server

Windows 2000 Server

Header

Commctrl.h

 

 

Send comments about this topic to Microsoft

Build date: 3/6/2012

Did you find this helpful?
(1500 characters remaining)
Community Content Add
Annotations FAQ
On Windows XP, supplied RECT is wrong
When drawing items or subItems, ignore the rect passed in LPNMLVCUSTOMDRAW->nmcd.rc, it is completely bogus and will result in nothing being drawn at all.  instead, use ListView_GetItemRect() or ListView_GetSubItemRect() to obtain the correct rectangle.

This may apply to Windows Vista, this does NOT apply to Windows 7
Skipping expensive draw on hidden columns
NM_CUSTOMDRAW with CDDS_ITEMPREPAINT | CDDS_SUBITEM and CDDS_ITEMPOSTPAINT | CDDS_SUBITEM will be called in Report view mode even for columns that are not visible. You can optimize expensive draw/lookup operations away by checking the RECT returned from ListView_GetSubItemRect() to make sure RECT.right - RECT.left > 0.