如何用界面组件DevExpress WinForm创建一个支持High DPI的应用?
DevExpress WinForms拥有180组件和UI库能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序无论是Office风格的界面还是分析处理大批量的业务数据它都能轻松胜任DevExpress新旧版本帮助文档下载可进QQ qun获取169725316DPI 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.NETe.Graphics.DrawString(...)现在所有CustomDrawVisualElement事件参数都公开了返回GraphicsCache对象的e.Cache属性——图形的DevExpress对象GraphicsCache公开了与标准图形类相同的API并针对High-DPI和directx呈现的应用程序进行了优化您应用始终使用e.Cache属性中可用的绘制方法。C#e.Cache.DrawString(...);VB.NETe.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属性以最小化视觉效果和动画的数量。