设置MINMAXINFO在X上关闭4px,在Y上关闭5px

Setting MINMAXINFO is off by 4px on the X and 5px on the Y

本文关键字:5px MINMAXINFO 设置 4px      更新时间:2023-10-16

我像这样处理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;

它设置的分辨率始终比我想要的X少4个像素,y少5个像素,做+ 4和+ 5修复它,但这似乎是一个糟糕的主意。我做错了什么吗?

谢谢

取决于你使用的框架类型。您可能需要单独考虑边界的3D元素,例如SM_CXEDGE。如果它是一个3D客户端框架,客户端区域可能有一个你没有考虑的边缘

这就是为什么User32提供了adjustwindowscrect (Ex)。

在MSDN中对adjustwindowsecuretex的简要描述如下:

"根据客户端矩形的所需尺寸计算窗口矩形的所需尺寸。然后可以将窗口矩形传递给CreateWindowEx函数来创建一个窗口,其客户端区域是所需的大小。"

adjustwindowscrect是相同的,但用于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中设置相关点所需的尺寸。