怎么将Drawtext函数里的Rect跟打印机、Picture控件三者的度量单位统一起来?

lfshf 2016-12-12 01:41:59
picture控件和打印机的默认度量单位都是 VbTwips 1 (缺省值)缇

打印位置无需任何处理,两者分别做预览和打印输出,结果完全相同

直到需要使用Drawtext函数(可以自动处理折行),问题来了,画到picture上时,给Rect设置矩形位置,发现单位不一致了,但两者有固定的15倍数关系,那么 Rect 的度量单位究竟是什么?可以设置成跟picture一样吗?如何设置?


Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long

Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

'wFormat Long,一个标志位数组,决定了以何种形式执行绘图。参考下面总结的常数类型列表

Public Const DT_BOTTOM = &H8 'DT_BOTTOM 必须同时指定DT_SINGLE?指示文本对齐格式化矩形的底边

Public Const DT_CALCRECT = &H400 'DT_CALCRECT 象下面这样计算格式化矩形:多行绘图时矩形的底边根据需要进行延展,以便 容下所有文字;单行绘图时,延展矩形的右侧。不描绘文字。由lpRect参数指定的矩形会载入计算出来的值

Public Const DT_CENTER = &H1 'DT_CENTER 文本垂直居中

Public Const DT_EXPANDTABS = &H40 'DT_EXPANDTABS 描绘文字的时候,对制表站进行扩展。默认的制表站间距是8个字符。但是,可用DT_TABSTOP标志改变这项设定

Public Const DT_EXTERNALLEADING = &H200 'DT_EXTERNALLEADING 计算文本行高度的时候,使用当前字体的外部间距属性(the external leading attribute)

Public Const DT_LEFT = &H0 'DT_LEFT 文本左对齐

Public Const DT_MODIFYSTRING = 65536

Public Const DT_NOCLIP = &H100 'DT_NOCLIP 描绘文字时不剪切到指定的矩形

Public Const DT_NOPREFIX = &H800 'DT_NOPREFIX 通常,函数认为 & 字符表示应为下一个字符加上下划线。该标志禁止这种行为

Public Const DT_RIGHT = &H2 'DT_RIGHT 文本右对齐

Public Const DT_SINGLELINE = &H20 'DT_SINGLELINE 只画单行

Public Const DT_TOP = &H0 'DT_TOP 必须同时指定DT_SINGLE?指示文本对齐格式化矩形的顶部

Public Const DT_TABSTOP = &H80 'DT_TABSTOP 指定新的制表站间距,采用这个整数的高8位

Public Const DT_WORDBREAK = &H10 'DT_WORDBREAK 进行自动换行。如用SetTextAlign函数设置了TA_UPDATECP标志,这里的设置则无效

Public Const DT_VCENTER = &H4 'DT_VCENTER 必须同时指定DT_SINGLE?指示文本对齐格式化矩形的中部




picture1.CurrentX =200
picture1.CurrentY = 300
picture1.Print "指示文本对齐格式化矩形的中部"


等于

[/code]


Dim rectBox As RECT
With rectBox
.Left = 200/ 15: .Top = 300/ 15
.Right = (200+ 500) / 15: .Bottom = (300+ 300) / 15
End With
DrawText picture1.hDC, "指示文本对齐格式化矩形的中部", -1, rectBox, DT_LEFT Or DT_TOP


...全文
166 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfshf 2016-12-14
  • 打赏
  • 举报
回复
十分感谢 Tiger_Zhao 同学的帮助,已完美解决我的问题
Tiger_Zhao 2016-12-13
  • 打赏
  • 举报
回复
更正:随手打代码,(常量中)打错了一个字符
x = Picture1.ScaleX(240, vbTwips, vbPixels)
y = Picture1.ScaleY(120, vbTwips, vbPixels)
Tiger_Zhao 2016-12-13
  • 打赏
  • 举报
回复
大多数和绘图有关的API函数,用的度量单位都是像素。
而VB默认度量单位是缇,和像素的换算比率受显示设置中DPI的影响。

最简单的方法,把控件的度量单位也设为用像素:
Picture1.ScaleMode = vbPixels

当然也可以自己换算,推荐用 ScaleX()、ScaleY(),这两个函数可以在任意度量单位之间进行换算
x = Picture1.ScaleX(240, vbTwips, vbpicels)
y = Picture1.ScaleY(120, vbTwips, vbpicels)

一如既往哈 2016-12-13
  • 打赏
  • 举报
回复
引用 2 楼 lfshf 的回复:
Rect 的度量单位究竟是什么?可以设置成跟picture一样吗?如何设置?
-----pixel
lfshf 2016-12-13
  • 打赏
  • 举报
回复
Rect 的度量单位究竟是什么?可以设置成跟picture一样吗?如何设置?
lfshf 2016-12-13
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
大多数和绘图有关的API函数,用的度量单位都是像素。 而VB默认度量单位是缇,和像素的换算比率受显示设置中DPI的影响。 最简单的方法,把控件的度量单位也设为用像素:
Picture1.ScaleMode = vbPixels
这可能是最简便的方法,我试验一下 另外,屏幕像素和打印机像素估计也是需要换算的
引用 4 楼 Tiger_Zhao 的回复:
大多数和绘图有关的API函数,用的度量单位都是像素。 而VB默认度量单位是缇,和像素的换算比率受显示设置中DPI的影响。 最简单的方法,把控件的度量单位也设为用像素:
Picture1.ScaleMode = vbPixels
当然也可以自己换算,推荐用 ScaleX()、ScaleY(),这两个函数可以在任意度量单位之间进行换算
x = Picture1.ScaleX(240, vbTwips, vbpicels)
y = Picture1.ScaleY(120, vbTwips, vbpicels)
实测还是换算方便,以下两个打印位置相同

Private Sub Command1_Click()
  
  'A4纸张
  Picture1.ScaleMode = vbTwips
  Picture1.Height = 16836
  Picture1.Width = 11904
  
  Picture1.CurrentX = 100
  Picture1.CurrentY = 100
  Picture1.Print "大多数和绘图有关的API函数,用的度量单位都是像素。"


End Sub

Private Sub Command2_Click()
  Dim rectBox As RECT
  
  'A4纸张
  
  Picture1.ScaleMode = vbTwips
  Picture1.Height = 16836
  Picture1.Width = 11904

  With rectBox
    .Left = Picture1.ScaleX(100, vbTwips, vbPixels)
    .Top = Picture1.ScaleY(100, vbTwips, vbPixels)
    .Right = Picture1.ScaleX(6000, vbTwips, vbPixels)
    .Bottom = Picture1.ScaleY(700, vbTwips, vbPixels)
  End With  ' rectBox

  DrawText Picture1.hDC, "大多数和绘图有关的API函数,用的度量单位都是像素。", -1, rectBox, DT_LEFT

End Sub
赵4老师 2016-12-12
  • 打赏
  • 举报
回复
Coordinate Space and Transformation Functions The following functions are used with coordinate spaces and transformations. ClientToScreen CombineTransform DPtoLP GetCurrentPositionEx GetGraphicsMode GetMapMode GetViewportExtEx GetViewportOrgEx GetWindowExtEx GetWindowOrgEx GetWorldTransform LPtoDP MapWindowPoints ModifyWorldTransform OffsetViewportOrgEx OffsetWindowOrgEx ScaleViewportExtEx ScaleWindowExtEx ScreenToClient SetGraphicsMode SetMapMode SetViewportExtEx SetViewportOrgEx SetWindowExtEx SetWindowOrgEx SetWorldTransform

7,762

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