解决Visual Studio 2015中字体虚化的问题

问题描述

不知道从哪天开始,我的VS2015中汉字有的变得虚化,如下图所示:


其中,可以明显看出来2处箭头所指字体虚化程度不一样,找了很久也没找到解决办法,有的说是因为硬件加速,有的说是字体问题,这些都尝试修改过,还是不行,连VS版本重置,重装都不行,一度怀疑是操作系统的问题,最后只能忍着。

解决办法

今天无意间瞟到窗口下面一处:


上图箭头所指之处,表示字体大小为原始大小的98%,也许这就是虚化的原因了。将其手工改到100%,虚化问题终于得以解决:

问题原因

因为字体缩放经常使用Ctrl+鼠标滚轮来操作,每次滚动缩放并不是以1%为间隔,无意间操作可能使得无法回到100%的位置,微小的字体大小差别可能会引起不同文字渲染出现不同的状态,导致一部分文字虚化。

而窗口下的字体百分比又很容易被忽略(用VS将近8年了,第一次发现这个),因为设置太明显,各种入口较深首选项设置也不会有针对文字缩放的设置,所以这个问题从发现到今天解决,过去了大半年,这大半年眼睛实在是受累,写篇文章说明一下。

其实从客户端设计方面解决这个问题的方法也很简单,不管滚动步进是多少,到100%处一定做一个间隔点就行了,这样就不会发生98%滚动一下变成108%的情况了。

Visual Studio 2013新建工程导入现有代码文件夹并且保持目录结构

本文提供了一个在Windows环境下使用Visual Studio 2013编辑现有源代码并且保持目录结构的方法。

本文使用VS2013中文社区版做示例(本版本为免费版,可在VS官网下载),其他版本的VS操作方式类似。

  • 打开VS2013,选择【菜单】-【文件】-【新建】-【从现有代码创建项目】

img_566f6a72198a4.png

  • 选择项目类型:Visual C++

img_566f6a820aa70

  • 项目文件位置:创建完成后会在这个目录生成sln,suo,vcxproj,filters和user等VS解决方案和项目文件,这个必须和源代码的根目录保持一致,否则不能导入文件夹结构。
  • 项目名称填所需项目
  • 最后去除勾选【在解决方案资源管理器中显示所有文件】,避免文件太多

img_566f6a87e9f8f

  • 因为代码是Linux代码,并不需要在Windows下编译,所以选择使用外部生成系统即可

img_566f6a905d740

  • 无需编译的话,直接选择下一步

img_566f6a96ec2b8

  • 完成项目生成向导

img_566f6a9d3469b

  • 项目生成中,如果文件较多,会需要一些时间

img_566f6aa306436

  • 如果源文件来源于网络映射盘(比如笔者这里使用的是Linux的Samba共享磁盘),会弹出安全警告,去除勾选选择确定即可。

img_566f6aa987432

  • 项目创建好后,在解决方案资源管理器中会出现所有筛选过后项目目录的源文件,是未分文件夹的。如果看不到解决方案资源管理器,可以在【菜单】-【视图】中打开。

img_566f6ab0d17e4

  • 上面不分文件夹的源文件并不是我们想要的,如果需要分文件夹,在解决方案资源管理器中点击【显示所有文件】图标,如下图所示。点击之后,会出现文件夹。并且会在文件图标上标示出该文件是否属于项目文件。

img_566f6ab6bc306

  • 如果源代码路径文件有更新,比如增加或者删除文件,在解决方案资源管理器中点击刷新按钮,即可看到最新的文件状态。如果要将新文件添加进项目进行管理,则在新文件上点击右键,选择【包括在项目中】即可,添加后文件图标也会做出相应改变。

img_566f6abc02fb8

  • 由于源代码是Linux下,Linux的头文件与VS默认的头文件不一致,会导致很多头文件找不到或者是不匹配,影响代码提示和阅读。解决方法是添加Linux的头文件到Include路径。下面是具体操作方法:
  • 在解决方案资源管理器中右键项目,选择【属性】。

img_566f6ac674752

  • 在弹出的属性页中,找到VC++目录,其中的包含目录填上Linux下的头文件目录。

img_566f6ad15c6e5

  • 关于Linux的头文件如何获得,可以在Linux下使用Samba服务端,执行下面的命令后将所需的头文件复制到用户目录(保证用户目录没有usr目录),在Windows上连接Samba,将usr目录复制出来。
  • 复制完成后,将下面的路径粘贴至VS中即可(64位),其中【D:\Code\Linux\Ubuntu\】为Windows下对应Linux的根目录
  • 修复VS中__cplusplus宏固定为199711L导致无法识别C++11新增特性的办法
    比如<unordered_set>头文件中,定义了如下语句,导致VS包含的实际上是一个c++0x_warning.h的文件,无法真正识别unordered_set的实现:

    在网上找了很久,也没找到修改VS内置__cplusplus宏的方法,只能曲线救国了,即将所有头文件中201103L改成199711L即可,具体操作如下:

    • 将复制到Windows下的头文件路径重新打包(比如:D:\Code\Linux\Ubuntu\,因为复制到Windows前有很多符号链接,不能修改,所以最好重新在Windows下打包生成一份新的纯文件)在Linux下解压后执行:

    • 执行后将源文件复制回来即可。
  • 创建完成后项目文件目录会生成以下项目文件,以后需要打开项目直接双击sln解决方案文件即可

img_566f6ad923388

参考资料:

使用C#解决部分Win8.1系统窗口每隔几秒失去焦点的问题

使用了Win8.1 With Update 1后,发现重启系统后,当前激活的窗口总是每隔几秒失去焦点,过0.5~1秒焦点回来,导致输入无法正常工作,严重影响使用心情和效率。

在网上找了很久,也没找到相应的解决办法,大多提供的是关闭计划任务中禁用阿里巴巴的自动更新任务(http://www.paopaoche.net/gonglue/21442.html)。可是这个方法对我来说并不管用,而且那种是1小时运行一次,我的系统是每隔几秒就会出现一次。

忍受了1周,忍无可忍,于是决定自己解决。

窗口失去焦点,无非就是别的窗口将焦点抢占过去,如果能找到是什么程序抢占了窗口焦点,禁用之就可以解决。

因为是解决Windows问题,使用微软自家的C#解决问题。

打开VS创建C# Windows应用程序工程,使用一个Lable显示信息,一个Timer定时获取当前激活窗口(毫秒级),并且将信息显示到Lable即可。当前台窗口焦点改变,从Lable中可以看到当前前台程序。

最终发现,是Broadcom 802.11 Network Adapter Wireless Network Tray Applet抢占了窗口焦点。

网上对其作用解释为:安装在一些使用无线网卡的戴尔计算机上。它产生一个系统托盘图标,通过它,用户可以直接访问无线网卡的各种配置功能。

看来没什么作用,将其在任务管理器启动项中禁用,重启系统,无线网卡功能正常,问题完美解决。

附上监控程序部分逻辑代码(未使用任何编码规范,未加任何注释),窗口代码使用窗口设计器生成即可。