【问题标题】:WINAPI - Set background & text color of a combo box dropdownWINAPI - 设置组合框下拉菜单的背景和文本颜色
【发布时间】:2020-10-18 07:32:19
【问题描述】:

所以我尝试使用 Common-Controls 和 WINAPI 设置 ComboBox 的背景和文本颜色。 我确实设法设置了组合框本身的背景和文本颜色,但其下拉列表的颜色保持不变。

这几乎是我所做的: 创建组合框时,我使用了CBS_DROPDOWNLIST 样式(以及WS_VISIBLEWS_CHILD)。 然后在窗口处理函数中,我通过以下方式处理了CTLCOLOR_LISTBOX消息:

SetBkMode(dc, OPAQUE);
SetTextColor(dc, RGB(255, 255, 255));
SetBkColor(dc, 0x383838);
comboBrush = CreateSolidBrush(0x383838); //global var
return (LRESULT)comboBrush;

正如我所说,这只会为组合框本身着色,而不是它的下拉列表。 我怎样才能为下拉列表着色?

【问题讨论】:

    标签: winapi colors combobox common-controls


    【解决方案1】:

    对于组合框的背景颜色和文字颜色,可以分别处理WM_CTLCOLORLISTBOXWM_CTLCOLOREDIT消息。

    WM_CTLCOLORLISTBOX : 发送到前一个列表框的父窗口 系统绘制列表框。通过回复此消息, 父窗口可以设置列表框的文字和背景颜色 通过使用指定的显示设备上下文句柄。

    一些代码:

       // Create Combox control
       int xpos = 100;            // Horizontal position of the window.
       int ypos = 100;            // Vertical position of the window.
       int nwidth = 200;          // Width of the window
       int nheight = 200;         // Height of the window
       HWND hwndParent = hWnd; // Handle to the parent window
    
       hWndComboBox = CreateWindow(WC_COMBOBOX, TEXT(""),
           CBS_DROPDOWNLIST | WS_CHILD |  WS_VISIBLE, 
           xpos, ypos, nwidth, nheight, hwndParent, NULL, hInstance,
           NULL);
    
       // load the combobox with item list.  
       // Send a CB_ADDSTRING message to load each item
    
       TCHAR Planets[9][10] =
       {
           TEXT("Mercury"), TEXT("Venus"), TEXT("Terra"), TEXT("Mars"),
           TEXT("Jupiter"), TEXT("Saturn"), TEXT("Uranus"), TEXT("Neptune"),
           TEXT("Pluto??")
       };
    
       TCHAR A[16];
       int  k = 0;
    
       memset(&A, 0, sizeof(A));
       for (k = 0; k <= 8; k += 1)
       {
           wcscpy_s(A, sizeof(A) / sizeof(TCHAR), (TCHAR*)Planets[k]);
    
           // Add string to combobox.
           SendMessage(hWndComboBox, (UINT)CB_ADDSTRING, (WPARAM)0, (LPARAM)A);
       }
    
       // Send the CB_SETCURSEL message to display an initial item 
       //  in the selection field  
       SendMessage(hWndComboBox, CB_SETCURSEL, (WPARAM)2, (LPARAM)0);
    
       ...
    

    更新:

    //Windows Process
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {    
        case WM_CTLCOLORLISTBOX:
        {       
            COMBOBOXINFO info;
            info.cbSize = sizeof(info);
            SendMessage(hWndComboBox, CB_GETCOMBOBOXINFO, 0, (LPARAM)&info);
            COMBOBOXINFO info1;
            info1.cbSize = sizeof(info1);
            SendMessage(hWndComboBox1, CB_GETCOMBOBOXINFO, 0, (LPARAM)&info1);
    
            if ((HWND)lParam == info.hwndList)
            {
                HDC dc = (HDC)wParam;
                SetBkMode(dc, OPAQUE);
                SetTextColor(dc, RGB(255, 255, 0));
                SetBkColor(dc, 0x383838); //0x383838
                HBRUSH comboBrush = CreateSolidBrush(0x383838); //global var
                return (LRESULT)comboBrush;
            } 
            if ((HWND)lParam == info1.hwndList)
            {
                HDC dc = (HDC)wParam;
                SetBkMode(dc, OPAQUE);
                SetTextColor(dc, RGB(255, 0, 0));
                SetBkColor(dc, RGB(0, 0, 255)); 
                HBRUSH comboBrush = CreateSolidBrush(RGB(0, 0, 255)); 
                return (LRESULT)comboBrush;
            }
        }
        case WM_CTLCOLOREDIT:
        {
            HWND hWnd = (HWND)lParam;
            HDC dc = (HDC)wParam;
            if (hWnd == hWndComboBox)
            {
                SetBkMode(dc, OPAQUE);
                SetTextColor(dc, RGB(255, 0, 255));
                SetBkColor(dc, 0x383838); //0x383838
                HBRUSH comboBrush = CreateSolidBrush(0x383838); //global var
                return (LRESULT)comboBrush;
            }
            else if (hWnd == hWndComboBox1)
            {
                SetBkMode(dc, OPAQUE);
                SetTextColor(dc, RGB(255, 255, 0));
                SetBkColor(dc, RGB(0, 255, 0)); 
                HBRUSH comboBrush = CreateSolidBrush(RGB(0, 255, 0)); 
                return (LRESULT)comboBrush;
            }
        }
        ...
    

    通过比较窗口返回的编辑句柄和列表框句柄来改变背景颜色。

    调试:

    【讨论】:

    • WM_CTLCOLOREDIT 消息中的给定句柄 ​​(lParam) 似乎不是组合框的句柄。有没有其他方法可以识别窗口处理程序内部的组合框?例如,如果我想要两个组合框,每个组合框都有不同的颜色怎么办?
    • 非常感谢!这正是我一直在寻找的
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2023-02-14
    • 2023-01-05
    相关资源
    最近更新 更多