WINAPI - 设置组合框下拉菜单的背景和文本颜色
Posted
技术标签:
【中文标题】WINAPI - 设置组合框下拉菜单的背景和文本颜色【英文标题】:WINAPI - Set background & text color of a combo box dropdown 【发布时间】:2020-10-18 07:32:19 【问题描述】:所以我尝试使用 Common-Controls 和 WINAPI 设置 ComboBox 的背景和文本颜色。 我确实设法设置了组合框本身的背景和文本颜色,但其下拉列表的颜色保持不变。
这几乎是我所做的:
创建组合框时,我使用了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;
正如我所说,这只会为组合框本身着色,而不是它的下拉列表。 我怎样才能为下拉列表着色?
【问题讨论】:
【参考方案1】:对于组合框的背景颜色和文字颜色,可以分别处理WM_CTLCOLORLISTBOX和WM_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) 似乎不是组合框的句柄。有没有其他方法可以识别窗口处理程序内部的组合框?例如,如果我想要两个组合框,每个组合框都有不同的颜色怎么办?
非常感谢!这正是我一直在寻找的以上是关于WINAPI - 设置组合框下拉菜单的背景和文本颜色的主要内容,如果未能解决你的问题,请参考以下文章
VC\MFC界面怎么设置列表框第一列文字居中,其他列的文本左对齐
在 Visual Studio MFC 中,我可以在组合框中包含文本但在代码中获取 int 吗?