Установка MINMAXINFO отключена на 4 пикселя на X и 5 пикселей на Y - PullRequest
0 голосов
/ 08 ноября 2011

Я работаю с MINMAXINFO следующим образом:

 case WM_GETMINMAXINFO:
      {
         LPMINMAXINFO p_info = (LPMINMAXINFO)lParam;
         int total_border_width = 2 * GetSystemMetrics( SM_CXFRAME );
         int total_border_height = 2 * GetSystemMetrics( SM_CYFRAME ) + 
            GetSystemMetrics( SM_CYCAPTION ) - GetSystemMetrics( SM_CYBORDER );
         POINT min,max;

         min.x = d->min_w > 0 ? d->min_w + total_border_width : p_info->ptMinTrackSize.x;
         min.y = d->min_h > 0 ? d->min_h + total_border_height : p_info->ptMinTrackSize.y;
         max.x = d->max_w > 0 ? d->max_w + total_border_width : p_info->ptMaxTrackSize.x;
         max.y = d->max_h > 0 ? d->max_h + total_border_height : p_info->ptMaxTrackSize.y;

         p_info->ptMinTrackSize = min;
         p_info->ptMaxTrackSize = max;
        }

       break;

И разрешение, которое оно устанавливает, на 4 пикселя меньше, чем я хочу на X, и на 5 пикселей на Y. Выполнение + 4 и + 5 исправляет это, но это кажется ужасной идеей. Я что-то не так делаю?

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 января 2014

именно поэтому User32 предоставляет AdjustWindowRect (Ex).

Краткое описание AdjustWindowRectEx в MSDN выглядит следующим образом:

"Вычисляет необходимый размер прямоугольника окна на основе желаемого размера клиентского прямоугольника. Затем прямоугольник окна можно передать в функцию CreateWindowEx, чтобы создать окно, клиентская область которого имеет требуемый размер."

AdjustWindowRect такой же, но для использования с CreateWindow. Для коррекции MINMAXINFO это должно работать независимо от того, какую функцию вы использовали для создания окна:

RECT rc;
rc.left = 0;
rc.top = 0;
rc.right = desired_width;
rc.bottom = desired_height;
AdjustWindowRectEx(&rc, GetWindowLong(hwnd, GWL_STYLE),
     GetMenu(hwnd) != 0, GetWindowLong(GWL_EXSTYLE));

rc будет изменен на размеры, необходимые для установки соответствующих точек в MINMAXINFO.

0 голосов
/ 08 ноября 2011

Зависит от типа используемого вами кадра. Возможно, вам придется отдельно учитывать трехмерные элементы границы, такие как SM_CXEDGE. У клиентской области может быть край, который вы не учитываете, если это кадр 3D-клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...