Delphi 中High DPI开发注意事项

news2024/12/23 9:12:08

目录

前言:

什么是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等,不直接写数值。如果不考虑兼容多分辨率,这些当然就不是问题了。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第7章 动态创建标记

一些传统方法 document.write document对象的write()方法可以方便快捷地把字符串(支持html元素)插入到文档里。 document.write("<h1>hello world</h1>")document.write的最大缺点是它违背了“行为应该与表现分离”的原则。JavaScript和HTML代码混杂在…

eNSP interface g0/0/0 报错解决办法

文章目录 1 报错截图2 解决办法2.1 排查设备是否有 GM 接口2.2 更换适合的路由器&#xff0c;并验证 1 报错截图 2 解决办法 2.1 排查设备是否有 GM 接口 查看下设备是否支持 GM 接口&#xff08;GigabitEthernet&#xff09; 方式一&#xff1a;右键路由器设备 - 设置 - 查看…

【C++】类和对象-继承

0.前言 1.基本语法 继承的用处就是极大的减少代码的重复性&#xff0c;如果没有用继承&#xff0c;看看以下代码&#xff0c;你知道了。。。。 基本实现代码&#xff1a; #include <iostream> using namespace std; /******************************************/void …

8.5周六|Move Dev Meetup厦门站不见不散

Move Dev Meetup是由MoveFuns DAO发起的线下研讨会&#xff0c;旨在为参与的开发者提供深入了解Move语言机会。截至目前为止&#xff0c;Meetup已在成都、深圳、杭州等多个城市举办。Move Dev Meetup厦门站将在8月5日&#xff08;本周六&#xff09;举办&#xff0c;Sui将作为支…

观察级水下机器人使用系列之五三维激光扫描仪

本文主要讲观察级水下机器人Valor配套的三维激光扫描仪&#xff0c;它是近年来ROV的主力光学设备。三维激光扫描仪是Voyis&#xff08;原公司为2G Robotics&#xff09;公司生产的&#xff0c;型号为ULS-500 Micro。 ​编辑​ ULS-500 Micro的技术参数如下图。ULS-500 Pro扫描…

关于docker的一些深入了解

本文将深入介绍一下docker方面的知识&#xff0c;不尽完全&#xff0c;慢慢完善。 进程 进程的概念 在介绍docker的相关知识前&#xff0c;先了解一下相关概念。进程就是系统中正在运行的程序&#xff0c;进程是操作系统的概念&#xff0c;每当我们执行一个程序时&#xff0…

关于 Ubuntu 长按 shift 无效, 按 Esc 直接进入 grub 改密码的解决方法

本次长按shift没有反应&#xff0c;直接进入了系统界面&#xff0c;所以改用长按Esc键&#xff0c;步骤如下&#xff1a; 1. 长按esc&#xff0c;进入grub>提示 2.输入grub>normal &#xff0c;回车 3.上一步回车后&#xff0c;继续敲击Esc &#xff0c;出现grub界面 …

rdp、ftp协议的密码爆破

远程桌面 rdp协议 3389 文件传输 FTP协议 20 21 攻击方&#xff1a;Kali 测试方&#xff1a;Win7 两台都要在同一网段 密码爆破工具 hydra九头蛇 hydra&#xff08;九头蛇&#xff09;是著名黑客组织thc的一款开源的暴力破解密码工具&#xff0c;功能非常强大&#xff0c;ka…

