Использование специального рисования (Custom Draw)


Нижеследующий фрагмент кода - это часть обработчика сообщения WM_NOTIFY, который иллюстрирует, как обработать уведомления специального рисования, отправленные органу управления Одноуровневый список элементов (list-view):

Демонстрационный пример

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);

/* В этой точке, Вы можете изменить цвет фона для элемента и любого подпункта
   и возвратить значение CDRF_NEWFONT. Если орган управления Одноуровневый 
   список элементов (list-view) находится в режиме сообщения, Вы можете просто 
   возвратить значение CDRF_NOTIFYSUBITEMREDRAW, чтобы настроить подпункты
   элемента индивидуально. */
        ...

        return CDRF_NEWFONT;
	//  или возвратить CDRF_NOTIFYSUBITEMREDRAW;

    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));

/* Это уведомление будет получено только тогда, если Вы находитесь в режиме
   сообщения и возвращали значение CDRF_NOTIFYSUBITEMREDRAW в предыдущем шаге.
   В этой точке, Вы можете изменить цвета фона для подпункта и возвратить
   значение CDRF_NEWFONT.*/
        ...
        return CDRF_NEWFONT;    
    }
...
}
		
 

Первое уведомление NM_CUSTOMDRAW имеет член dwDrawStageа структуры NMCUSTOMDRAW установленный в CDDS_PREPAINT. Обработчик возвращает значение CDRF_NOTIFYITEMDRAW, чтобы указать на то, что он желает модифицировать один или несколько элементов индивидуально.

Если значение CDRF_NOTIFYITEMDRAW возвращалось в предыдущем шаге, следующее уведомление NM_CUSTOMDRAW имеет dwDrawStage установленный в CDDS_ITEMPREPAINT. Обработчик извлекает текущий цвет и значения шрифта. В этой точке, Вы можете определить новые значения для маленького значка, большого значка и перечислить режимы. Если орган управления находится в режиме сообщения, Вы можете также определить новые значения, которые будут применены ко всем подпунктам элемента. Если Вы изменили что-нибудь, то возвратите значение CDRF_NEWFONT. Если орган управления находится в режиме сообщения, а Вы хотите обработать подпункты индивидуально, возвратите значение CDRF_NOTIFYSUBITEMREDRA .

Конечное уведомление отправляется только тогда, если орган управления находится в режиме сообщения, а Вы в предыдущем шаге возвращали значение CDRF_NOTIFYSUBITEMREDRAW. Процедура для того, чтобы изменять шрифты и цвета - та же самая как и этот шаг, но она обращается только к единичному подпункту. Возвратите значение CDRF_NEWFONT, чтобы уведомить орган управления, если цвет или шрифт изменялись.

 
Назад в оглавление
На главную страницу

Hosted by uCoz