首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >TextRenderer.DrawText在XP和Vista上呈现Arial的方式不同

TextRenderer.DrawText在XP和Vista上呈现Arial的方式不同
EN

Stack Overflow用户
提问于 2010-04-08 06:25:26
回答 3查看 1.1K关注 0票数 6

我有一个可以进行文本渲染的c#应用程序,这与一个简单的所见即所得文本编辑器不相上下。

我使用TextRenderer.DrawText将文本呈现到屏幕上,使用GetTextExtentPoint32测量文本,这样我就可以在同一行上定位不同的字体样式/大小。

在Vista中,这一切都运行得很好。然而,在XP中,Arial的渲染方式不同,某些字符,如'o‘和'b’,比在Vista中占据了更大的宽度。GetTextExtentPoint32似乎像在Vista中一样测量字符串,但宽度更小。最终的结果是,每隔一段时间,一串文本就会与其前面的文本重叠,因为前面的文本会被测量为比屏幕上实际显示的文本小。

此外,我的文本渲染代码完全模仿了ie的文本渲染(仅限于简单的格式和英语),而且ie文本渲染在vista和xp之间似乎是一致的--这就是我注意到不同字符大小变化的原因。

有谁知道是怎么回事吗?

简而言之,TextRenderer.DrawText和GetTextExtentPoint32在xp for Arial中并不匹配。DrawText似乎比Vista中绘制的某些字符更大和/或更小,但GetTextExtentPoint32似乎像在Vista中一样测量文本(这似乎与在xp和vista上ie中的文本渲染相匹配)。希望这是有意义的。

注:不幸的是,TextRenderer.MeasureString的速度或准确性不足以满足我的需求。我试着用它,但不得不把它拔出来。

EN

回答 3

Stack Overflow用户

发布于 2010-04-08 20:22:57

感谢你抽出时间回复我,阿德里安。

我的理解是,TextRenderer.DrawText实际上包装了对GDI的调用,完全绕过了GDI+文本呈现。这就是为什么我对GetTextExtentPoint32没有欺骗输出感到困惑的原因。

我想我找到了问题所在。事实证明,如果您将System.Drawing.Text.TextRenderingHint.ClearTypeGridFit,或其他值设置为Graphics.TextRenderingHint,则会导致某些字体中的某些字符增大或减小大小。这似乎在XP中比在Vista中更真实。我还没有在Vista中看到过这种情况。无论如何,看起来GetTextExtentPoint32要么无法识别差异,要么我在进行调用时没有设置某种标志。

我的解决方案是只使用系统默认的textrenderinghint设置。

票数 2
EN

Stack Overflow用户

发布于 2010-04-09 12:08:50

实际上,文本渲染器的DrawText和MeasureString都是基于DrawTextEx的(这是User32,而不是Gdi函数)。因此,您可以考虑使用对此函数的本机编组调用,而不是MeauseString,因为它会执行一些额外的计算(特别是当您使用不带HDC的函数覆盖时)。

另外,也许这个post也会对你有帮助。

票数 1
EN

Stack Overflow用户

发布于 2010-04-08 19:36:43

我不是C#爱好者,但我相信.NET渲染是建立在GDI+之上的。我也很确定GDI+会使用不加提示的缩放来进行自己的字体渲染。

另一方面,GetTextExtentPoint32是GDI的一部分。GDI使用大小调整提示,这可能会影响字符的宽度,具体取决于字体大小。通常情况下,小尺寸的GDI文本看起来会有一点吸气,但它不会线性缩放。

你必须始终如一地使用一种或另一种模型来获得像素完美的结果。

可能还有其他因素在起作用,使得这一点在XP上比在Vista上更明显,但根本问题都存在于两者中。这些其他因素可能包括DPI设置、DPI缩放、ClearType或抗锯齿设置、字体链接(如果您正在混合其他字母表中的脚本)、字体替换(尤其是在打印中),甚至可能是不同版本的Arial。我甚至不确定GDI+是否使用与GDI相同的默认映射模式。

另请参阅my answer on print preview

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2597971

