3

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

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

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

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

4

1 回答 1

3

对于组合框的背景颜色和文本颜色,可以分别处理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;
        }
    }
    ...

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

调试:

在此处输入图像描述

于 2020-06-29T02:29:48.020 回答