使用自定義繪製
本節包含示範如何實作自定義繪製的範例。
下列代碼段是WM_NOTIFY處理程式的一部分,說明如何處理傳送至清單檢視控件的自定義繪製通知。
LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;
switch (pnm->hdr.code){
...
case NM_CUSTOMDRAW:
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
switch(lplvcd->nmcd.dwDrawStage) {
case CDDS_PREPAINT :
return CDRF_NOTIFYITEMDRAW;
case CDDS_ITEMPREPAINT:
SelectObject(lplvcd->nmcd.hdc,
GetFontForItem(lplvcd->nmcd.dwItemSpec,
lplvcd->nmcd.lItemlParam) );
lplvcd->clrText = GetColorForItem(lplvcd->nmcd.dwItemSpec,
lplvcd->nmcd.lItemlParam);
lplvcd->clrTextBk = GetBkColorForItem(lplvcd->nmcd.dwItemSpec,
lplvcd->nmcd.lItemlParam);
/* At this point, you can change the background colors for the item
and any subitems and return CDRF_NEWFONT. If the list-view control
is in report mode, you can simply return CDRF_NOTIFYSUBITEMDRAW
to customize the item's subitems individually */
...
return CDRF_NEWFONT;
// or return CDRF_NOTIFYSUBITEMDRAW;
case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
SelectObject(lplvcd->nmcd.hdc,
GetFontForSubItem(lplvcd->nmcd.dwItemSpec,
lplvcd->nmcd.lItemlParam,
lplvcd->iSubItem));
lplvcd->clrText = GetColorForSubItem(lplvcd->nmcd.dwItemSpec,
lplvcd->nmcd.lItemlParam,
lplvcd->iSubItem));
lplvcd->clrTextBk = GetBkColorForSubItem(lplvcd->nmcd.dwItemSpec,
lplvcd->nmcd.lItemlParam,
lplvcd->iSubItem));
/* This notification is received only if you are in report mode and
returned CDRF_NOTIFYSUBITEMDRAW in the previous step. At
this point, you can change the background colors for the
subitem and return CDRF_NEWFONT.*/
...
return CDRF_NEWFONT;
}
...
}
第一個NM_CUSTOMDRAW通知的 dwDrawStage 成員的 NMCUSTOMDRAW 結構設定為 CDDS_PREPAINT。 處理程式會傳 回CDRF_NOTIFYITEMDRAW ,指出它想要個別修改一或多個專案。
如果在上一個步驟中傳回CDRF_NOTIFYITEMDRAW,下一個NM_CUSTOMDRAW通知會將 dwDrawStage 設定為 CDDS_ITEMPREPAINT。 處理程式會擷取目前的色彩和字型值。 此時,您可以指定小型圖示、大型圖示和清單模式的新值。 如果控件處於報表模式,您也可以指定套用至專案所有子專案的新值。 如果您已變更任何專案,請傳回 CDRF_NEWFONT。 如果控件處於報表模式,而且您想要個別處理子專案,請傳回 CDRF_NOTIFYSUBITEMDRAW。
只有在控件處於報表模式,且您在上一個步驟中傳回 CDRF_NOTIFYSUBITEMDRAW 時,才會傳送最終通知。 變更字型和色彩的程式與此步驟相同,但只適用於單一子專案。 傳回 CDRF_NEWFONT ,以在色彩或字型變更時通知控件。
相關主題