百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

如何用界面组件DevExpress WinForm创建一个支持High DPI的应用?

bigegpt 2024-09-03 11:12 4 浏览

DevExpress WinForm拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

复制下面链接获取DevExpress 最新版:www.evget.com/product/740/download

DPI Awareness模式

DPI Awareness模式指定在高分辨率屏幕上显示应用程序的方式。

  • Unaware,此模式适用于Windows Vista之前的所有Windows版本。在这种模式下,应用程序假定所有显示都具有默认的96 DPI(100%)伸缩性。当在高DPI设备上显示时,应用程序的每个元素都以其原始大小呈现,然后将位图拉伸以匹配屏幕DPI,这以牺牲质量为代价保持了应用程序布局的完整性——模糊的图像、模糊的标题、粗的分隔线和边框等,您创建的任何WinForm应用程序最初都不支持DPI。
  • System,这种模式是在Windows Vista中引入的。在这种模式下,应用程序根据显示的DPI呈现,该DPI是用户会话启动时的主要显示。当显示在具有不同DPI值的显示器上时,Windows位图会缩放此类应用程序,这意味着只有一个DPI因子的应用程序仍然清晰,而在不同DPI因子的设备上变得模糊。
  • Per-Monitor和Per-Monitor V2,这些模式允许应用程序动态地适应具有不同DPIs的显示,因此应用程序在任何显示器上看起来都很清晰。在Per-Monitor模式下,Windows位图只缩放图像和非客户端区域,应用程序本身呈现应用程序的其余部分——作为开发人员,您需要跟踪系统wm_dpichanged*消息,获取当前显示的DPI,并根据这个值调整控件的大小/重新排列。第一个Per-Monitor模式是在Windows 8.1中引入的,在Windows 10创建者更新(构建1703)中,V2迭代取代了它,微软建议您始终使用Per-Monitor V2。

如何在DevExpress应用程序中DPI Awareness

要使基于DevExpress的WinForms应用程序能够感知DPI,请打开Project Settings Page并选择所需的感知模式。

或者,在应用程序启动时调用以下方法:

  • WindowsFormsSettings.SetDPIAware() - 启用System DPI感知模式。
  • WindowsFormsSettings.SetPerMonitorDpiAware() - 如果应用程序运行在Windows 1703或更新版本上,则启用Per-Monitor V2 DPI感知模式。在较旧的Windows版本上,应用程序在System感知模式下工作。

不要使用应用程序清单文件来启用DPI感知,因为这可能会导致许多问题(例如,与clickonce不兼容)。

在应用程序被设置为DPI-aware时,不要使用Microsoft Windows图形设备接口(GDI),这可能会导致意想不到的结果。也就是说不要使用任何图形对象,如位图、笔刷或字体。另外,不要调用可能使用它们的任何子系统(例如,不要将皮肤应用到应用程序)。

调用静态的(在VB.NET中共享)WindowsFormsSettings.ForcePaintApiDiagnostics方法,以确保正确激活DPI感知。

如何构建HDPI-Ready应用程序

常用推荐和设置

  • 避免在代码中创建和自定义控件,选择Visual Studio的设计时。
  • Visual Studio应该在标准的96 DPI屏幕上运行。
  • 将表单的AutoScaleMode 属性设置为Font或DPI。

控制尺寸和布局

因为您的应用程序需要根据显示的DPI值调整大小,保持布局灵活。如果可能,使用LayoutControl、TablePanel和StackPanel容器,当父容器大小发生变化时,这些容器会自动调整控件的布局。

Images

不管DPI感知模式、光栅图像缩放出现模糊时,要保持简洁的应用程序外观,请使用矢量图像:矢量皮肤和SVG图标。

如果您更喜欢栅格项目图标,可以使用DPIAwareImageCollection存储:它为每个DPI值存储独立的图像包,并根据显示在它们之间动态切换。

自定义绘制

许多DevExpress控件公开CustomDraw事件,允许您重绘控件元素。

在支持DPI Awareness之前,这些事件公开了返回Graphics对象的e.Graphics属性,您可以调用此对象的方法来绘制自定义形状和文本字符串。

C#

e.Graphics.DrawString(...);

VB.NET

e.Graphics.DrawString(...)

现在所有CustomDraw<VisualElement>事件参数都公开了返回GraphicsCache对象的e.Cache属性——图形的DevExpress对象,GraphicsCache公开了与标准图形类相同的API,并针对High-DPI和directx呈现的应用程序进行了优化,您应用始终使用e.Cache属性中可用的绘制方法。

C#

e.Cache.DrawString(...);

VB.NET

e.Cache.DrawString(...)

单独控件设置

  • BarManagerProperties.ScaleEditors 和 RibbonProperties.ScaleEditors - 这些BarAndDockingController属性允许编辑器在DPI因子改变时自动增加它们的大小。
  • BarManagerProperties.ScaleIcons 和 RibbonProperties.ScaleIcons - 另外两个BarAndDockingController属性,当设置为true时,栏和色带图标在较高的DPI值时自动增加。

故障排除

