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:通过资源编辑器调整属性
- 打开VS2022资源编辑器,选中目标ComboBox控件(IDC_CLUTTER)
- 右键打开「属性」面板,找到
Drop Down Height属性 - 将值调整为足够容纳4行选项的高度(例如80像素,可根据字体大小微调)
- 确认控件
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
相关产品推荐
相关产品推荐

