You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

切换显示器时MFC子对话框与父对话框错位问题排查

MFC选项对话框跨显示器布局错乱问题

我在MFC应用中创建了如下选项对话框:左侧带有树视图的父对话框,会根据选中的元素在右侧显示不同的子窗口,所有对话框均通过VS 2022设计器创建。

父对话框资源定义

IDD_GLOBAL_OPTIONS DIALOGEX 0, 0, 413, 337
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_CONTROLPARENT | WS_EX_APPWINDOW
CAPTION "Global Options"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,291,315,50,14
    PUSHBUTTON      "Cancel",IDCANCEL,348,315,50,14
    EDITTEXT        IDC_EDIT_GLOBAL_OPTIONS_NAME,123,14,275,12,ES_UPPERCASE | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP,WS_EX_CLIENTEDGE
    CONTROL         "",IDC_GLOBAL_OPTIONS_TREE,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_NOHSCROLL | WS_BORDER | WS_TABSTOP,7,15,108,294
END

子对话框资源定义

IDD_GLOBAL_OPTIONS_CONFIGPATHS DIALOGEX 0, 0, 297, 291
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CONTROL | WS_CHILD
FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN
    GROUPBOX        "Configuration directory",IDC_STATIC,10,15,279,52
    LTEXT           "Configuration data store location",IDC_STATIC,22,31,106,8
    CONTROL         "",IDC_MFCEDITBROWSE1,"MfcEditBrowse",WS_BORDER | WS_TABSTOP | 0x80,22,42,260,14
    GROUPBOX        "Personal data directory",IDC_STATIC,10,74,279,77
    LTEXT           "Personal data such as usernames, passwords and automated login information can be stored separately from all other configuration data",IDC_STATIC,22,89,260,23
    CONTROL         "Store personal data separately",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,22,116,115,10
    CONTROL         "",IDC_MFCEDITBROWSE2,"MfcEditBrowse",WS_BORDER | WS_TABSTOP | 0x80,32,128,250,14
END

子窗口初始化代码

在每个子对话框的OnInitDialog()中,我使用MoveWindow()定位子窗口:

BOOL CGlobalOptionsConfigPaths::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    //CWnd *pWnd = CGlobalOptionsConfigPaths::GetParent();

    CGlobalOptionsConfigPaths::MoveWindow(173, 30, 450, 480, true);
...
}

问题现象

在外部显示器上运行时一切正常,但切换到笔记本屏幕后布局错乱。我获取了父对话框和子对话框的RECT数据,本以为能发现两种显示器下的差异,但结果并非如此:

  • 外部显示器上父对话框RECT:{LT(305, 170) RB(941, 757) [636 x 587]}
  • 外部显示器上子对话框RECT:{LT(478, 200) RB(928, 680) [450 x 480]}
  • 笔记本屏幕上父对话框RECT:{LT(306, 177) RB(1047, 898) [741 x 721]}
  • 笔记本屏幕上子对话框RECT:{LT(479, 207) RB(929, 687) [450 x 480]}

两种场景下子窗口的左/上坐标均等于父窗口左/上坐标加上MoveWindow的参数,为何仍会出现布局错乱?


内容的提问来源于stack exchange,提问作者NiemandDenDuKennst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:29:55