Изменить высоту COMBOBOX - PullRequest
1 голос
/ 08 мая 2011

Как я могу изменить высоту 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 ]

1 голос
/ 08 мая 2011

Полагаю, вы имеете в виду высоту выпадающего списка в выпадающем списке.

Вы все еще можете работать с диалоговыми блоками, посмотрите на GetDialogBaseUnits , который будет возвращать количество пикселей на единицу диалога. Если вы работаете с несистемным шрифтом, в следующей статье базы знаний подробно описываются вычисления - Как вычислить единицы диалоговой базы с несистемным шрифтом .

Вы можете программно изменить размер поля со списком, используя SetWindowPos .

0 голосов
/ 26 мая 2011

А пока я нашел решение. Вот что я сейчас использую. Я установил высоту для комбинированного списка в файле ресурсов на 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...