复制
相关文章
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
Gitlab 提供了基于 Code Climate 的代码质量评估功能,这一功能是通过 dind(Docker in Docker)方式运行的,在 Kubernetes 环境中、尤其是托管集群中,这种方式不太合适,还好还有一个替代方案:Sonarqube,通过在 .gitlab-ci.yml 中的设置,可以使用 Sonarqube 对代码进行扫描,接收到 Commit 之后,Sonarqube 会生成针对提交的代码质量提示,如图所示:
崔秀龙
2019/07/22
8.1K0
在 Gitlab CI 中调用 Sonarqube 进行代码扫描
在python环境调用C库
注意: 如果返回是无符号长类型, 需要在py里面设置返回类型 t1.restype = ctypes.POINTER(ctypes.c_ulong) 其它类型同理
大大刺猬
2022/09/29
5710
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
关于MrKaplan  MrKaplan是一款功能强大的红队安全研究工具,该工具可以帮助广大红队研究人员清理和隐藏活动中的代码执行痕迹。该工具可以通过保存文件运行时间、存储文件快照等信息来辅助红队活动,并将所有的取证信息与相关用户关联起来。  功能介绍  1、关闭系统事件日志记录功能; 2、清理文件和代码组件; 3、清理注册表; 4、支持多用户运行; 5、支持以普通用户或管理员身份运行(建议以管理员权限运行); 6、支持保存文件时间戳; 7、支持排除指定操作,并将组件留给蓝队人员。  工具下载  该工具本质
FB客服
2023/03/30
1.8K0
如何使用MrKaplan在红队活动中隐藏和清理代码执行痕迹
在 Node 中调用 Python
在 Node 中如何调用 Python 的方法?通常可以通过 REST 接口或者 RPC 的方式来完成,但是某些时候我们仅仅只需要调用对方几个很简单的方法,这种情况下去构建一个提供 REST 接口的服务或者两者对接实现 RPC 调用,这种做法的成本显然有点高。本文将会介绍一种更轻量的调用方式。
凌虚
2020/07/17
5.7K0
在Java中调用Python
在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。
编程随笔
2019/09/11
5.1K0
在Java中调用Python
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
全栈程序员站长
2022/07/05
1.9K0
在Android中调用WebService
某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查。我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数据费时费电;二是流量贵如金那。我个人比较推荐的做法是使用Java或PHP等开发接口或者编写WebService进行数据库的增删该查,然后Android调用接口或者WebService进行数据的交互。本文就给大家讲解在Android中如何调用远程服务器端提供的WebService。 既然是调用WebService
欢醉
2018/01/22
2.3K0
生产环境日志清理脚本
生产上有40多个微服务部署的应用,每个应用都会产生日志,随着时间的增长,日志量不断增大,现需要清理。有两个重要的应用日志需保留90天,其它应用保留20天。
loong576
2020/07/20
1.2K0
在C++中调用Python
虽然现在Python编程语言十分的火爆,但是实际上非要用一门语言去完成所有的任务,并不是说不可以,而是不合适。在一些特定的、对于性能要求比较高的场景,还是需要用到传统的C++来进行编程的。但是C++的一个缺点是比较难找到很好的轮子,这也是很多人专用Python的一个重要原因。这篇文章我们要介绍的是一个比较特殊的场景——用C++的代码去调用Python函数中实现的一些功能。这样的话,如果代码的主体还是用C++完成的,而部分功能为了简便,引入一些Python中已经封装好的函数,这样就可以很好的结合两种语言各自的特点。而另一种工作方式:通过Python来调用一些C++或者Fortran中实现的高性能函数,可以参考这一篇博客。这两种不同的使用方法各有优劣,但是如果以Python为主导,就很难避开GIL的问题,这里我们就不过多的展开。
DechinPhy
2021/05/27
4.1K0
在.NET中调用存储过程
因为做项目要用到数据库,因此存储过程是必不可少的,看了一点如何在.NET中调用存储过程的资料,颇有点心得,觉得这个东西是当用到数据库的时候必须要会的一项技术。下面是它的定义:
SAP梦心
2022/05/07
2.2K0
清理垃圾bat代码
rd /s /q %windir%\temp & md %windir%\temp
全栈程序员站长
2022/07/04
1K0
清理垃圾bat代码
在Oracle中,如何定时清理INACTIVE状态的会话?
今天小麦苗给大家分享的是在Oracle中,如何定时清理INACTIVE状态的会话?
AiDBA宝典
2019/09/29
2.7K0
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
用户2781897
2021/04/02
6550
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
xcbeyond
2021/04/11
5780
Docker 环境清理的常用方法
如果你使用 docker 进行大规模开发,但是没有清理策略,那么你的磁盘马上就会被填满,当你真的必须因为产品火爆而要立即交付一些东西时,你就无法交付。
xcbeyond
2021/04/22
3.5K0
在OrderStatusActor构造方法中调用StartTimerAsync
TimerCallbackAsync方法以二进制形式接收用户状态。 在示例中,回调在将状态写入日志之前将状态 string 解码回 。
用户7108768
2021/09/26
1.9K0
Go语言在模版中调用函数
如果希望调用自定义函数,需要借助html/template包下的FuncMap进行映射
IT工作者
2022/03/31
2.8K0
如何成功清理重建CloudStack环境
很多玩过 CloudStack的童鞋,或多或少在刚刚入门 CloudStack的时候,对一个搭建环境需要做N多次的创建,删除才能最终运行好一个云环境,但是在这个过程中,如果遇到问题,找不出其他方法解决的话,很多新手暂时能够想到的就是重新创建环境,在这个过程中,有几项注意点需要提醒各位,否则即使重建好了环境,也会由于某些配置的残留而导致新的环境出现新的问题。
星哥玩云
2022/06/28
5770
点击加载更多

相似问题

共享环境中的mod_perl调试

10

在mod_perl环境中使用共享内存

22

如何使用maven调用插件清理构建环境

12

mod_perl 2环境中的WebApp配置

10

清理Anaconda中的基础环境

144
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文