WINAPI-设置背景和组合框下拉菜单的文本颜色 [英] WINAPI - Set background & text color of a combo box dropdown

查看:67
本文介绍了WINAPI-设置背景和组合框下拉菜单的文本颜色的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我试图设置ComboBox的背景&使用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);//全局变量返回(LRESULT)comboBrush; 

正如我所说,这只会为组合框本身着色,而不会为其下拉列表着色.如何为下拉列表上色?

解决方案

对于组合框的背景颜色和文本颜色,可以处理

So I was trying to set a ComboBox's background & text color using Common-Controls & WINAPI. I did manage to set the background & text color of the combo box itself, but the colors of its dropdown list remain the same.

Here is pretty much what I did: When creating the combo box, I used the CBS_DROPDOWNLIST style (along with WS_VISIBLE & WS_CHILD). Then in the window handler function, I handled the CTLCOLOR_LISTBOX messge in the following way:

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

As I said, this only colors the combobox itself, and not its drop-down list. How can I can color the drop down list as well?

解决方案

For the background color and text color of the combo box, you can handle the WM_CTLCOLORLISTBOX and WM_CTLCOLOREDIT messages respectively.

WM_CTLCOLORLISTBOX : Sent to the parent window of a list box before the system draws the list box. By responding to this message, the parent window can set the text and background colors of the list box by using the specified display device context handle.

Some code:

   // 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);

   ...

Updated:

//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;
        }
    }
    ...

Change the background color by comparing the edit handle and listbox handle returned by the window.

Debug:

这篇关于WINAPI-设置背景和组合框下拉菜单的文本颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