Максимальные и минимальные размеры окон в WINAPI

Я нашел еще несколько вопросов о StackOverflow о моей теме. Один из них здесь.

Я также прочитал документацию Microsoft о MINMAXINFO и сообщение, связанное с этой структурой. Я просто не могу заставить его работать... Вот что я пробовал до сих пор:

case WM_PAINT:
{
    MINMAXINFO mmi = { 0 };
    SendMessage(hWnd, WM_GETMINMAXINFO, NULL, (LPARAM)&mmi);
    POINT sz = { 640, 480 };
    mmi.ptMaxSize = sz; 
}
break;

Я думаю, что это совершенно неправильно, поскольку оно не оказывает никакого влияния на окно...

Как я могу заставить эту работу работать с минимальным размером W: 450, H: 250 и максимум W:800, H: 600?

Дальнейшее объяснение эффекта, который мне нужен: когда пользователь перетаскивает один угол или границу окна, а окно имеет максимальный/минимальный размер, пользователь не может сделать окно больше или меньше, чем minimum_size/maximum_size

Ответ 1

WM_GETMINMAXINFO - это сообщение, которое система отправляет в окно. Он отправляет это сообщение, когда хочет знать минимальные и максимально допустимые размеры для окна. Вы никогда не отправляете это сообщение. Тем не менее, вы можете ответить на это сообщение, когда оно отправлено вам.

Итак, вам нужно добавить фразу для WM_GETMINMAXINFO в свою оконную процедуру:

case WM_GETMINMAXINFO:
{
    MINMAXINFO* mmi = (MINMAXINFO*)lParam;
    mmi->ptMaxSize.x = 800;
    mmi->ptMaxSize.y = 600;
    return 0;
}

Оказывается, вы хотите контролировать размер отслеживания. Сделайте это так:

case WM_GETMINMAXINFO:
{
    MINMAXINFO* mmi = (MINMAXINFO*)lParam;
    mmi->ptMinTrackSize.x = 450;
    mmi->ptMinTrackSize.y = 250;
    mmi->ptMaxTrackSize.x = 640;
    mmi->ptMaxTrackSize.y = 480;
    return 0;
}