NM_CUSTOMDRAW消息解釋
ON_NOTIFY ( NM_CUSTOMDRAW, IDC_MY_LIST, OnCustomdrawMyList )
afx_msg void OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult );
ON_NOTIFY_REFLECT ( NM_CUSTOMDRAW, OnCustomdraw )OnCustomdraw的原形和上面的函數一致,但它是聲明在你的派生類里的。
l 一個item被畫之前——“繪畫前”段l 一個item被畫之后——“繪畫后”段l 一個item被擦除之前——“擦除前”段l 一個item被擦除之后——“擦除后”段
NM_CUSTOMDRAW Messages提供給你的信息:
l NM_CUSTOMDRAW消息將會給你提供以下的信息:l ListCtrl的句柄l ListCtrl的IDl 當前的“繪畫段”l 繪畫的DC,讓你可以用它來畫畫l 正在被繪制的控件、item、subitem的RECT值l 正在被繪制的Item的Index值l 正在被繪制的SubItem的Index值l 正被繪制的Item的狀態值(selected, grayed,等等)l Item的LPARAM值,就是你使用CListCtrl::SetItemData所設的那個值
一個簡單的例子:
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
// Take the default processing unless we set this to something else below.
*pResult = 0; // First thing - check the draw stage. If it's the control's prepaint
// stage, then tell Windows we want messages for every item.
if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
{
*pResult = CDRF_NOTIFYITEMDRAW;
}
else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
{
// This is the prepaint stage for an item. Here's where we set the
// item's text color. Our return value will tell Windows to draw the
// item itself, but it will use the new color we set here.
// We'll cycle the colors through red, green, and light blue.
COLORREF crText; if ( (pLVCD->nmcd.dwItemSpec % 3) == 0 )
crText = #ff0000;
else if ( (pLVCD->nmcd.dwItemSpec % 3) == 1 )
crText = #00ff00;
else
crText = #8080ff; // Store the color back in the NMLVCUSTOMDRAW struct.
pLVCD->clrText = crText; // Tell Windows to paint the control itself.
*pResult = CDRF_DODEFAULT;
}
}結果如下,你可以看到行和行間的顏色的交錯顯示,多酷,而這只需要兩個if的判斷就可以做到了。
一個更小的簡單例子: 下面的例子將演示怎么去處理subitem的繪畫(其實subitem也就是列)在ListCtrl控件繪畫前處理NM_CUSTOMDRAW消息。告訴Windows我們想對每個Item處理NM_CUSTOMDRAW消息。當這些消息中的一個到來,告訴Windows我們想在每個SubItem的繪制前處理這個消息當這些消息到達,我們就為每個SubItem設置文字和背景的顏色。
l clrTextBk的顏色只是針對每一列,在最后一列的右邊那個區域顏色也還是和ListCtrl控件的背景顏色一致。l 當我重新看文檔的時候,我注意到有一篇題目是“NM_CUSTOMDRAW(list view)”的文章,它說你可以在最開始的custom draw消息中返回CDRF_NOTIFYSUBITEMDRAW就可以處理SubItem了,而不需要在CDDS_ITEMPREPAINT繪畫段中去指定CDRF_NOTIFYSUBITEMDRAW。但是我試了一下,發現這種方法并不起作用,你還是需要處理CDDS_ITEMPREPAINT段。
posted on 2014-03-07 14:27 厚積薄發 閱讀(7348) 評論(0) 編輯 收藏 引用 所屬分類: Windows編程

