CComboBox - Как изменить цвет статики с помощью Drop List Style - PullRequest
0 голосов
/ 10 июля 2019

Я хочу знать, возможно ли изменить цвет текста (и маленькой стрелки) и фона статического элемента в CCombobox со стилем Drop List.

Мой класспроисходит от CComboBox, и я пробовал использовать функции CtlColor и OnCtlColor, но, кажется, ничто не меняет цвет ComboBox.

Вот изображение элемента управления со стилем Drop List:

ComboBoxDropList

Мне бы хотелось, чтобы текст и стрелка изменились на RGB(0, 255, 255), а фон RGB(255,255,0).

Вот моя функция CtlColor():

HBRUSH CColoredComboBox::CtlColor(CDC *pDC, UINT nCtlColor)
{
    if (nCtlColor == CTLCOLOR_STATIC || nCtlColor == CTLCOLOR_EDIT) 
    {
        pDC->SetBkColor(RGB(255,255,0));
        pDC->SetTextColor(RGB(0, 255, 255));
    }
    return m_brBkgnd;
}

Работает для выпадающего стиля, но не для выпадающего списка.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2019

Есть два способа - легкий и сложный. Сложный путь - завершить DrawItem с ownerdraw для обработки всех случаев. Самый простой способ - поместить две комбинации друг на друга в диалоговом ресурсе и скрыть ту, которую вы не собираетесь использовать. Возможно это может дать вам несколько идей.

0 голосов
/ 11 июля 2019

Не знаю, можно ли изменить цвет стрелки, но можно изменить цвет комбинированного списка. С помощью функции OnChildNotify() вы можете получить дочерний элемент HDC, а затем конкретный дочерний элемент HDC можно изменить.

/////////////////////////////////////////////////////////////////////////////
// CMyComboBox message handlers

BOOL CMyComboBox::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult) 
{
    // TODO: Add your specialized code here and/or call the base class

    if(WM_CTLCOLOREDIT != message)
        return CComboBox::OnChildNotify(message, wParam, lParam, pLResult);

    HDC hdcChild = (HDC)wParam;
    if(NULL != hdcChild)
    {
        SetBkMode(hdcChild, TRANSPARENT);
        SetTextColor(hdcChild, RGB(255, 255, 0));
        SetBkColor(hdcChild, RGB(255, 0, 0));
        *pLResult = (LRESULT)(m_Brush.GetSafeHandle());
    }

    return TRUE;
//  return CComboBox::OnChildNotify(message, wParam, lParam, pLResult);
}

Результат:

Result

...