Winapi: изменить цвет TreeView с помощью CustomDraw

В настоящее время я пытаюсь изменить цвет фона элемента TreeView. Поэтому я использую это сообщение для создания элемента:

    SendMessage(ListView, LVM_INSERTITEM, 0, (LPARAM)&lvI);

Кроме того, я обрабатываю пользовательское сообщение о рисовании следующим образом:

        case WM_NOTIFY:
        {
            LPNMLISTVIEW pnm = (LPNMLISTVIEW)lParam;
            if (pnm->hdr.code == NM_CUSTOMDRAW)
            {
                LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)lParam;
                switch (lplvcd->nmcd.dwDrawStage)
                {
                    case CDDS_PREPAINT :
                        return CDRF_NOTIFYITEMDRAW;
                    case CDDS_ITEMPREPAINT:
                        lplvcd->clrTextBk = ???;

                        return CDRF_NEWFONT;
                }
            }

Это отлично работает, и я могу установить цвет на любой, какой захочу. Однако я пока не нашел способа передать цвет в качестве параметра прямо при отправке сообщения. В конце концов, пользовательская отрисовка бесполезна для меня, когда я могу назначить только постоянный или случайный цвет.

Спасибо за любую помощь!


person Henry    schedule 30.05.2013    source источник
comment
Я не уверен, но NMLISTVIEW::lParam похоже на пользовательские данные, которые вам нужны.   -  person Liviu    schedule 30.05.2013
comment
Уже пробовал, вроде не работает. Я не уверен, как мне потом получить информацию из lParam: lplvcd->clrTextBk = (COLORREF)lParam; -› создает случайные цвета   -  person Henry    schedule 30.05.2013
comment
Как насчет NMCUSTOMDRAW::lItemlParam, но опять же, я не знаю, как его установить.   -  person Liviu    schedule 30.05.2013
comment
NMCUSTOMDRAW::lItemlParam продолжает возвращать 0:/   -  person Henry    schedule 30.05.2013
comment
Когда вы добавляете элемент в список, вы можете передать свои собственные данные, установив флаг LVIF_PARAM и заполнив член lParam структуры LVITEM. Затем это возвращается к вам как NMCUSTOMDRAW::lItemlParam. Пусть вас не смущает lParam в самом сообщении WM_NOTIFY, это другое lParam :)   -  person Jonathan Potter    schedule 30.05.2013
comment
Спасибо, именно то, что я искал! Могу ли я как-нибудь отметить ваш ответ как принятый? :)   -  person Henry    schedule 30.05.2013
comment
Конечно, я опубликую это как ответ, я просто не был уверен, что это именно тот вопрос, который вы задавали :)   -  person Jonathan Potter    schedule 30.05.2013


Ответы (2)


Когда вы добавляете элемент в список, вы можете передать свои собственные данные, установив флаг LVIF_PARAM и заполнив член lParam структуры LVITEM. Затем это возвращается к вам как NMCUSTOMDRAW::lItemlParam.

Пусть вас не смущает lParam в самом сообщении WM_NOTIFY, это другое lParam :)

person Jonathan Potter    schedule 30.05.2013
comment
Как вы используете член NMCUSTOMDRAW::lItemlParam? Я имею в виду, как вы получаете текущий объект NMCUSTOMDRAW? - person PinkTurtle; 08.12.2015
comment
EDIT Хорошо, это LPNMTVCUSTOMDRAW lpNMCustomDraw = (LPNMTVCUSTOMDRAW)lParam и lpNMCustomDraw->nmcd.lItemlParam для элементов представления в виде дерева. - person PinkTurtle; 08.12.2015

Я думаю, что (точный) ответ лежит здесь: Использование пользовательского рисования.

person Liviu    schedule 30.05.2013
comment
Что ж, я использовал эту статью в качестве шаблона, и в ней объясняется, как использовать customdraw, но не показано, как передать аргумент через SendMessage, или я что-то упустил? - person Henry; 30.05.2013