3

我想以像素为单位设置对话框的默认大小,比如 640 像素宽和 384 像素高。我的意思default是,当第一次CXXXDlg::OnSize(UINT nType, int cx, int cy)调用时,值为cx640,值为cy384。场景对话框的默认大小以对话框为单位,我可以使用MapDialogRect()来转换对话框单位到像素,我该如何做相反的事情?和可以设置对话框的大小,但不能设置MoveWindow()默认大小。我也尝试过这样的GetDialogBaseUnits()SetWindowPos()

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);

原来dialogUnitX是 is320dialogUnitYis 192,但是当我将对话单元设置为 时320 * 192,我得到的CXXXDlg::OnSize(UINT nType, int cx, int cy)不是640 * 384but 560 * 336。有任何想法吗?

4

1 回答 1

4

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

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

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

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

Client Rect是窗口中未被非客户区占用的区域。可以调用查询GetClientRect。客户端矩形维度被传递给WM_SIZE消息处理程序。

如果应用程序需要其客户区的特定大小,它可以通过调用AdjustWindowRect或计算相应的窗口矩形AdjustWindowRectEx

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

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

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

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

于 2013-07-23T23:21:24.377 回答