0

我有一个动态生成对话框的应用程序。我曾经使用 Visual Studio 6.0 构建它。不久前切换到 VS2013,并进行了必要的调整以使其构建。直到最近才真正发布该应用程序。然后用户注意到了 Windows 7 Aero 边框填充问题(在此处的另一篇文章中提到)我的对话框最终小于请求 - 即 Aero 边框填充是从我请求的窗口大小中获取的,而不是添加到其中,所以我的控件未按要求在窗口中正确居中。我已将桌面上的边框填充设置为 1,所以我从未注意到这个问题。

真正奇怪的是,当我构建应用程序进行调试时,这不会发生如果我并排运行调试版本和发布版本,您会看到对话框的大小因边框填充的厚度而异。我猜想链接的系统库的调试版本和发布版本对此行为有不同的实现。

在构建这些对话框的逻辑中,我计算出客户区域需要多大,然后在创建窗口之前添加框架度量。这是不正确的 - 即,是否有一种“更正确”的方法可以在所有版本的 Windows 和所有编译器上工作。

4

1 回答 1

0

好吧,有点答案。发布版本和调试版本报告的各种与边界相关的系统指标的值完全不同。

调试:SM_CXPADDEDBORDER=0,SM_CXBORDER=1,SM_CXSIZEFRAME=12,SM_CXFIXEDFRAME=3

发布:SM_CXPADDEDBORDER=8,SM_CXBORDER=1,SM_CXSIZEFRAME=4,SM_CXFIXEDFRAME=3

因此,一旦我将所有这些添加到我请求的窗口大小中,两个版本似乎都可以工作 - 尽管它们产生不同的结果。调试版本中不可调整大小的窗口没有填充边框,可调整大小的窗口有一个大边框,但它是“大小框架”而不是“填充”导致它。

有趣的是,当我查看我的项目属性时,调试配置中的链接器命令行有 /SUBSYSTEM:WINDOWS",5.01",而在发布配置中它只有 /SUBSYSTEM:WINDOWS。我在实际的 myapp.vcxproj 文件中没有看到 5.01,所以我认为 VS 2013 为调试配置动态插入“,5.01”以专门强制一些兼容模式。我试图在链接器“系统”部分中指定它,但我的更改没有显示在命令行上。任何人都知道是否可以(或建议)手动设置它?

于 2016-06-02T17:48:20.777 回答