我想知道是否有一种简单的方法来计算字符串的文本范围(类似于 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
The quick brown fox jumps over the
lazy dog
The quick brown fox jumps over
the
lazy dog
最佳答案
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/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url