Emacs之远程开发C++配置: emacs + tramp + clangd(一百二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

大数据学习教程:Linux高级教程(下)

四、大数据集群服务器搭建 1. 新增Linux服务器 1.1、克隆虚拟机 学习环境中&#xff0c;一般使用VMware虚拟机克隆Linux系统&#xff0c;用来进行集群服务器的搭建。 VMware支持两种类型的克隆&#xff1a;完整克隆、链接克隆 完整克隆是和原始虚拟机完全独立的一个复制&…

系统架构设计师_备考第2天(计算机组成与体系结构)

文章目录 考频&#xff08;3分左右&#xff09;一、计算机结构二、CPU组成三、冯诺依曼结构和哈弗结构四、层次化存储结构五、Cache 考频&#xff08;3分左右&#xff09; 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 计算机结构&#xff08;★&#xff0…

魔法上网端口号被占用通过端口号找到进程并且杀掉进程随笔

Windows11系统由于魔法上网被异常关闭导致再次启动的时候报出端口号被占用问题记录以前忘记的通过端口杀掉进程相关操作。 在命令行&#xff08;winr,输入cmd&#xff09;中输入: netstat -ano 可以看到本机正在使用的ip地址和端口号如图&#xff1a; 在命令行&#xff08;wi…

Array.prototype.slice.call()方法详解

slice:用来截取截取字符串方法Array: javascript的一个引用类型&#xff0c;其原型prototype上有一个方法叫slicecall和apply &#xff1a; 用来改变对象中函数内部的this引用&#xff0c;使得函数可以随便换‘妈妈’ 为什么不直接用 arguments.slice(1)呢 不是一样的么? 答案…

springboot第33集:nacos图

./startup.sh -m standalone Nacos是一个内部微服务组件&#xff0c;需要在可信的内部网络中运行&#xff0c;不可暴露在公网环境&#xff0c;防止带来安全风险。Nacos提供简单的鉴权实现&#xff0c;为防止业务错用的弱鉴权体系&#xff0c;不是防止恶意攻击的强鉴权体系。 鉴…

门面模式:简化复杂系统的接口调用

门面模式&#xff1a;简化复杂系统的接口调用 什么是门面模式&#xff1f; 门面模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个简单的接口&#xff0c;用于访问复杂子系统中的一组接口。门面模式通过封装子系统的复杂性&#xff0…

如何免费制作中小学分班查询系统?

暑假即将结束&#xff0c;新学年即将开始&#xff0c;学校面临着一个重要任务&#xff1a;学生分班。不论是新生入学还是低年级升入高年级&#xff0c;都需要进行分班工作。这对负责分班的老师们来说&#xff0c;增加了相当大的工作量和挑战。 在开学前&#xff0c;如何快速解…

排序八卦炉之插入和希尔

文章目录 1.插入排序1.1代码1.2复杂度 2.希尔排序2.1代码2.2复杂度2.3算法解析 1.插入排序 1.1代码 //插入排序1.0 /* void InsertSort(int* a, int n) {//i&#xff1a; 0 -- 倒数第2个元素for (int i 0; i < n - 1; i){//end记录iint end i;//tmp记录end后一个值int tm…

ios_base::out和ios::out、ios_base::in和ios::in、ios_base::app和ios::app等之间有什么区别吗?

2023年8月2日&#xff0c;周三晚上 今天我看到了这样的两行代码&#xff1a; std::ofstream file("example.txt", std::ios_base::out);std::ofstream file("example.txt", std::ios::out);这让我产生了几个疑问&#xff1a; 为什么有时候用ios_base::o…

物联网潜在的巨大价值在于大数据分析

物联网潜在的巨大价值在于大数据分析 从数据里去挖掘市场或者用户的精准需求。 往小的说&#xff0c;后台可以统计用户家里各各插座一年甚至更久的用电情况&#xff0c;这些数据也可以通过app或者小程序展现给用户。 用户可以很直观看到自己一年的用电情况&#xff0c;哪个家…

2.6 伽马校正 一、Gamma校正

一、Gamma校正 颜色空间 通用&#xff1a;sRGB 电影&#xff1a;DCI-P3 电视&#xff1a;Rec-709、PAL等 印刷&#xff1a;CMYK、Adobe RGB 传递函数 我们知道了颜色的颜色值&#xff0c;要在电子设备上显示&#xff0c;就要把它转换为视频信号&#xff0c;传递函数就是用…