You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:37:35