gpt4 book ai didi

windows - 是否有一种简单的方法可以强制Windows使用固定的DPI值而不是当前DPI设置来计算文本范围?

转载 作者:可可西里 更新时间:2023-11-01 10:29:36 24 4
gpt4 key购买 nike

我想知道是否有一种简单的方法来计算字符串的文本范围(类似于 GetTextExtentPoint32 ),但是允许我指定要在计算中使用的DPI。换句话说,是否有一个功能与 GetTextExtentPoint32 完全一样,但是允许我将DPI作为参数传递,或者是一种“欺骗” GetTextExtentPoint32 以使用我可以指定的DPI的方法?

在您问“为什么要这样做?”之前,我将尽力解释,但请允许我理解,此请求背后的原因有些涉及。

最终,这是针对自定义自动换行算法的,该算法将长字符串分成较小的文本块,这些文本块需要整齐地适合具有复杂文本布局要求的Crystal Report(它模仿了警察用于提起刑事诉讼的纸质表格,因此状态由布局负责,而不是由我们负责,并且布局必须与纸张形式几乎完全匹配)。

Crystal Reports不可能在没有帮助的情况下正确地放置此文本(文本必须放在一页的一个小盒子内,如果文本溢出了小块,则必须放在“标准尺寸”的连续页面内),所以我编写了代码将文本分为多个“块”,这些“块”存储在报告数据库中,然后由报告单独呈现。

给定所需的尺寸(以逻辑英寸为单位)和字体信息,代码首先通过插入换行符使文本适合所需的宽度,然后根据文本高度将其分成正确大小的块。该算法使用VB6的 TextHeight TextWidth 函数来计算范围,其返回的结果与 GetTextExtentPoint32 函数(我已选中)相同。

当显示设置为96dpi时,此代码效果很好,但在120 DPI时中断:某些行最后以96 DPI时会有更多的单词。

例如,“快速的棕色狐狸跳过懒狗”可能会如下中断:

达到96 DPI时

The quick brown fox jumps over
the lazy dog



在120 DPI时

The quick brown fox jumps over the
lazy dog



然后,Crystal Reports将进一步分割此文本,因为第一行不再适合报表上的相应文本字段,因此实际的报表输出如下所示:

The quick brown fox jumps over
the
lazy dog



起初,我以为我可以通过将 TextHeight TextWidth 的结果缩小25%来弥补这一点,但是生命周期显然不那么简单:似乎有很多舍入误差(可能还有其他因素?) ,因此任何给定字符串的文本范围在120 DPI时都不会比96 DPI精确地大25%。我没想到它会完美缩放,但有时甚至还不紧密(在一项测试中,在120 DPI时的宽度仅比在96 DPI时大约18%)。

对于Crystal报表直接处理的报表中的任何文本,都不会发生这种情况:似乎可以很好地缩放所有内容,以便报表的布局在96 DPI和120 DPI(甚至是144 DPI)时完全相同DPI)。即使在打印报告时,也将完全按照屏幕上显示的文本来打印文本(即,确实看起来像所见即所得)。

考虑到所有这些,因为我知道我的代码可以在96 DPI下工作,所以即使Windows当前使用其他DPI设置,我也应该能够通过以96 DPI计算所有文本范围来解决此问题。

换句话说,我希望我的 FitTextToRect 函数的结果通过强制使用96 DPI计算文本范围来在任何DPI设置下返回相同的输出。这应该全部解决,因为我将范围转换回英寸,然后将它们与所需的宽度和高度(以英寸为单位)进行比较。我认为碰巧在像素和英寸之间来回转换时,96 DPI产生比120 DPI更准确的结果。

我一直在研究Windows Font and Text Functions ,看是否可以滚动我自己的函数来计算给定DPI的文本范围,查看 GetTextMetrics 和其他函数以了解这样做的难易程度。如果有更简单的方法可以完成此操作,那么在开始创建自己的现有Windows API函数版本之前,我想知道!

最佳答案

GetTextMetrics接受DC。它使用来自该DC的DPI设置(例如,您不可能使用屏幕设置,并且期望数据以可接受的格式输出给打印机)。

因此,您所需要做的就是为DC提供正确的DPI。我认为您也许可以直接控制图元文件DC的DPI。

元文件是矢量图形,因此它们甚至看起来都不像具有DPI。

您可以使用 CreateDIBitmap 控制DPI,但是就无法获得匹配的DC。如果将DIB选择到内存DC(CreateCompatibleDC)中,则可以看到DPI是否更改。

或者,您可以使用GDI +,创建具有所需DPI的位图,使用在图像上运行的Graphics构造函数,然后Graphics将具有正确的DPI,因此GDI +文本测量功能将使用您选择的DPI。

关于windows - 是否有一种简单的方法可以强制Windows使用固定的DPI值而不是当前DPI设置来计算文本范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3947595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com