让你的应用程序支持高对比度模式

简介:

常看我的blog的网友可能都比较熟悉我使用的Windows主题,就是那个黑白高对比(HighContrast)了,这个主题虽然不是很popular,但还是有其根源的,应用程序支持HighContrast是属于"创建具有辅助功能的 Windows 应用程序"的范畴的一个case。

    创建具有辅助功能的应用程序有重要的商业意义。许多政府都有针对软件购买的辅助功能法规。“Certified for Windows”徽标包括辅助功能要求。据估计仅美国就有三千万居民(其中许多是潜在的客户)受到软件辅助功能的影响。----msdn

    高对比度模式是一种 Windows 系统设置主题,它通过使用对比鲜明的色彩和字体大小提高文本的可读性。这个色彩配置既然属于Windows的一个辅助功能,原意是为了保证视力受损用户查看信息预置的选项。可是对于程序员或者每天工作都是面对电脑的用户,这个设置也有保护视力的作用,特别是程序员需要长时间专著的注视屏幕。Windows普通色彩主题,屏幕上的高亮色彩区域一般在60-70%。大家都知道普通CRT显示器是靠电子激活荧光物质发光,屏幕越亮,射到屏幕上的电子束强度越大,而黑色的区域是没有电子激活的地方。高亮对于屏幕刷新率要求也高,如果显示器刷新率在85Hz以下,其实对眼睛伤害很大的,如果在75Hz及以下,明显能感觉闪烁。而75Hz的刷新率在HighContrast模式下,是感觉不到屏幕闪烁的。

    如果我们要在我们的程序中支持HighContrast,我们可以通过Windows API SystemParametersInfo来读出并判断系统的颜色主题是否为黑白高度比度。在.NET下就更容易了,有个专门的bool System.Windows.Forms.SystemInfo.HighContrast属性用来判断系统的色彩主题。如果我们启用了黑白高对比(即SystemInformation.HighContrasttrue),则应用程序应当需要注意以下几个方面的问题:

  • 使用系统配色方案显示所有用户界面元素
  • 用可视提示或声音传递任何通过颜色传递的信息。例如,如果特定列表项用红色字体突出显示,则可以将字体改为粗体,这样用户就得到一种有关突出显示项目的非颜色提示。
  • 忽略文本后面的任何图像或图案

    应用程序应当在启动时检查 HighContrast 的设置并响应系统事件 UserPreferenceChanged。每当 HighContrast 的值更改时,就引发 UserPreferenceChanged 事件。SystemColors 类用来将标签的颜色设置更改为用户选定的系统颜色。


    在WinForm程序中有效的启用高对比模式,我们需要以下步骤:

    1、创建一个方法以将Label的颜色设置为系统颜色。  

private  void SetColorScheme()
{
    if (SystemInformation.HighContrast)
   {
      companyLabel.BackColor = SystemColors.Window;
      companyLabel.ForeColor = SystemColors.WindowText;
   }
    else
   {
      companyLabel.BackColor = Color.Blue;
      companyLabel.ForeColor = Color.Yellow;
   }
}

    2、在窗体构造函数中为 public class Form1中调用 SetColorScheme 过程。
public Form1()
{
   InitializeComponent();
   SetColorScheme();
}

    3、使用适当的签名创建一个事件过程,以响应 UserPreferenceChanged 事件。
public  void UserPreferenceChanged( object sender, 
Microsoft.Win32.UserPreferenceChangedEventArgs e)
{
   SetColorScheme();
}

    4、在窗体构造函数中对InitializeComponents的调用后面添加代码,以便将事件过程挂钩到系统事件上。此方法调用 SetColorScheme 过程。
public Form1()
{
   InitializeComponent();
   SetColorScheme();
   Microsoft.Win32.SystemEvents.UserPreferenceChanged 
      +=  new Microsoft.Win32.UserPreferenceChangedEventHandler(
       this.UserPreferenceChanged);
}

    5、在调用基类的 Dispose 方法之前,向窗体的 Dispose 方法添加代码,以在关闭应用程序时释放事件。
