Я реализую ограничения окна для своей игры и столкнулся с небольшой проблемой.
Я использую этот код для установки ограничений:
case WM_GETMINMAXINFO:
{
LPMINMAXINFO p_info = (LPMINMAXINFO)lParam;
RECT wRect;
RECT cRect;
int wWidth;
int wHeight;
int cWidth;
int cHeight;
int total_border_width;
int total_border_height;
POINT wmin, wmax;
GetWindowRect(hWnd, &wRect);
GetClientRect(hWnd, &cRect);
wWidth = wRect.right - wRect.left;
wHeight = wRect.bottom - wRect.top;
cWidth = cRect.right - cRect.left;
cHeight = cRect.bottom - cRect.top;
total_border_width = wWidth - cWidth;
total_border_height = wHeight - cHeight;
wmin.x = (d->min_w > 0) ? d->min_w + (resize_is_restore ? -total_border_width : total_border_width) : p_info->ptMinTrackSize.x;
wmin.y = (d->min_h > 0) ? d->min_h + total_border_height : p_info->ptMinTrackSize.y;
wmax.x = (d->max_w > 0) ? d->max_w + total_border_width : p_info->ptMaxTrackSize.x;
wmax.y = (d->max_h > 0) ? d->max_h + total_border_height : p_info->ptMaxTrackSize.y;
p_info->ptMinTrackSize = wmin;
p_info->ptMaxTrackSize = wmax;
resize_is_restore = false;
}
break;
Проблема заключалась в том, чтоОграничение min_w не соблюдается при восстановлении окна.
Я понял, что в этой ситуации необходимо отменить общую ширину:
wmin.x = (d->min_w > 0) ? d->min_w + (resize_is_restore ? -total_border_width : total_border_width) : p_info->ptMinTrackSize.x;
К сожалению, я не могу установить resize_is_restore, потому что WM_SIZEсообщение отправляется после WM_GETMINMAXINFO.Есть ли способ узнать, что изменение размера происходит из-за восстановления перед установкой minmaxinfo?
Спасибо
Исправлено с помощью:
/* Fix for when the window is restored */
if (cWidth == 0 && cHeight == 0) {
break;
}