更改COMBOBOX的高度

时间:2011-05-07 20:37:20

标签: c winapi

如何更改在运行时使用资源定义创建的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);
}

2 个答案:

答案 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);