gpt4 book ai didi

c++ - 从 VS2010 切换到 2012 或更高版本后 MFC 对话框边框填充发生变化

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:00 31 4
gpt4 key购买 nike

在VS2015中重建一个MFC应用程序后,Windows设置的border padding从添加到对话框框的外部改为添加到对话框框的内部。由于更改而不是粗边框使对话框变大,因此对话框大小保持不变并且可用于控件的空间量减少。

边框填充的默认值在不同版本的 Windows 之间发生了变化。当 Vista 出现时,它从一个较小的值(0?)变为 4 像素,以使玻璃更加引人注目,并且似乎一直保持到 8.x,只是在 Win10 中回落到 0。 (注意,我工作时没有任何 8/10 机器可用,因此我要离开 Google。)

这意味着控件的空间量在不同的 Windows 版本之间是不同的。因此,似乎不可能有在所有版本的操作系统上看起来都不错的对话框。如果我将它们放置在 V7/8 中默认的 4px 边框上,我最终会在默认 W10 系统的底部/右侧看到大量额外空间。如果我针对 W10 进行优化,我的底部按钮将在 W7/8 上被切断。

这不会发生在一个干净的测试项目中,所以它与我的应用程序中的特定代码有关。

我附上了一张图片,显示了在 VS2010 或更新版本中构建的应用程序中 0 像素边框与 4 像素边框的外观。图片标题为 VS2015;但额外的测试确定更改是在 V110 运行时 (Visual Studio 2012) 中引入的。

在使用 MoveWindow() 将较小的对话框定位在主对话框周围的代码中,对话框的大小似乎变得困惑。

我已经提取了执行下面一个对话框所涉及的代码:

RECT             DlgRect;
double Fx, Fy, Fw, Fh; // the dialog in the screenshots
double Px, Py, Pw, Ph; // another dialog
double ScreenHeight = (double)GetSystemMetrics(SM_CYSCREEN);

g_pRedactedDlg = new CRedactedDlg(NULL);
g_pRedactedDlg->GetClientRect(&DlgRect);
Fw = DlgRect.right + 10; // 10
Fh = DlgRect.bottom + 20; // 20

Py = 100; //size and position data for a different
Ph = 50; //dialog, calculated in code not shown

Fx = 0.0;
Fy = ((Py + Ph + 5.0 + Fh) > ScreenHeight) ? (ScreenHeight - Fh) : (Py + Ph + 5.0);

g_pRedactedDlg->MoveWindow((int)Fx, (int)Fy, (int)Fw, (int)Fh, TRUE);

根据@snowdude 和@MichaelWalz 的评论,我怀疑从 GetClientRect() 获得的大小和 MoveWindow() 预期的大小在处理对话框边框的大小;但还没有完全追踪以查看当我更改边框大小时有什么变化。

enter image description here

仅供引用,边框填充设置位于:控制面板 - 个性化 - 窗口颜色 - 高级外观设置 - 边框填充。

最佳答案

GetWindowRect()MoveWindow() 的行为在 VS2010 和 2012 之间发生了变化。在 2010 年,GetWindowRect() 返回对话框没有边框填充的区域,并且 MoveWindowRect() 期望对话框区域带有它;渲染对话框的大小添加了填充。在 2012 年,对话框区域返回并添加了填充,并且没有向呈现的对话框大小添加填充。

这是在 MS Connect 上报道的并追踪到链接器标志。 /SUBSYSTEM:WINDOWS,5.01 提供旧行为,/SUBSYSTEM:WINDOWS,6,00 提供新行为。 VS2015s 似乎不允许指定要在此处传递的版本。 Project Properties-Linker-All Options-Subsystem,是一个下拉框,只有一个Windows选项。

重大更改可能是删除 compatibility hack 的结果这是在 Vista 发布时添加的。

对于我的应用程序,我通过使用 GetWindowRect() 代替 GetClientRect() 来计算对话框的大小,然后添加硬编码填充值来解决此问题。

g_pRedactedDlg->GetWindowRect(&DlgRect);
Fw = DlgRect.right - DlgRect.left;
Fh = DlgRect.bottom - DlgRect.top;

这不会产生与旧版本相同的行为,因为硬编码的高度偏移量在 Windows 7 下太小了 12 像素,并且会截断对话框的底部,如 RC 设计器中所示。在旧版本的 Windows 下,偏移量可能是正确的; MFC 代码库至少可以追溯到 Visual Studio 97/NT4。

关于c++ - 从 VS2010 切换到 2012 或更高版本后 MFC 对话框边框填充发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33880221/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com