VB中利用DrawText输出字符串且自动换行

VB中有个Print函数可以对字符串输出到窗体、图像框、立即窗口、打印机等对象上,但它也有一定的局限性,比如长文本时需要自动换行是很麻烦的,但是利用API就很容易做到,接下来我们就利用DrawText来实现长文本自动换行,且加上文本背景和文本颜色的方法,如图:

首先我们先设定一个限定文本输出的RECT范围架构,而这个RECT架构我们可以用一个API函数"SetRect"来设置:

RECT结构
Private Type Rect
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
SetRect声明
Private Declare Function SetRect Lib "user32" (lpRect As Rect, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
返回值
Long,非零表示成功,零表示失败
参数

lpRect ---------  RECT,欲设置的矩形

  X1 -------------  Long,左侧区域(Left)的值

  Y1 -------------  Long,顶部区域(Top)的值

  X2 -------------  Long,右侧区域(Right)的值

  Y2 -------------  Long,底部区域(Bottom)的值

设定输出文本在指定的矩形范围内

Dim TxtRect as Rect     '定义一个RECT变量

Call SetRect(TxtRect, 20, 20, Me.ScaleWidth - 20, Me.ScaleHeight)

  • 设定了输出文本的范围,要想改变文本的背景颜色和前景颜色,需要用到两个API函数:"SetBkColor"和"SetTextColor":
  •  

为指定的设备场景设置文本背景颜色。

SetBkColor声明:

Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
返回值:
Long,前一个背景色,CLR_INVALID表示出错
参数:

hdc ------------  Long,设备场景的句柄

crColor --------  Long,新背景颜色的RGB颜色值

设定文本背景颜色为浅灰色:
Call SetBkColor(Me.hdc, RGB(200, 200,200))

要实现文本背景颜色还需要一个API函数:SetBkMode

指定阴影刷子、虚线画笔以及字符中的空隙的填充方式。

SetBkMode声明:
Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
返回值:
Long,前一个背景模式的值
参数:

hdc ------------  Long,设备场景的句柄

  nBkMode --------  Long,下述常数之一:
  OPAQUE
  用当前的背景色填充虚线画笔、阴影刷子以及字符的空隙
  TRANSPARENT
  透明处理,即不作上述填充

设置当前文本颜色。这种颜色也称为“前景色”。

SetTextColor声明:

Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
返回值:
Long,文本色的前一个RGB颜色设定
参数:

hdc ------------  Long,设备场景的句柄

  crColor --------  Long,新的文本色
  在VB里使用
  如改变了这个设置,注意恢复VB窗体或控件原始的文本颜色

设定文本颜色为红色:
Call SetTextColor(Me.hdc, RGB(255, 0, 0))

 

 

 

DrawText声明:
Private 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
返回值:
Long,描绘文字的高度
参数:

hdc ------------  Long,欲在其中显示文字的一个设备场景的句柄

  lpStr ----------  String,欲描绘的文本字串

  nCount ---------  Long,欲描绘的字符数量。如果要描绘整个字串(直到空中止符),则可将这个参数设为-1

  lpRect ---------  RECT,指定用于绘图的一个格式化矩形(采用逻辑坐标)

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

定义文本左对齐和自动换行常数:
Private Const DT_NOCLIP = &H100
Private Const DT_WORDBREAK = &H10
Private Const DT_EDITCONTROL = &H2000
输出文本到窗体:

Dim text As String'定义一个存储文本的变量

text="vb中,我想只用一个print在窗体上输出一串字符,但由于字行符较多且是连续的,我不想用多个print词句换行,请问有没有什么方法能,字符串自动换行"

Call DrawText(Me.hdc, text, -1, Rect, DT_WORDBREAK Or DT_NOCLIP Or DT_EDITCONTROL)

实例:

Option Explicit

Private Type Rect
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long
Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function SetRect Lib "user32" (lpRect As Rect, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private 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

Private Const DT_NOCLIP = &H100
Private Const DT_WORDBREAK = &H10
Private Const DT_EDITCONTROL = &H2000
Private Const OPAQUE = 2

Private Sub Form_Load()
Me.AutoRedraw = True
Me.ScaleMode = 3
End Sub

Private Sub Form_Click()
Dim Text As String, TxtRect As Rect
Text = "vb中,我想只用一个print在窗体上输出一串字符,但由于字行符较多且是连续的,我不想用多个print词句换行,请问有没有什么方法能,字符串自动换行"
Me.Cls
Call SetBkMode(Me.hdc, OPAQUE) '
Call SetBkColor(Me.hdc, RGB(200, 200, 200))
Call SetTextColor(Me.hdc, RGB(255, 0, 0))
Call SetRect(TxtRect, 20, 20, Me.ScaleWidth - 20, Me.ScaleHeight - 20)
Call DrawText(Me.hdc, Text, -1, TxtRect, DT_WORDBREAK Or DT_NOCLIP Or DT_EDITCONTROL)
End Sub

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

键盘上的舞指

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值