Delphi 中High DPI开发注意事项

目录

前言:

什么是High DPI?

一、表现不一致的现象

二、当前的解决方案

三、重点


前言:

什么是High DPI?

High DPI(高分辨率显示)是指显示设备具有高像素密度的特征。它意味着在相同的显示区域内,显示设备能够显示更多的像素,使图像和文本变得更加细腻和清晰。

在传统的低分辨率显示设备上,像素密度相对较低,图像和文本可能会显得模糊或像素化。而在高 DPI 设备上,更多的像素被压缩在相同的物理区域内,使图像和文本更加锐利和清晰。

高 DPI 显示设备的出现,为用户提供了更好的视觉体验,尤其在观看高清内容、查看细节丰富的图像、展示复杂的图形等方面表现突出。

High DPI(高分辨率显示)通常指的是拥有大于 96 像素/英寸(PPI)的显示设备。在这种情况下,可以认为超过 96 PPI 的设备是高 DPI 设备。

然而,随着技术的不断发展,现在许多显示设备的像素密度远高于 96 PPI。例如,智能手机、平板电脑和高端显示器通常具有更高的像素密度,一些设备甚至达到 300 PPI 或更高。

在开发应用程序时,通常将 120 PPI 或更高的设备定义为 High DPI 设备。这是因为在这个像素密度范围内,应用程序通常需要进行额外处理和调整,以确保在高 DPI 设备上呈现良好的用户体验。

对于开发人员而言,需要注意支持高 DPI 的应用程序设计和开发。这包括使用适当的图标、控件和字体尺寸,处理缩放和布局问题,以确保应用程序在高 DPI 设备上呈现良好的用户体验。

Delphi 从11.0版本开始支持High DPI IDE,在这之前的版本都是不支持的,支持和不支持的效果时什么,请看下面,这是在4K(3840x2160)分辨率下,分别运行11.3和10.2.3版本的界面。

 

 

 从上述图形可以明显看出Delphi 从11.0版本开始支持High DPI IDE的改进,因为是截图,效果并不明显,如果实际在显示器上看,那效果就更明显了,不支持High DPI IDE的界面简直就无法忍受。那么问题来了,使用支持High DPI IDE的Delphi  11版本开发的程序,在2K及一下显示器上正常么?答案是令人遗憾的,UI表现不是完全一致。

IDE支持High DPI IDE了,当然我们开发的时候使用IDE就感觉很舒服了,即便是IDE,英巴卡基诺也是在不断完善,截止到11.3版本,IDE支持High DPI已经基本完成了。那么IDE是支持High DPI,开发出来的程序UI表现不一致该如何解决呢?

一、表现不一致的现象

  • TImage控件:在High DPI IDE上开发,界面上就放一个TImage,然后装载一幅图片,什么参数都不要设置,效果如下:

 

 设置Image1.AutoSize := True 效果

  

 设置Image1.AutoSize := False并且Image1.Stretch := True 效果:

 

 以上可见,只有将Stretch属性设置为True时,效果才一样,但是在2K显示器下,图片明显不清晰,粗糙。也就是说TImage控件是未适配High DPI的控件。

 

  • TLabeledEdit控件,有时会出现如下效果:

 

  

  • TActivityIndicator 控件效果(2K下显示不全)

 

 

        是否还有其他控件不很完美兼容,就不是很清楚,使用了才知道,所以在High GPI上开发的程序,一定要在2K分辨率下测试看效果如何,反之亦然。

二、当前的解决方案

  1. 对于TImage控件,可以使用TVirtualImage控件替代,完美支持不同分辨率;
  2. TLabeledEdit控件,请设置LabeledEdit.EditLabel.ParentFont := False;
  3. TActivityIndicator控件似乎没有更好的解决办法,只能通过PPI来判断在个性设置;

三、重点

在开发多分辨率VCL程序的UI时候,对于控件的大小,切记不要使用绝对数值,只要使用绝对数值,必然导致不同分辨率下UI表现不一致。那么有时候确实需要调整某个控件的位置,大小该如何操作呢,最好使用相对大小,相对于Form的width、Height、Top、Left等,不直接写数值。如果不考虑兼容多分辨率,这些当然就不是问题了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/55637.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何⾃定义⼀个SpringBoot Srarter

⾃定义⼀个SpringBoot Srarter 1、创建⼀个项⽬,命名为 demo-springboot-starter,引⼊SpringBoot相关依赖 2、编写配置⽂件 定义属性配置的前缀 3、⾃动装配 创建⾃动配置类HelloPropertiesConfigure 4、配置⾃动类 在 /resources/META-INF/spri…

自监督去噪: self2self 原理及实现(Pytorch)

Self2Self With Dropout: Learning Self-Supervised Denoising From Single Image 文章地址:https://ieeexplore.ieee.org/document/9157420原始代码:https://github.com/scut-mingqinchen/self2self本文参考代码: https://github.com/JinYize/self2self…

【万字长文】SpringBoot整合MyBatis搭建MySQL多数据源完整教程(提供Gitee源码)

前言:在我往期的博客介绍了2种关于如何使用SpringBoot搭建多数据源操作,本期博客我参考的是目前主流的框架,把最后一种整合多数据源的方式以博客的形式讲解完,整合的过程比较传统和复杂,不过我依旧会把每个实体类的思路…

NASA和uAvionix在AAM测试场部署SkyLine C2指挥和控制服务

蒙大拿州比格福克和弗吉尼亚州汉普顿2023年07月28日——美国宇航局和uAvionix签署了一项太空法案协议,为城市环境中的无人机系统 (UAS)开发先进的超视距(BVLOS)指挥和控制(C2)技术。根据协议,NASA将与uAvionix合作,利用基于互联网的基础设施和…

