如何在MFC中设置对话框的默认像素大小

3

我想设置对话框的默认大小,例如宽度为640像素,高度为384像素。我所说的“默认值”是指当第一次调用CXXXDlg::OnSize(UINT nType, int cx, int cy)时,cx的值为640,cy的值为384。由于对话框的默认大小是以对话框单位为单位的,因此我可以使用MapDialogRect()将对话框单位转换为像素。那么如何进行反向转换呢?MoveWindow()SetWindowPos()可以设置对话框的大小,但不能设置默认大小。我也尝试过使用GetDialogBaseUnits(),像这样:

DWORD dw = GetDialogBaseUnits();
WORD m_duXx4 = LOWORD(dw);
WORD m_duYx8 = HIWORD(dw);
int dialogUnitX = MulDiv(640, 4, m_duXx4);
int dialogUnitY = MulDiv(384, 8, m_duYx8);

事实证明,dialogUnitX320,而 dialogUnitY192,但是当我将对话框单元设置为 320 * 192 时,在 CXXXDlg::OnSize(UINT nType, int cx, int cy) 中得到的不是 640 * 384 而是 560 * 336。有什么想法吗?

1个回答

4

一个窗口由客户区和非客户区组成。

客户区是窗口的一部分,应用程序在其中显示输出,例如文本或图形。

标题栏、菜单栏、窗口菜单、最小化和最大化按钮、调整大小边框以及滚动条被统称为窗口的非客户区

窗口矩形指定了包含整个窗口的区域。它包括客户区以及非客户区。可以通过调用GetWindowRect(或其MFC等价物)来检索它。它也作为MoveWindowSetWindowPos等函数的输入。

客户端矩形是窗口中未被非客户区占用的区域。可以通过调用 GetClientRect 查询它。客户端矩形的尺寸会传递给 WM_SIZE 消息处理程序。
如果应用程序需要特定大小的客户端区域,则可以通过调用 AdjustWindowRectAdjustWindowRectEx 计算相应的窗口矩形。
窗口矩形通常使用屏幕坐标表示,而客户端矩形使用客户端坐标。这两个坐标系统都表示设备像素。原点位于主显示器的左上角,用于屏幕坐标;用于客户端坐标的原点位于客户区域的左上角。应用程序使用 ClientToScreenScreenToClient 在坐标系统之间进行转换。
对话框模板以 对话框模板单位 指定尺寸和位置。对话框模板单位直接与对话框的字体相关。为了在对话框模板单位和设备像素之间进行转换,应用程序调用 MapDialogRect。没有 API 调用来计算相反。应用程序必须手动执行计算:
width  = MulDiv(width,  4, baseunitX);
height = MulDiv(height, 8, baseunitY);

如果一个应用程序想动态限制窗口大小,它可以处理 WM_GETMINMAXINFO 消息,并使用所需的尺寸填充 MINMAXINFO 结构。当窗口的大小或位置即将发生变化时,会向窗口发送此消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接