【发布时间】:2012-07-31 18:09:06
【问题描述】:
在尝试用 C++ 创建窗口并绘制矩形时,我注意到一些非常烦人的事情,但窗口大小与我设置的大小不匹配。
例如,如果我设置 480x240 的窗口并尝试通过获取 GetWindowRect(hwnd, &rect) 从上到下、从左到右绘制矩形并计算宽度和高度:
rectangle_width = (rect.right - rect.left) / amountRectangleX;
rectangle_height = (rect.bottom - rect.top) / amountRectangleY;
如果 amountRectangleX = 2 和 Y = 2 它会绘制 4 个矩形,但宽度和高度是“关闭”的,因此它不会填满整个屏幕或渲染它。发生这种情况的唯一方法(我已经用很多其他语言做过,所以我知道它有效)是,如果我设置 Window Size = 480x240,我希望它成为“DRAW”的区域。因为如果边框包含在窗口的大小中 - 在另一台具有不同窗口样式等的计算机上会有所不同。而且我不能只是为我的计算机手动“更改”它。
如果我设置窗口大小 = 480x240 并截屏,我会看到窗口空间 = 452x232,这令人困惑。如果我设置窗口大小 = 480x240 就可以了,但是当我 GetWindowRect() 我得到 452x232 而不是 480x240 时,这是无效的,因为我没有足够的空间来绘制。这可以解释为什么我的 Rectangles 渲染超出了窗口空间,而我不希望这样。但我仍然希望能够设置我的尺寸 = 480x240 或其他任何东西,但仍然有边框。
为什么它会这样工作,有没有解决这个问题的方法? 我不可能是唯一一个希望能够设置窗口分辨率的人,无论您使用什么计算机,您设置的大小都是您可以绘制的 DRAW AREA。
【问题讨论】:
-
不确定你是否想要
GetClientRect。它获取您可以绘制的部分,并排除边框/标题栏/等.. -
rect.right - rect.right?你确定吗? -
GetWindowRect() 和 GetClientRect() 都返回相同的结果。
-
我的意思是 rect.right - rect.left。
-
GetClientRect() 不应返回与 GetWindowRect() 相同的结果。我认为您在问题中遗漏了一些重要的细节。您是否自定义绘制窗口边框?你用的是航空主题吗?你还记得在你的窗口过程中调用 DefWindowProc 吗?
标签: c++ window gdi createwindow