根据客户端矩形大小创建窗口并调整其大小

问题描述 投票:0回答:1

我正在开发一个机器人图形应用程序,我正在尝试创建一个窗口并根据 Windows 客户端矩形大小调整窗口大小。

基本上,我有许多当前为 21x21 的单元格(矩阵或二维数组),我使用 pdc->Rectangle( LocalMapCellRect ); 在客户端区域中绘制它们。这将基于当前画笔和笔绘制单个单元格。单元格的大小是客户端大小除以单元格数量 X 或 Y。参见图片

我的问题有两个: (一)在最初创建窗口时根据所需的客户端大小来创建窗口/调整窗口的大小。目前我回避它:

int InitialWindowSize_X = 420; int InitialWindowSize_Y = 400;

SetWindowPos( &wndNoTopMost , 50, 250, InitialWindowSize_X , InitialWindowSize_Y , 0 );

(二) 当我使用鼠标调整窗口框架大小时,我不知道如何让客户端大小驱动窗口大小,这样我就没有未绘制的区域。看图

我找到了一个名为AdjustWindowRect()的函数,它应该将窗口大小调整为所需的客户端大小,但我无法让它工作。

我在这上面花了几个小时,但我只是卡住了,所以请提供一些指导,或者更好的编码示例会很棒。 非常感谢IMK 在此输入图片描述

windows graphics mfc
1个回答
0
投票

这里发生了几件事。

  1. 您可能使用整数作为大小。 如果单元格的数量没有均匀地划分为客户区域的大小,结果将被截断,并且您将出现不足,如图所示。 一种选择是将网格放在客户区域的中心,并接受会有一个小边距。 另一种选择是使用不同的图形 API,它允许您使用浮点坐标和大小。

  2. Windows 可能认为您的程序没有关注显示器的每英寸点数 (DPI)。 除非 Windows 知道您的程序是“DPI 感知”的,否则它将尝试缩放您使用的坐标和大小以及您在使用时提供的坐标和大小,例如,对于客户端矩形的大小。 在某些情况下,缩放的应用不一致,这使得几乎不可能使事物达到像素完美。 如果您使用的是 Visual Studio 项目,则可以在清单工具 | 下设置项目属性。输入和输出| DPI 感知到“高 DPI 感知”。 如果您不使用 Visual Studio 项目,请搜索 Microsoft 文档以了解如何为您的 IU 线程设置 DPI 感知上下文。

  3. 如果这是在顶级窗口(而不是子窗口)的客户区中完成的,您可以尝试处理 WM_GETMINMAXINFO 和 WM_NCCALCSIZE 消息,以限制用户选择可被窗口数量整除的窗口大小。细胞。 这很难做到正确。

  4. 如果您有一个代表客户区域的 RECT,并且需要一个代表窗口区域的 RECT(包括标题栏和框架等非客户部分),则可以使用 AdjustWindowRectEx。 如果您的程序支持 DPI,并且您避免了菜单栏在窗口非常窄时可能会换行的极端情况,那么它可以准确地计算出您需要的内容。

© www.soinside.com 2019 - 2024. All rights reserved.