protected  override  void Dispose(  bool disposing )
{
    if( disposing )
   {
       if (components !=  null
      {
         components.Dispose();
      }
   }
   Microsoft.Win32.SystemEvents.UserPreferenceChanged 
      -=  new Microsoft.Win32.UserPreferenceChangedEventHandler(
       this.UserPreferenceChanged);
    base.Dispose( disposing );
}
    注意   系统事件代码运行一个独立于主应用程序的线程。如果不释放事件,则即使程序关闭后挂接到该事件上的代码也将运行。

    同样我们的WebApplication也是可以支持Windows的配色方案,在适当的时候根据Windows的主题配置同时变化。
    下面是Web中的system color table,分别是HighContrast Style、Classtical Style和WindowXp Style,以供对比参考:

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

目录
相关文章
|
Java fastjson API
Springboot 整合 xxljob 动态API调度任务(进阶篇)
Springboot 整合 xxljob 动态API调度任务(进阶篇)
8398 0
Springboot 整合 xxljob 动态API调度任务(进阶篇)
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
数据采集 人工智能 自然语言处理
《深度融合:DeepSeek无缝嵌入现有业务系统全攻略》
在数字化转型中,企业利用人工智能提升效率和创新能力。DeepSeek作为强大的大语言模型,以其出色的推理能力为企业带来新机遇。集成DeepSeek需经过系统评估、需求分析和技术选型,选择API调用或私有化部署。通过接口对接、数据预处理和模型优化,逐步实现深度融合。最后,进行全面测试确保集成效果,为企业业务创新注入强大动力。
1255 0
|
安全 数据挖掘 定位技术
工厂内部导航系统:高精度定位与智能路径规划的技术实现
工厂内部导航系统其核心功能包括实时定位、智能路径规划、车辆警告及数据分析,显著提升了物流效率和管理水平。系统具备高精度定位、灵活部署及跨平台兼容等技术优势,并已在实际项目中取得显著成效。
761 11
工厂内部导航系统:高精度定位与智能路径规划的技术实现
|
Linux Docker Windows
Windows——Docker拉取Windows Server镜像
Windows——Docker拉取Windows Server镜像
882 0
|
JSON JavaScript 前端开发
服务器通信:使用WebSocket与后端实时交互
【4月更文挑战第24天】WebSocket为解决服务器与客户端实时双向通信问题而生,常用于聊天、游戏和实时通知等场景。本文通过4步教你实现WebSocket通信:1) 客户端使用JavaScript创建WebSocket连接;2) 监听`open`、`message`和`close`事件;3) 使用`send`方法发送数据;4) 使用`close`方法关闭连接。服务器端则需处理连接和数据发送,具体实现依后端技术而定。WebSocket为现代Web应用的实时交互提供了强大支持。
1456 3
|
机器学习/深度学习 人工智能 测试技术
【机器学习】R-squared系数有什么缺点?如何解决?
【5月更文挑战第20天】【机器学习】R-squared系数有什么缺点?如何解决?
|
SQL 缓存 Java
Hive 之 UDF 运用(包会的)
Hive的UDF允许用户自定义数据处理函数,扩展其功能。`reflect()`函数通过Java反射调用JDK中的方法,如静态或实例方法。例如,调用`MathUtils.addNumbers()`进行加法运算。要创建自定义UDF,可以继承`GenericUDF`,实现`initialize`、`evaluate`和`getDisplayString`方法。在`initialize`中检查参数类型,在`evaluate`中执行业务逻辑。最后,打包项目成JAR,上传到HDFS,并在Hive中注册以供使用。
881 2
技术指标和振荡器大全(三)(4)
技术指标和振荡器大全(三)(4)
243 0
|
机器学习/深度学习 存储 算法框架/工具
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(2)
TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(2)
287 0

热门文章

最新文章