Re[2]: Virtual ListCtrl и OwnerDraw
От: Captain_Blood  
Дата: 03.10.04 06:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Эээ..., из приведённого кода не видно, как Вы обрабатываете dwDrawStage...


А>Скажем такой вариант правильно выдаёт: ?

А>
А>switch ( pNMCD->nmcd.dwDrawStage )
А>{
А>case CDDS_PREPAINT:
А>    {
А>        *pResult = CDRF_NOTIFYITEMDRAW;
А>        break;
А>    }
А>case CDDS_ITEMPREPAINT:
А>    {
А>        TRACE("Item %d, SubItem %d\n", pNMCD->nmcd.dwItemSpec, pNMCD->iSubItem);
А>        *pResult = CDRF_SKIPDEFAULT;
А>        break;
А>    }
А>default:
А>    {
А>        *pResult = 0;
А>        break;
А>    }
А>}
А>


Ну в принципе, я то же самое делаю. Вот код:


if (pLVCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT)
{
    // Это, чтобы получать нотификацию CustomDraw

    *pResult = CDRF_NOTIFYITEMDRAW;
}

else if (pLVCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
{
    // Это присылается на нулевую колонку (то есть собственно item). Здесь
    // меня устраивает отрисовка по умолчанию, поэтому я возвращаю CDRF_DODEFAULT 
    // и заказываю нотификацию о перерисовке subitems через возврат CDRF_NOTIFYSUBITEMDRAW

    *pResult = CDRF_DODEFAULT | CDRF_NOTIFYSUBITEMDRAW;
}

else if ((pLVCustomDraw->nmcd.dwDrawStage & CDDS_SUBITEM) == CDDS_SUBITEM)
{
    // А это присылается на каждую колонку (то есть subitem). Две из них я 
    // рисую сам, а остальные - по умолчанию

    switch (pLVCustomDraw->iSubItem)
    {
        case COL_GRAPHIC1:

            ... тут рисуем ...
                
            *pResult = CDRF_SKIPDEFAULT | CDRF_NOTIFYSUBITEMDRAW;
            break;

        case COL_GRAPHIC2:

            ... и тут рисуем ...

            *pResult = CDRF_SKIPDEFAULT | CDRF_NOTIFYSUBITEMDRAW;
            break;

        default:

            ... а эти (все остальные) ListCtrl рисует сам ...

            *pResult = CDRF_NOTIFYPOSTPAINT | CDRF_NOTIFYSUBITEMDRAW;
            break;
    }

}

else if (pLVCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT)
{
    // А тут освобождаются некоторые ресурсы (типа шрифтов)
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.