【问题标题】:How to set the default size in pixels of dialog in MFC如何在 MFC 中设置对话框的默认大小(以像素为单位)
【发布时间】:2012-09-25 05:53:52
【问题描述】:

我想设置对话框的默认大小(以像素为单位),比如宽度为 640 像素,高度为 384 像素。我所说的default 的意思是,当第一次调用CXXXDlg::OnSize(UINT nType, int cx, int cy) 时,cx 的值为 640,cy 的值为 384。场景对话框的默认大小以对话框为单位,我可以使用MapDialogRect() 将对话框单位转换为像素,我该如何做相反的事情? MoveWindow() 和 SetWindowPos() 可以设置对话框的 eh 大小,但不能设置 默认 大小。我也尝试过这样的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);

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

【问题讨论】:

    标签: c++ mfc dialog


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2011-02-08
      相关资源
      最近更新 更多