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
Не работает так, как ожидалось, окна продолжают мерцать, когда я пытаюсь изменить их размер.