切换显示器时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
相关产品推荐
相关产品推荐

