jjzjj

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

coder 2024-02-20 原文

在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() 预期的大小在处理对话框边框的大小;但还没有完全追踪以查看当我更改边框大小时有什么变化。

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

最佳答案

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/

有关c++ - 从 VS2010 切换到 2012 或更高版本后 MFC 对话框边框填充发生变化的更多相关文章

  1. ruby-on-rails - Railstutorial : db:populate vs. 工厂女孩 - 2

    在railstutorial中,作者为什么选择使用这个(代码list10.25):http://ruby.railstutorial.org/chapters/updating-showing-and-deleting-usersnamespace:dbdodesc"Filldatabasewithsampledata"task:populate=>:environmentdoRake::Task['db:reset'].invokeUser.create!(:name=>"ExampleUser",:email=>"example@railstutorial.org",:passwo

  2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  3. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  4. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  5. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  6. Ruby#index 方法 VS 二进制搜索 - 2

    给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:

  7. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

  8. ruby - Sinatra + Heroku + Datamapper 使用 dm-sqlite-adapter 部署问题 - 2

    出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t

  9. ruby-on-rails - lovdbyless VS 社区引擎……哪个最好? - 2

    随着ruby​​被引入为新的编程救世主,我想知道是否有人基于易用性、运行所需的资源、可用性和易定制性而有偏好。两者有更好的吗? 最佳答案 好吧,任何基于Rails的社交网络应用程序的比较都应该包括insoshi(http://portal.insoshi.com/)。话虽这么说,这三个都非常相似,区别在于实现细节。Lovd和Insoshi都是完整的Rails应用程序;它旨在供您将它们用作入门工具包,并使用您自己的自定义功能对其进行扩展。另一方面,CommunityEngine是一个Rails插件。这意味着您可以更轻松地向现有Rail

  10. ruby-on-rails - 我现在(2010 年 1 月)应该使用哪个版本的 Ruby? - 2

    我有1.8.6附带的VanillaMacOSXLeopard。我是RoR的新手,所以会学习网上的教程。在使用更高版本的Ruby时,我是否可能会发现遵循它们的问题?我目前正在查看提到1.8.6和1.8.7的这个-http://www.railstutorial.org/book 最佳答案 RoR教程对两者都适用,但如果您正在学习Ruby,则应该学习1.9。Rails3将不支持1.8.6,所以我会选择1.8.7或1.9。我还推荐使用RVM在Ruby版本之间切换。 关于ruby-on-rail

随机推荐