Изменение цвета выбранного элемента CTreeCtrl? - PullRequest
2 голосов
/ 22 января 2010

(VS2008, MFC, Feature-Pack)

Используя CTreeCtrl, мне нужно выделить выделенный элемент «лучше», когда элемент управления теряет фокус.

Мое дерево создается с помощью опции "TVS_SHOWSELALWAYS" в редакторе ресурсов, но цвет недостаточно виден.

У меня уже есть код для изменения цвета элементов с помощью настраиваемого сообщения рисования (NM_CUSTOMDRAW), например:

void MyTree::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) 
{
    NMTVCUSTOMDRAW *pcd = (NMTVCUSTOMDRAW   *)pNMHDR;
    switch ( pcd->nmcd.dwDrawStage )
    {
    case CDDS_PREPAINT: 
        *pResult = CDRF_NOTIFYITEMDRAW;     
        break;

    case CDDS_ITEMPREPAINT : 
        {
            HTREEITEM   hItem = (HTREEITEM)pcd->nmcd.dwItemSpec;

            if ( this->IsSelected(hItem ))
            {
                pcd->clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);    
                pcd->clrTextBk = GetSysColor(COLOR_HIGHLIGHT);
            }

            *pResult = CDRF_DODEFAULT;// do not set *pResult = CDRF_SKIPDEFAULT
            break;
        }
    }
}

Это работает, но, кажется, это излишне для такой простой задачи.

Я думаю, что, должно быть, я упускаю что-то очевидное, чтобы сделать это без необходимости делать это.

Что-нибудь попроще?

Спасибо.

Ответы [ 3 ]

4 голосов
/ 24 января 2010

Помимо пользовательского чертежа, который вы уже делаете, вы также можете установить состояние TVIS_DROPHILITED для всех выбранных элементов. Но я не уверен, действительно ли это то, что вы хотите, особенно если ваш древовидный элемент управления также является целью отбрасывания.

Вы также можете попробовать установить тему элемента управления деревом для проводника:

SetWindowTheme(hTreeControl, L"Explorer", NULL);

Это заставляет дерево управления выглядеть точно так же, как в проводнике Windows с теми же цветами. Может быть, вам это больше нравится.

2 голосов
/ 22 января 2010

Вы можете установить текст выбранного элемента жирным шрифтом, используя SetItemState и TVIS_BOLD . Для этого вам не нужно настраивать отрисовку, и всегда меньше кода.

0 голосов
/ 31 марта 2011

Вы можете заменить this-> isSelected на pcd-> nmcd.uItemState & CDIS_SELECTED

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...