【问题标题】:How to get the size and position of a button control of a dialog in a resource file?如何获取资源文件中对话框的按钮控件的大小和位置?
【发布时间】:2019-04-19 07:23:50
【问题描述】:

我正在尝试以编程方式设计一个根据屏幕分辨率调整大小的对话框菜单,并且我可以使用对话框的nameID 来获取对话框的大小和位置,以下是这个问题:

Get Dialog Size as defined in resource file

但是,我在尝试获取对话框中按钮控件的大小和位置时遇到了麻烦。下面是资源文件中对话框的示例:

IDD_DLG DIALOG  0, 0, 300, 200
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,30,46,42,18
    PUSHBUTTON      "Cancel",IDCANCEL,145,46,42,18
END

我可以使用nameID(即IDD_DLG)获取对话框的大小和位置,但是否可以通过编程方式为DEFPUSHBUTTONPUSHBUTTON 获取相同的内容?

如果是这样,怎么做?谢谢!

【问题讨论】:

  • 如果您尝试以编程方式设计对话框菜单,那么使用资源脚本毫无意义...
  • @VTT 同意,但不幸的是,我需要使用资源文件作为基础以编程方式设计菜单
  • 既然你已经知道如何检索DLGTEMPLATE,那么如何进行应该是显而易见的:"[DLGTEMPLATE] 结构,总是在标准模板中的第一个对话框,还指定对话框中控件的数量,因此指定模板中后续 DLGITEMTEMPLATE 结构的数量。” 文档描述了项目的精确布局。

标签: c++ mfc


【解决方案1】:

MFC 允许自动重新定位/调整子按钮的大小。在资源属性页面,点击对话框按钮,进入动态控制部分,为每个按钮启用动态调整大小/移动。

要找到按钮的坐标,相对于对话客户端窗口的左上角:

使用GetWindowRect 在屏幕坐标中查找按钮矩形。然后将屏幕坐标转换为客户端坐标:

CMyDialog::OnInitDialog()
{
    CDialog::OnInitDialog();
    CRect rc;
    CWnd *wnd = GetDlgItem(IDOK);
    wnd->GetWindowRect(&rc);
    ScreenToClient(rc);
    ...
    //move/resize rc
    wnd->SetWindowPos(NULL, rc.left, rc.top, rc.Width(), rc.Height(), SWP_SHOWWINDOW);
}

【讨论】:

  • CWnd类中没有SetWindowRect方法,请检查
猜你喜欢
  • 2016-10-02
  • 2012-03-16
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多