设置MINMAXINFO在X上关闭4px,在Y上关闭5px
Setting MINMAXINFO is off by 4px on the X and 5px on the Y
我像这样处理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中设置相关点所需的尺寸。