如何在MFC中设置对话框的默认大小(以像素为单位)

时间:2012-10-04 08:21:56

标签: c++ mfc dialog

我想设置对话框的默认大小(以像素为单位),比如640像素宽和384像素高。 default的意思是,第一次调用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);

原来,dialogUnitX320dialogUnitY192,但当我将对话框设置为320 * 192时,我得到了什么CXXXDlg::OnSize(UINT nType, int cx, int cy)640 * 384不是560 * 336而是{{1}}。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

Window Rect 指定包含整个窗口的区域。它包括客户区域和非客户区域。可以通过调用GetWindowRect(或其MFC等效项)来检索它。它还可用作MoveWindowSetWindowPos等函数的输入。

Client Rect 是非客户区域未占用的窗口区域。可以通过调用GetClientRect来查询它。客户端rect维度传递给WM_SIZE消息处理程序。

如果某个应用程序需要特定大小的客户区,则可以通过调用AdjustWindowRectAdjustWindowRectEx来计算相应的窗口矩形。

窗口rect通常用屏幕坐标表示,而客户端rect使用客户端坐标。两个坐标系都代表设备像素。原点位于屏幕坐标主显示屏的左上角,客户端坐标的客户区左上角。要在坐标系之间进行转换,应用程序使用ClientToScreenScreenToClient

对话框模板在对话框模板单元中指定尺寸和位置。对话框模板单元与对话框的字体直接相关。要在对话框模板单元和设备像素之间进行转换,应用程序会调用MapDialogRect。没有API调用来计算反向。应用程序必须手动执行计算:

width  = MulDiv(width,  4, baseunitX);
height = MulDiv(height, 8, baseunitY);

如果应用程序想要动态限制窗口大小,它可以处理WM_GETMINMAXINFO消息并填充具有所需维度的MINMAXINFO结构。当窗口的大小或位置即将发生变化时,此消息将发送到窗口。