如何更改在运行时使用资源定义创建的COMBOBOX
控件的高度,以便我可以在组合框中插入新字符串?字符串插入代码正在工作,但前提是我在资源定义中为组合框设置了固定高度(例如28个单位)。但这不方便,因为字符串的数量是动态的。
我知道我可以在运行时创建对话框,但是我不能使用对话框,资源也更有效...
以下是我的代码的简化版本。
资源文件:
IDD_SETTINGS DIALOG 0, 0, 100, 100
BEGIN
COMBOBOX IDC_COMBO, 0, 0, 100, 14, CBS_DROPDOWNLIST
END
主窗口和对话框的窗口过程:
BOOL CALLBACK WndProcSettings(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_INITDIALOG:
//...
break;
default:
return FALSE;
}
return TRUE;
}
LRESULT CALLBACK WndProcMain(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDC_SETTINGS:
DialogBox(hInstance, MAKEINTRESOURCE(IDD_SETTINGS), hWnd, WndProcSettings);
break;
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return(0L);
}
答案 0 :(得分:1)
我假设你指的是组合框的下拉部分的高度。
您仍然可以使用对话框单元,查看GetDialogBaseUnits,它将返回每个对话框单元的像素数。如果您使用的是非系统字体,则以下知识库文章会详细说明计算 - How To Calculate Dialog Base Units with Non-System-Based Font。
您可以使用SetWindowPos以编码方式更改组合框的大小。
答案 1 :(得分:0)
与此同时,我找到了解决方案。这是我现在正在使用的。我将资源文件中组合框的高度设置为14 DLU(一个项目的高度),以便正确计算新的高度。使用GetClientRect
我获得此高度,并将其转换为MapDialogRect
的像素。
HWND hCtl;
RECT rect;
hCtl = GetDlgItem(hWnd, IDC_COMBO);
GetClientRect(hCtl, &rect);
MapDialogRect(hCtl, &rect);
SetWindowPos(hCtl, 0, 0, 0, rect.right, (n_choices + 1) * rect.bottom, SWP_NOMOVE);