要跟踪所有不推荐用于DirectX-rendered和Per-Monitor DPI-aware应用程序的API时,请调用静态WindowsFormsSettings.ForcePaintApiDiagnostics方法,并将安全级别设置为第一个参数:

  • Throw - 不支持的API会导致异常;
  • Trace - 不支持的API在Visual Studio的“Output”窗口中显示警告结果;
  • Disable - 忽略了不受支持的API;

远程环境下图形性能优化

远程用户不断收到应用程序视觉外观的快照,应用程序的视觉效果越多,需要进行的更新就越多。如果连接很差且刷新率低,应用程序可能看起来没有响应。在一些低性能的环境中,您可能会遇到类似的问题,例如当您的目标是使用WinForms应用程序的嵌入式系统时。

要在远程环境中减少流量消耗并提高整体性能,可以有选择地禁用可选效果。

在v21.1或更新版本中,启用OptimizeRemoteConnectionPerformance属性以最小化视觉效果和动画的数量。

相关推荐

当Frida来“敲”门(frida是什么)

0x1渗透测试瓶颈目前,碰到越来越多的大客户都会将核心资产业务集中在统一的APP上,或者对自己比较重要的APP,如自己的主业务,办公APP进行加壳,流量加密,投入了很多精力在移动端的防护上。而现在挖...

服务端性能测试实战3-性能测试脚本开发

前言在前面的两篇文章中,我们分别介绍了性能测试的理论知识以及性能测试计划制定,本篇文章将重点介绍性能测试脚本开发。脚本开发将分为两个阶段:阶段一:了解各个接口的入参、出参,使用Python代码模拟前端...

Springboot整合Apache Ftpserver拓展功能及业务讲解(三)

今日分享每天分享技术实战干货,技术在于积累和收藏,希望可以帮助到您,同时也希望获得您的支持和关注。架构开源地址:https://gitee.com/msxyspringboot整合Ftpserver参...

Linux和Windows下:Python Crypto模块安装方式区别

一、Linux环境下:fromCrypto.SignatureimportPKCS1_v1_5如果导包报错:ImportError:Nomodulenamed'Crypt...

Python 3 加密简介(python des加密解密)

Python3的标准库中是没多少用来解决加密的,不过却有用于处理哈希的库。在这里我们会对其进行一个简单的介绍,但重点会放在两个第三方的软件包:PyCrypto和cryptography上,我...

怎样从零开始编译一个魔兽世界开源服务端Windows

第二章:编译和安装我是艾西,上期我们讲述到编译一个魔兽世界开源服务端环境准备,那么今天跟大家聊聊怎么编译和安装我们直接进入正题(上一章没有看到的小伙伴可以点我主页查看)编译服务端:在D盘新建一个文件夹...

附1-Conda部署安装及基本使用(conda安装教程)

Windows环境安装安装介质下载下载地址:https://www.anaconda.com/products/individual安装Anaconda安装时,选择自定义安装,选择自定义安装路径:配置...

如何配置全世界最小的 MySQL 服务器

配置全世界最小的MySQL服务器——如何在一块IntelEdison为控制板上安装一个MySQL服务器。介绍在我最近的一篇博文中,物联网,消息以及MySQL,我展示了如果Partic...

如何使用Github Action来自动化编译PolarDB-PG数据库

随着PolarDB在国产数据库领域荣膺桂冠并持续获得广泛认可,越来越多的学生和技术爱好者开始关注并涉足这款由阿里巴巴集团倾力打造且性能卓越的关系型云原生数据库。有很多同学想要上手尝试,却卡在了编译数据...

面向NDK开发者的Android 7.0变更(ndk android.mk)

订阅Google官方微信公众号:谷歌开发者。与谷歌一起创造未来!受Android平台其他改进的影响,为了方便加载本机代码,AndroidM和N中的动态链接器对编写整洁且跨平台兼容的本机...

信创改造--人大金仓(Kingbase)数据库安装、备份恢复的问题纪要

问题一:在安装KingbaseES时,安装用户对于安装路径需有“读”、“写”、“执行”的权限。在Linux系统中,需要以非root用户执行安装程序,且该用户要有标准的home目录,您可...

OpenSSH 安全漏洞,修补操作一手掌握

1.漏洞概述近日,国家信息安全漏洞库(CNNVD)收到关于OpenSSH安全漏洞(CNNVD-202407-017、CVE-2024-6387)情况的报送。攻击者可以利用该漏洞在无需认证的情况下,通...

Linux:lsof命令详解(linux lsof命令详解)

介绍欢迎来到这篇博客。在这篇博客中,我们将学习Unix/Linux系统上的lsof命令行工具。命令行工具是您使用CLI(命令行界面)而不是GUI(图形用户界面)运行的程序或工具。lsoflsof代表&...

幻隐说固态第一期:固态硬盘接口类别

前排声明所有信息来源于网络收集,如有错误请评论区指出更正。废话不多说,目前固态硬盘接口按速度由慢到快分有这几类:SATA、mSATA、SATAExpress、PCI-E、m.2、u.2。下面我们来...

新品轰炸 影驰SSD多款产品登Computex

分享泡泡网SSD固态硬盘频道6月6日台北电脑展作为全球第二、亚洲最大的3C/IT产业链专业展,吸引了众多IT厂商和全球各地媒体的热烈关注,全球存储新势力—影驰,也积极参与其中,为广大玩家朋友带来了...