固定窗口的边框大小

时间:2010-08-20 06:47:49

标签: winapi

我需要以某种方式获得(固定)窗口边框大小的宽度(垂直方向)。默认情况下,它在WinXP上非常薄,但是搭载Aero的Win7,更加厚实。

我认为GetSystemMetrics可以做到这一点,但似乎它为XP和Win7系统返回相同的值,我检查了以下参数:

SM_CXBORDER
SM_CXEDGE
SM_CYFIXEDFRAME
SM_CYBORDER
SM_CXFIXEDFRAME

但是正如我所写,无论垂直窗口边界实际有多厚,它们都会为两个操作系统返回相同的值。该窗口是使用标志WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX创建的,如果有任何帮助(它不大)。

感谢您的任何想法。

克拉

6 个答案:

答案 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和更新版本):

  1. DwmIsCompositionEnabled
  2. DwmGetWindowAttribute(DWMWA_EXTENDED_FRAME_BOUNDS)

答案 3 :(得分:0)

你可能需要GetClientRect。无论如何,您可以根据GetClientRectGetWindowRect

返回的维度计算它们

伪代码:

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)

将这些值添加到窗口大小以获得所需的客户端大小。