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

VS2022资源编辑器中ComboBox下拉列表绘制问题求助

ComboBox下拉列表显示异常问题解决

在VS2022资源编辑器创建的对话框中,ComboBox控件功能正常,但视觉效果异常:下拉列表仅显示当前选中的一行,无法展示全部4个选项,只能通过上下箭头切换选项,鼠标无法正常操作(下拉列表展开后无法用鼠标点击选择)。

异常效果说明:下拉列表区域被压缩为一行高度,所有选项挤在该区域内无法正常展示

当前对话框过程代码

BOOL CALLBACK GedcomDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
    static bool lFirst, lDone;
    HWND    hClutter, hClutterMin, hClutterMax;
    COMBOBOXINFO    info = { sizeof( COMBOBOXINFO ) };
    DRAWITEMSTRUCT* DIS;
    int     i, sel;
    WCHAR   txt[128];

    switch ( msg )
    {
    case WM_INITDIALOG:
        // <一些初始化操作>
        OptionsDlgSets( hDlg );
        hClutter = GetDlgItem( hDlg, IDC_CLUTTER );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"0 - Critical Only" );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"1 - Edit Family Members" );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"2 - Edit Direct Relatives" );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"3 - Edit All Individuals" );
        SendMessage( hClutter, CB_SETCURSEL, 2, (LPARAM)0 );
        // <更多初始化操作>
        return false;

    case WM_COMMAND:
        lDone = FALSE;
        switch ( HIWORD( wParam ) )
        {
        case CBN_SELCHANGE:
            sel = SendMessage( (HWND)lParam, CB_GETCURSEL, (WPARAM)0, (LPARAM)0 );
            memset( &txt, 0, sizeof( txt ) );
            i = SendMessage( (HWND)lParam, CB_GETLBTEXT, (WPARAM)sel, (LPARAM)txt );
            txt[i] = 0;
            gOptions.setnClutter( stoi( txt ) );
            lDone = true; break;

        case CBN_DROPDOWN:
            if ( LOWORD( wParam ) == IDC_CLUTTER ) {
                hClutter = GetDlgItem( hDlg, IDC_CLUTTER );
                info.cbSize = sizeof( COMBOBOXINFO );
                GetComboBoxInfo( hClutter, &info );
            } // endif
            lDone = true; break;

        } // endswitch
        if ( !lDone ) {
            // <其他控件处理>
        } // endif
        OptionsDlgSets( hDlg );
        return true;

    } // endswitch
    return false;
} // endfunc GedcomDlgProc

问题原因与解决方法

核心原因

该问题是ComboBox的下拉列表高度配置错误,导致下拉区域被压缩为一行高度,无法正常展开显示所有选项。

方法1:通过资源编辑器调整属性

  1. 打开VS2022资源编辑器,选中目标ComboBox控件(IDC_CLUTTER)
  2. 右键打开「属性」面板,找到Drop Down Height属性
  3. 将值调整为足够容纳4行选项的高度(例如80像素,可根据字体大小微调)
  4. 确认控件Type属性为Drop Down或Drop List(按需选择)

方法2:代码动态设置下拉高度

在WM_INITDIALOG中添加代码,强制设置下拉列表的显示行数:

case WM_INITDIALOG:
    // 原有初始化代码...
    hClutter = GetDlgItem( hDlg, IDC_CLUTTER );
    // 设置下拉列表最多显示4行,系统自动计算高度
    SendMessage(hClutter, CB_SETMINVISIBLE, 4, 0);
    // 或者直接指定下拉高度(单位:像素)
    // SendMessage(hClutter, CB_SETDROPPEDHEIGHT, 80, 0);
    // 原有添加选项代码...
    SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"0 - 仅关键内容" );
    SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"1 - 编辑家庭成员" );
    SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"2 - 编辑直系亲属" );
    SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"3 - 编辑所有个体" );
    SendMessage( hClutter, CB_SETCURSEL, 2, (LPARAM)0 );
    // ...其他代码
    return false;

方法3:优化CBN_DROPDOWN消息处理

替换原代码中无效的CBN_DROPDOWN分支逻辑,动态计算下拉高度:

case CBN_DROPDOWN:
    if ( LOWORD( wParam ) == IDC_CLUTTER ) {
        hClutter = GetDlgItem( hDlg, IDC_CLUTTER );
        // 获取单列表项高度,乘以4得到总高度
        int itemHeight = SendMessage(hClutter, CB_GETITEMHEIGHT, 0, 0);
        SendMessage(hClutter, CB_SETDROPPEDHEIGHT, itemHeight * 4, 0);
    }
    lDone = true; 
    break;

完整修正后的代码

BOOL CALLBACK GedcomDlgProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
{
    static bool lFirst, lDone;
    HWND    hClutter, hClutterMin, hClutterMax;
    int     i, sel;
    WCHAR   txt[128];

    switch ( msg )
    {
    case WM_INITDIALOG:
        // <一些初始化操作>
        OptionsDlgSets( hDlg );
        hClutter = GetDlgItem( hDlg, IDC_CLUTTER );
        // 设置下拉列表最多显示4行
        SendMessage(hClutter, CB_SETMINVISIBLE, 4, 0);
        // 添加选项
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"0 - 仅关键内容" );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"1 - 编辑家庭成员" );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"2 - 编辑直系亲属" );
        SendMessage( hClutter, CB_ADDSTRING, (WPARAM)0, (LPARAM)L"3 - 编辑所有个体" );
        SendMessage( hClutter, CB_SETCURSEL, 2, (LPARAM)0 );
        // <更多初始化操作>
        return false;

    case WM_COMMAND:
        lDone = FALSE;
        switch ( HIWORD( wParam ) )
        {
        case CBN_SELCHANGE:
            sel = SendMessage( (HWND)lParam, CB_GETCURSEL, (WPARAM)0, (LPARAM)0 );
            memset( &txt, 0, sizeof( txt ) );
            i = SendMessage( (HWND)lParam, CB_GETLBTEXT, (WPARAM)sel, (LPARAM)txt );
            txt[i] = 0;
            gOptions.setnClutter( stoi( txt ) );
            lDone = true; 
            break;

        case CBN_DROPDOWN:
            if ( LOWORD( wParam ) == IDC_CLUTTER ) {
                hClutter = GetDlgItem( hDlg, IDC_CLUTTER );
                int itemHeight = SendMessage(hClutter, CB_GETITEMHEIGHT, 0, 0);
                SendMessage(hClutter, CB_SETDROPPEDHEIGHT, itemHeight * 4, 0);
            }
            lDone = true; 
            break;

        } // endswitch
        if ( !lDone ) {
            // <其他控件处理>
        } // endif
        OptionsDlgSets( hDlg );
        return true;

    } // endswitch
    return false;
} // endfunc GedcomDlgProc

内容的提问来源于stack exchange,提问作者DRF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:59:57