dexter4life Ответов: 1

Как я могу исправить ширину окна, в то время как высота может быть изменена?


Я пытаюсь обработать сообщение windows, такое как WM_SIZING, WM_SIZE и т. д. В основном те, которые связаны с или вызываются при изменении ширины или высоты. Я попытался установить значение с помощью MoveWindow и SetWindowPos, но ничего не происходит, вместо этого окна мерцают и возвращаются к значению по умолчанию. Как заставить ширину или высоту быть фиксированными, но не то и другое-вот моя задача.

Что я уже пробовал:

Я попробовал это сделать

((MINMAXINFO*)message.lParam())->ptMinTrackSize.x = m_fixedSize.width();

((MINMAXINFO*)message.lParam())->ptMinTrackSize.y = m_fixedSize.height();

1 Ответов

Рейтинг:
2

Daniel Pfeffer

Самый простой способ-обработать сообщение WM_SIZE, которое вызывается после того, как окно получит свой новый размер, но до того, как оно будет перекрашено. Вы просто сравниваете новую ширину с вашей желаемой шириной. Если он идентичен, ничего не делайте. Если он отличается, вызовите API SetWindowPos() с новой высотой (полученной в сообщении WM_SIZE) и желаемой шириной.

Например, в следующем примере используются крекеры сообщений в &ЛТ;windowsx.ч&ГТ; чтобы разобрать сообщение:

static void onSize(HWND hwnd, UINT /*state*/, int cx, int cy)
{
    /* code to prevent the window from exceeding a "full text page" */
    BOOL resize = FALSE;

    if (cx > wintext_max_width)
    {
        resize = TRUE;
        cx = wintext_max_width;
    }
    if (cy > wintext_max_height)
    {
        resize = TRUE;
        cy = wintext_max_height;
    }
    if (resize)
        SetWindowPos(hwnd,
                     GetNextWindow(hwnd, GW_HWNDPREV),
                     0, 0,
                     cx, cy,
                     SWP_NOMOVE);
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        /* other messages go here */
        case WM_SIZE:
            return HANDLE_WM_SIZE(hwnd, wParam, lParam, onSize);

        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
}


Richard MacCutchan

Это первый раз, когда я вижу, чтобы кто-то (кроме меня) использовал макросы взломщика сообщений. Я вообще-то отказался от них недавно, по причинам, которые не могу вспомнить.

Daniel Pfeffer

Когда вы хотите написать код, который работает на нескольких типах Windows (например, Win16, Win32 и Win64), они экономят много усилий на разборе сообщений. Я конвертирую FRACTINT для Windows (программа средней модели Win16) для запуска в качестве родной программы Win32/Win64, и эти макросы очень помогают.

dexter4life

Я попробую сделать это сейчас

dexter4life

Я не понимаю этого "GetNextWindow(hwnd, GW_HWNDPREV)", можно ли все еще оставить его как NULL?

dexter4life

Не работает так, как ожидалось, окна продолжают мерцать, когда я пытаюсь изменить их размер.