亚马逊云科技与真格基金发起「AI超新星计划」,助力早期创业者快速启动项目

大模型创业热度仍旧在持续增加,“百模大战”中AI创业者们的机会更多是在应用层。为了尽可能降低AI创业者的启动门槛,亚马逊云科技携手头部早期投资机构真格基金共同发起了「AI超新星计划」,为心怀梦想的AI应用创业者们提供了从云资源、模型选…

NSS刷web3

[HDCTF 2023]SearchMaster [天翼杯 2021]esay_eval 这题会匹配A或B类 如 "A":1: 绕不过去 可以考虑快速析构 <?php class A{public $code "";function __call($method,$args){eval($this->code);}function __wakeup(){$this->code "&q…

DLA :pytorch添加算子

pytorch的C extension写法 这部分主要介绍如何在pytorch中添加自定义的算子(例如&#xff0c;您可能希望 使用您在论文中找到的新颖激活函数&#xff0c;或实现操作 您作为研究的一部分进行了开发。)&#xff0c;需要以下cuda基础。就总体的逻辑来说正向传播需要输入数据&#…

Stable Diffusion AI绘画学习指南【插件安装设置】

插件安装的方式 可用列表方式安装&#xff0c;点开Extensions 选项卡&#xff0c;找到如下图&#xff0c;找到Available选项卡&#xff0c;点load from加载可用插件&#xff0c;在可用插件列表中找到要装的插件按install 按扭按装&#xff0c;安装完后(Apply and restart UI)应…

React(4)

1.属性&#xff08;props&#xff09;初始 状态state都是组件内部写的&#xff0c;也就是A组件内的state就只能A组件里面用&#xff0c;其他组件复用不了。因此属性props就可以。 比如一个导航栏&#xff0c;首页有&#xff0c;购物车有&#xff0c;我的有&#xff0c;他们三个…

数据可视化(4)散点图及面积图

1.简单散点图 #散点图 #scatter(x,y) x数据&#xff0c;y数据 x[i for i in range(10)] y[random.randint(1,10) for i in range(10)] plt.scatter(x,y) plt.show()2.散点图分析 #分析广告支出与销售收入相关性 dfcarpd.read_excel(广告支出.xlsx) dfdatapd.read_excel(销售…

NSX多租户之旅

从多租户数据面到完整的多租户框架 我们很高兴地宣布NSX中的Projects这一项新功能&#xff0c;可以对NSX部署的多个租户进行细粒度的资源管理。 Projects提供灵活的资源分配和管理&#xff0c;将NSX的多租户支持提升到新的水平。企业管理员可以将平台划分为不同Projects&…

【数据结构】27.移除元素

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

Scratch 教程 -- 如何绘制像素画

1.像素画的定义 像素画就是以1像素的正方形为最小单位画的画&#xff0c;且物体有明显的分界线 这是像素画 这不是像素画 来看这两个法棍 这是像素画 这不是像素画 为什么第二个不是像素画&#xff1f;因为不能区分边缘和物体&#xff0c;它们之间有很多过渡色。 中间的过渡色属…

Spring依赖注入

文章目录 前言1.依赖注入简介2. setter注入3. 构造器注入4. 自动装配 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚&#xff0…

Sublime操作技巧笔记

同时选中2个文件&#xff1a;自动切换成左右2个界面 格式化代码ctrlshifth&#xff1a; 使用快捷键ctrl shift p调出控制台&#xff0c;输入install package&#xff0c;然后输入html-css-js prettify&#xff0c;进行下载。具体的快捷键在preference > package setting &g…

【深度学习】Inst-Inpaint: Instructing to Remove Objects with Diffusion Models,指令式图像修复

论文&#xff1a;https://arxiv.org/abs/2304.03246 code:http://instinpaint.abyildirim.com/ 文章目录 AbstractIntroductionRelated WorkDataset GenerationMethodPS Abstract 图像修复任务是指从图像中擦除不需要的像素&#xff0c;并以语义一致且逼真的方式填充它们。传统…

springboot对静态资源的支持

1、spring boot默认静态路径支持 Spring Boot 默认将 / 所有访问映射到以下目录&#xff1a;** classpath:/static classpath:/public classpath:/resources classpath:/META-INF/resources也就是说什么也不用配置&#xff0c;通过浏览器可以直接访问这几个目录下的文件。 1…

Spring之BeanDefinition(二)

Spring之BeanDefinition 文章目录 Spring之BeanDefinition1、对象和bean的区别2、BeanDefinition作用AutowireCandidate说明Primary说明ConstructorArgumentValues说明第一种使用方式第二种使用方式 MutablePropertyValuesabstract小结 3、BeanDefinition的发展历程3、BeanDefi…

C++ 类的友元

【例1】 将数据与处理数据的函数封装在一起&#xff0c;构成类&#xff0c;既实现了数据的共享又实现了隐藏&#xff0c;无疑是面向对象程序设计的一大优点。但是封装并不总是绝对的。现在考虑一个简单的例子&#xff0c;就是Point类&#xff0c;每一个Point类的对象代表一个“…

阿里云服务器免费试用及搭建WordPress网站

文章目录 前言一、免费试用1、选择使用产品2、进行产品配置3、远程连接阿里云服务器①、重置实例密码②、SecureCRT 远程链接③、Workbench 远程链接二、搭建 WordPress 网站1、开放搭建 WordPress 需要的端口2、搭建 LAMP 环境①、Linux 系统升级和更新源②、安装 Apache2③、…