Win32 COMBOBOX下拉列表初始化无绘制问题求助
Win32 C++ COMBOBOX 下拉列表绘制异常问题
我在Win32 C++插件的*.rc文件中创建了一个带下拉列表的COMBOBOX,代码如下:
COMBOBOX IDC_CCODE_EDT_PNR,60,18,83,27,CBS_DROPDOWN | WS_VISIBLE | CBS_SORT | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP
通过以下代码创建所属窗口:
_hSelf = ::CreateDialogParam(_hInst, MAKEINTRESOURCE(dialogID), _hParent, dlgProc, reinterpret_cast<LPARAM>(this));
初始化时通过以下代码设置下拉项:
::SendMessage(cbPointCode, CB_ADDSTRING, 0, (LPARAM)StringTools::GetWString(codes->at(i)).c_str());
打开下拉列表时尺寸调整正常,但列表项未绘制,呈现黑底黑字,仅鼠标悬停时才会显示该项。
请问如何实现下拉列表打开时就完成初始化绘制?
解决方案
1. 确认COMBOBOX窗口类未被篡改
若程序中自定义了COMBOBOX窗口类,会覆盖系统默认绘制逻辑。可在创建对话框前验证系统类状态,必要时重新注册默认类:
WNDCLASSEX wc = {0}; if (!GetClassInfoEx(_hInst, L"COMBOBOX", &wc)) { wc.cbSize = sizeof(WNDCLASSEX); wc.lpfnWndProc = ComboBoxWndProc; wc.hInstance = _hInst; wc.lpszClassName = L"COMBOBOX"; wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); RegisterClassEx(&wc); }
2. 调整列表项初始化时机
必须在对话框WM_INITDIALOG消息处理中添加列表项,确保控件已完全创建:
case WM_INITDIALOG: { HWND cbPointCode = GetDlgItem(hDlg, IDC_CCODE_EDT_PNR); for (size_t i = 0; i < codes->size(); ++i) { std::wstring itemText = StringTools::GetWString(codes->at(i)); ::SendMessage(cbPointCode, CB_ADDSTRING, 0, (LPARAM)itemText.c_str()); } return TRUE; }
3. 强制控件刷新
添加完所有列表项后,发送消息触发控件刷新:
// 添加完成后执行 ::SendMessage(cbPointCode, CB_SETMINVISIBLE, 5, 0); ::InvalidateRect(cbPointCode, NULL, TRUE); ::UpdateWindow(cbPointCode);
4. 修正列表框的颜色处理
在对话框窗口过程中处理WM_CTLCOLORLISTBOX消息,明确设置文本和背景色:
case WM_CTLCOLORLISTBOX: { HDC hdc = (HDC)wParam; SetTextColor(hdc, RGB(0, 0, 0)); SetBkColor(hdc, RGB(255, 255, 255)); return (INT_PTR)GetStockObject(WHITE_BRUSH); }
内容的提问来源于stack exchange,提问作者MarioR
相关产品推荐
相关产品推荐

