我需要以某种方式获得(固定)窗口边框大小的宽度(垂直方向)。默认情况下,它在WinXP上非常薄,但是搭载Aero的Win7,更加厚实。
我认为GetSystemMetrics可以做到这一点,但似乎它为XP和Win7系统返回相同的值,我检查了以下参数:
SM_CXBORDER
SM_CXEDGE
SM_CYFIXEDFRAME
SM_CYBORDER
SM_CXFIXEDFRAME
但是正如我所写,无论垂直窗口边界实际有多厚,它们都会为两个操作系统返回相同的值。该窗口是使用标志WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX
创建的,如果有任何帮助(它不大)。
感谢您的任何想法。
克拉
答案 0 :(得分:5)
好吧,花了一些时间后,这里有一个代码似乎返回真正的边框宽度(如果有人需要它):
NONCLIENTMETRICS ncm;
OSVERSIONINFO OS;
OS.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
GetVersionEx (&OS);
if (OS.dwMajorVersion < 6)
{
ncm.cbSize = sizeof (ncm) - sizeof(ncm.iPaddedBorderWidth);
SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
BorderWidth = ncm.iBorderWidth;
}
else
{
ncm.cbSize = sizeof (ncm);
SystemParametersInfo (SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0);
BorderWidth = ncm.iBorderWidth + ncm.iPaddedBorderWidth;
}
我猜它还有一些小故障,但它对我来说是可以接受的:))我知道的故障是,它确实计算了一个相当大的窗口的边框宽度,如果你有一个弹出窗口,它的边框略有不同大小(但是在XP上似乎你不能设置弹出窗口边框大小,你只能在相当大的窗口中这样做。)
答案 1 :(得分:2)
如果潜在的问题是,你需要计算'窗口'大小来实现一个desirect客户端rect,然后跳过数学。
AdjustWindowRectEx远远超出未来的证据。甚至AdjustWindowRect也需要做一些猜测,因为没有真正的窗口它不知道滚动条或包装菜单:发送一个WM_NCCALCSIZE消息的现有窗口,DefWindowProc将计算并返回结果的客户区。通过计算客户区和所需客户区之间的差异来扩大窗口矩形。
答案 2 :(得分:2)
Kra,关键词是DwmApi(适用于Vista和更新版本):
答案 3 :(得分:0)
你可能需要GetClientRect。无论如何,您可以根据GetClientRect和GetWindowRect
返回的维度计算它们伪代码:
wr = GetWindowRect()
cr = GetClientRect()
left_border_width = cr.left
right_border_width = wr.right - wr.left - cr.right
答案 4 :(得分:0)
GetWindowRect()从DESKTOP返回坐标作为原点。屏幕左上角。
GetClientRect()从您调用它的WINDOW客户端区域返回坐标。
你必须将coords从一个转换为另一个。
正如adf88所说,这是通过ScreenToClient和ClientToScreen完成的。 “屏幕”是桌面。
查找GetWindowRect(),GetClientRect(),ScreenToClient()和ClientToScreen()。
HTH
答案 5 :(得分:0)
我能得到的最接近的是: -
顶部:GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CYDLGFRAME) + GetSystemMetrics(SM_CYMENU) + GetSystemMetrics(SM_CYCAPTION)
底部:GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CYDLGFRAME)
向左或向右:GetSystemMetrics(SM_CXPADDEDBORDER) + GetSystemMetrics(SM_CXDLGFRAME)
将这些值添加到窗口大小以获得所需的客户端大小。