解决MFC应用程序在调整系统比列放大后出错问题心得

公司有一个屏幕书写的软件,06年开始开发的,至今已八年之久,目前处于维护阶段,在接到这个任务前我也没机会接触这个项目的代码

日前,客户反应在系统比列调整为150%出现界面显示不正常、笔记偏移、笔记画出屏幕崩溃等问题。更坑人的是,经过测试部测试发现在不同的主机上有不同的现象,后来在我的自己的开发机上运行有问题,但是比较少。因为我现任的直属领导就是当前这个项目的主力之一,他也觉得很诡异,让我更诡异的是他居然帮这个任务交给了我。

好吧,硬着头皮上吧,花了三天时间来熟悉代码和软件,在这个过程中发现有时重启启动之后,会出现不同现象(此时应该想到,是不是有别的程序影响了呢?)。经过自己的思考和调整终于找到了和那个诡异的程序和原因!!!

经过和那个诡异程序的开发者沟通,他们这是一个守护进程,不断和修改显卡的属性,而我们程序大部分获取屏幕的分辨率采用的都是GetSystemMetrics(SM_CXSCREEN)返回,假如当前分辨率为1024*768,系统放大比列为150%,正常GetSystemMetrics(SM_CXSCREEN)获取到的值应该为1024*2/3,而当那个诡异的程序运行时GetSystemMetrics(SM_CXSCREEN)依然是1024,导致整个主程序界面放大、轨迹偏移。当时测试用了如下四种方法获取系统分辨率GetSystemMetrics(SM_CXSCREEN)、GetSystemMetrics(SM_CXFULLSCREEN)、GetDeviceCaps、QueryDisplayConfig四种方法获取系统分辨在,关闭诡异程序时,回去值分别时1024*2/3、1024*2/3、1024*2/3、1024,而打开诡异程序时,返回值分别值1024、1024*2/3、1024、1024。

至于后面解决的方法,就是根据不同方法获取的分辨率的比列来调整咯!!!

关于DPI的参考文档:http://www.cppblog.com/weiym/archive/2014/02/18/205841.aspx

解决MFC应用程序在调整系统比列放大后出错问题心得,布布扣,bubuko.com

时间: 2024-11-03 05:31:57

解决MFC应用程序在调整系统比列放大后出错问题心得的相关文章

VS2010的MFC对话框程序中添加菜单栏的过程

VS2010的MFC对话框程序中添加菜单栏的过程 最近在看一个用MFC写的界面的项目的代码,在代码和界面中一直没有看到关于菜单控件是如何添加进对话框的,于是就百度了下.结果,与其它控件(Button等)添加的方式不一样: VS2010的MFC对话框程序中添加菜单栏的过程大致分了这五步. 一.将Menu加入Resource视图中 在WorkSpace中的Resource视图下,在左边目录的任意位置上,先右键-->选择Insert Resource(插入资源)选项,在弹出的对话框中选择Menu以后,

[转]隐藏基于对话框的MFC应用程序窗口的方法

隐藏基于对话框的MFC应用程序窗口的方法 (推荐这个方法,非常好用) 很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题: 在 C***App::InitInstance() 的函数中将以下的这一段注释掉: C***Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); i

MFC应用程序框架(转)

对于程序员来说,如果要提高编程效率,一个好用的,功能强大的并且可以得心应手使用的编程工具往往会给我们程序员带来莫大的方便.其实对于现在的编程工具来说,使用哪一种工具都不是问题的关键,重要的是你能够使用到什么程度,毕竟现在的工具都是非常的强大,对于一般的编程任务来说还没有不能够胜任的工具,否则的话恐怕他就不可能在这个世界上存在哪怕是只有一个月的生命. 但是根据个人所好以及周围的人的影响,我们都会去使用某一种或者几种工具.比较Visual Basic .C++ Builder和Delphi等编程工具

双缓冲解决控制台应用程序输出“闪屏”(C/C++,Windows)

使用 C 语言编写游戏的小伙伴们想必起初都要遇到这样的问题,在不断清屏输出数据的过程中,控制台中的输出内容会不断地闪屏.出现这个问题的原因是程序对数据处理花掉的时间影响到了数据显示,或许你可以使用局部覆盖更新方法(减少更新数据量)来缓解闪屏,但是这种方法并不适用于所有场合,尤其是更新数据本身就非常大的场合. 本文将讲述解决控制台应用程序输出闪屏的终级解决方法——双缓冲. 问题呈现 下面的代码演示了在高速不断清屏输出数据的过程的闪屏问题,特邀您一试: 1 2 3 4 5 6 7 8 9 10 11

解决JQuery中datatables设置隐藏显示列多次提交后台刷新数据的问题

此次项目开发过程中用到了Jquery的Datatables插件,无疑他是数据列表展示,解决MVC中同步过程中先走控制器后返回视图,查询数据过程中无法提示等待的弊端, 而且他所提供的各种方法也都有较强的实用性.但是再好的程序也会有瑕疵,项目开发中就遇到了其提供的设置隐藏显示列的方法 table.fnSetColumnVis(colShowDic_key[i], true);//colShowDic_key[i]为列的索引.会多次提交刷新数据(有多少列会提交刷新多少次). 为解决这个问题尝试了很多种

隐藏基于对话框的MFC应用程序窗口的方法

隐藏基于对话框的MFC应用程序窗口的方法 (推荐这个方法,非常好用) 很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题: 在 C***App::InitInstance() 的函数中将以下的这一段注释掉: C***Dlg dlg; m_pMainWnd = &dlg; int nResponse = dlg.DoModal(); i

鸡啄米MFC教程笔记之二:MFC应用程序框架分析

这一节鸡啄米就为大家分析下MFC应用程序框架的运行流程. 一.SDK应用程序与MFC应用程序运行过程的对比 程序运行都要有入口函数,在之前的C++教程中都是main函数,而Windows应用程序的入口函数是WinMain函数,MFC程序也是从WinMain函数开始的.下面鸡啄米就给出用Windows SDK写的“HelloWorld”程序,与MFC应用程序框架进行对比,这样能更好的了解框架是怎样运行的.Windows SDK开发程序就是不使用MFC类库,直接用Windows API函数进行软件开

MFC画图程序解析笔记一

这是 //if not define的简写,是宏定义的一种,它可以根据是否已经定义了一个变量来进行分支选择,一般用于调试等等.实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译. 目录 1定义 2内容 3作用 4形式 1定义编辑 #define x ... #endif C语言在对程序进行编译时,会先根据预处理命令进行"预处理".C语言编译系统包括预处理,编译和链接等部分. #ifndef x //先测试x是否被宏定义过 #define x 程

VC++MFC对话框程序中给对话添加背景图片

VC对话框怎么显示背景图片呢.在MFC中实现背景图片,不像C#应用程序那么简单.今天就和朋友们说说如何在VC界面中设置背景图片 ^_^ 工具/原料 Visual C++ 2010 方法一:用Picture控件 1 新建MFC应用程序 2 在应用程序中,选择基于对话框,其他保持默认即可 3 右击项目,选择添加-资源 4 在添加资源对话框中,点击导入,选择要作为背景的图片 jpg格式的图片可以用画图打开另存为bmp格式 (网上说可以直接jpg格式,自行实验未成功) 下方对话框中资源类型选为bitma