首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

怎么让文字的宽度和图像框的宽度一样

2012-12-21 
怎样让文字的宽度和图像框的宽度一样本帖最后由 ndsc213456789 于 2012-04-18 16:39:06 编辑我在一个名为p

怎样让文字的宽度和图像框的宽度一样
本帖最后由 ndsc213456789 于 2012-04-18 16:39:06 编辑 我在一个名为p1的Picturebox中显示字符串,想让这个字符串宽度和Picturebox宽度一样:程序如下:


sub showTXT(str as string)
  dim fs,tw
  fs = P1.Font.Size: tw = P1.TextWidth(str)  '记录下原有字体size以及在这个size下显示文字的宽度
  If tw <> P1.ScaleWidth Then  
    P1.Font.Size = fs * P1.ScaleWidth / tw  '根据Picturebox宽度重新设定字号
  end if
  p1.print str
end sub


但显示出来的文字总宽度总比Picturebox宽度要长一些或短一些
[最优解释]
字体大小是有粒度的,总会产生误差,不如直接用图片缩放。
'增加一个 PictureBox : p0
Option Explicit

Sub showTxt(str As String)
    Dim tw As Single
    Dim th As Single
    Dim r As Single
    
    p0.Font = p1.Font
    p0.Cls
    p0.Print str
    
    tw = p0.TextWidth(str)
    th = p0.TextHeight(str)
    r = p1.ScaleWidth / tw
    
    p1.PaintPicture p0.Image, 0, 0, tw * r, th * r, 0, 0, tw, th
End Sub

Private Sub Command1_Click()
    showTxt "hello"
End Sub

Private Sub Form_Load()
    p0.Visible = False
    p0.Move p1.Left, p1.Top, p1.Width, p1.Height
    p0.AutoRedraw = True
End Sub

[其他解释]
关于这个问题,我认为GDI+是最合适的了,不仅能够写超大的字,还能写出很多种特殊效果的字体,参见下面的例子:

'1、在网上下载一个GDIPlus.tlb,下载地址:http://www.vbgood.com/thread-82786-1-1.html
'2、使用Gdiplus.tlb,将其放到system32中,然后添加对其的引用
'3、手动设置Form的AutoRedraw=True,ScaleMode=Pixels
Option Explicit
Dim lngGraphics As Long
Dim gpP As GpStatus
Dim lngPen1 As Long
Dim lngToken As Long
Dim lngSolidBrush As Long
Dim GpInput As GdiplusStartupInput
Private lngFontFamily As Long               '字体类型
Private lngStringFormat As Long             '字符串格式
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'设置字体大小为图片框的显示宽度:Picture1.ScaleHeight
'设置显示的区域高度为:Picture1.ScaleHeight
'设置显示的区域高度为:Picture1.ScaleWidth
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Private Sub Command1_Click()
    Dim intP As Integer
    Dim bolP As Boolean
    gpP = GdipCreateFromHDC(Picture1.hDC, lngGraphics)
    bolP = DrawNormalText("新宋体", _
                          &H808000FF, _
                          StringAlignmentCenter, _


                          Picture1.ScaleHeight, _
                          FontStyle.FontStyleBold, _
                          UnitPixel, _
                          TextRenderingHintAntiAliasGridFit, _
                          0, _
                          0, _
                          Picture1.ScaleWidth, _
                          Picture1.ScaleHeight, _
                          "中")
   
    Picture1.Refresh
End Sub
Private Sub Form_Load()
    Dim bolP As Boolean
    
    With Me
        .Caption = "GDIPlus范例"
        .Width = 960 * 15
        .Height = 720 * 15
        .Left = (Screen.Width - .Width) * 0.5
        .Top = (Screen.Height - .Height) * 0.5
    End With
    '以下两个属性最好手动设置
    Picture1.AutoRedraw = True
    Picture1.ScaleMode = 3
    Picture1.Width = Picture1.Height    '使图片框的长宽一致
    
    GpInput.GdiplusVersion = 1
    If lngToken = 0 Then bolP = (GdiplusStartup(lngToken, GpInput) = Ok)
    
    
End Sub
'************************************************************************************************************************
'函数功能:按照一定的格式书写文字,正常排列(不包括:旋转、描边等)
'参数说明:strFontName:字体名称
'        :lngFontColor:文字颜色
'        :stringAlignMode:对齐方式
'        :sngFontSize:字体大小
'        :lngFontStyle:字体样式(粗体、斜体..)
'        :DrawUnit:绘图单元
'        :TextRenderMode:文本渲染模式
'        :lngLeft:绘制文本区域    Left
'        :lngTop:绘制文本区域     Top
'        :lngWidth:绘制文本区域   Width
'        :lngHeight:绘制文本区域  Height


'        :strText:要书写的文本
'返回说明:成功:True   失败:False
'************************************************************************************************************************
Private Function DrawNormalText(ByVal strFontName As String, ByVal lngFontColor As Long, _
                         ByVal StringAlignMode As StringAlignment, _
                         ByVal sngFontSize As Single, ByVal lngFontStyle As Long, _
                         ByVal DrawUnit As GpUnit, ByVal TextRenderMode As TextRenderingHint, _
                         ByVal lngLeft As Long, ByVal lngTop As Long, _
                         ByVal lngWidth As Long, ByVal lngHeight As Long, ByVal strText As String) As Boolean
    Dim gpP As GpStatus
    Dim lngCurFont As Long
    Dim rclayout As RECTF
On Error GoTo errFun
    gpP = GdipCreateFontFamilyFromName(strFontName, 0, lngFontFamily)
    gpP = GdipCreateStringFormat(0, 0, lngStringFormat)
    gpP = GdipCreateSolidFill(lngFontColor, lngSolidBrush)
    gpP = GdipSetStringFormatAlign(lngStringFormat, StringAlignMode)
    gpP = GdipCreateFont(lngFontFamily, sngFontSize, lngFontStyle, DrawUnit, lngCurFont)
    gpP = GdipSetTextRenderingHint(lngGraphics, TextRenderMode)
    With rclayout
        .Left = lngLeft
        .Top = lngTop
        .Width = lngWidth
        .Height = lngHeight
    End With
    gpP = GdipDrawString(lngGraphics, strText, -1, lngCurFont, rclayout, lngStringFormat, lngSolidBrush)
    gpP = GdipDeleteFontFamily(lngFontFamily)
    gpP = GdipDeleteStringFormat(lngStringFormat)
    gpP = GdipDeleteFont(lngCurFont)
    gpP = GdipDeleteBrush(lngSolidBrush)
    lngSolidBrush = 0
    lngFontFamily = 0
    
    If IsNull(gpP) Then
        DrawNormalText = False
    Else
        DrawNormalText = True
    End If
    
    Exit Function
errFun:
    DrawNormalText = False


End Function
'************************************************************************************************************************
'函数功能:按照一定的格式书写文字,特殊格式包括:旋转、描边等
'参数说明:strFontName:字体名称
'        :lngBrushColor:文字颜色
'        :stringAlignMode:对齐方式
'        :lngFontStyle:字体样式(粗体、斜体..)
'        :lngLineColor:边框颜色
'        :sngLineWidth:边框宽度
'        :DrawLineUnit:边框绘制单位
'        :sngFontSize:字体大小
'        :lngLeft:绘制文本区域    Left
'        :lngTop:绘制文本区域     Top
'        :lngWidth:绘制文本区域   Width
'        :lngHeight:绘制文本区域  Height
'        :strText:要书写的文本
'        :dblAngle:字符串和X轴正方向的夹角(0~2*Pi)
'返回说明:成功:True   失败:False
'************************************************************************************************************************
Private Function DrawSpecialText(ByVal strFontName As String, ByVal lngBrushColor As Long, _
                         ByVal StringAlignMode As StringAlignment, ByVal lngFontStyle As Long, _
                         ByVal lngLineColor As Long, ByVal sngLineWidth As Single, _
                         ByVal DrawLineUnit As GpUnit, ByVal BrushMode As FillMode, _
                         ByVal sngFontSize As Single, ByVal lngLeft As Long, _
                         ByVal lngTop As Long, ByVal lngWidth As Long, _
                         ByVal lngHeight As Long, ByVal strText As String, _
                         ByVal dblAngle As Double) As Boolean
    Dim gpP As GpStatus
    Dim lngStringPath As Long
    Dim rclayout As RECTL
On Error GoTo errFun
    gpP = GdipCreateFontFamilyFromName(strFontName, 0, lngFontFamily)       '创建字体类型
    gpP = GdipCreateStringFormat(0, 0, lngStringFormat)                     '创建字符串格式
    gpP = GdipSetStringFormatAlign(lngStringFormat, StringAlignMode)        '设置字符串格式


    gpP = GdipCreateSolidFill(lngBrushColor, lngSolidBrush)                  '创建一个实心刷子
    gpP = GdipCreatePen1(lngLineColor, sngLineWidth, DrawLineUnit, lngPen1)
    
    With rclayout
        .Left = lngLeft
        .Top = lngTop
        .Width = lngWidth
        .Height = lngHeight
    End With
    gpP = GdipCreatePath(BrushMode, lngStringPath)
    gpP = GdipAddPathStringI(lngStringPath, strText, -1, lngFontFamily, _
                             lngFontStyle, sngFontSize, rclayout, lngStringFormat)
    gpP = GdipFillPath(lngGraphics, lngSolidBrush, lngStringPath)
    gpP = GdipDrawPath(lngGraphics, lngPen1, lngStringPath)
    If IsNull(gpP) Then
        DrawSpecialText = False
    Else
        DrawSpecialText = True
    End If
    
    gpP = GdipDeleteFontFamily(lngFontFamily)
    gpP = GdipDeleteStringFormat(lngStringFormat)
    gpP = GdipDeletePath(lngStringPath)
    gpP = GdipDeleteBrush(lngSolidBrush)
    gpP = GdipDeletePen(lngPen1)
    lngSolidBrush = 0
    lngFontFamily = 0
    lngPen1 = 0
    
    
    
    Exit Function
errFun:
    DrawSpecialText = False
End Function


[其他解释]
引用:
字体大小是有粒度的,总会产生误差,不如直接用图片缩放。

VB code
'增加一个 PictureBox : p0
Option Explicit

Sub showTxt(str As String)
    Dim tw As Single
    Dim th As Single
    Dim r As Single
    
    p0.Font = p1.Fo……


直接释放的字体将非常难看,最好的方法是使用API创建合适的字体
[其他解释]
引用:
直接释放的字体将非常难看,最好的方法是使用API创建合适的字体


这种方法会的不多,有代码么,发来看看?
[其他解释]
引用:
引用:
直接释放的字体将非常难看,最好的方法是使用API创建合适的字体

这种方法会的不多,有代码么,发来看看?

是啊,用p1.PaintPicture p0.Image 产生的字很难看,像色块组成的。不知道word的里艺术字怎么可以无级缩放
[其他解释]
我上传的Gdiplus.tlb
------其他解决方案--------------------


引用:
Sub showTxt(str As String)
    Dim tw As Single
    Dim th As Single
    Dim r As Single
    
    p0.Font = p1.Font
    p0.Cls
    p0.Print str
    
    tw = p0.TextWidth(str)
    th = p0.TextHeight(str)
    r = p1.ScaleWidth / tw
    
    p1.PaintPicture p0.Image, 0, 0, tw * r, th * r, 0, 0, tw, th
End Sub

改进纯 VB 的方法
Sub showTxt(str As String)
    Dim tw As Single
    Dim th As Single
    Dim r As Single
    
    p0.Font = p1.Font
    
    '先将放大字体到稍小与宽度
    p0.FontSize = 10
    r = p1.ScaleWidth / p0.TextWidth(str)
    p0.FontSize = Int(10 * r)
    Debug.Print p0.FontSize
    
    p0.Cls
    p0.Print str
    
    tw = p0.TextWidth(str)
    th = p0.TextHeight(str)
    r = p1.ScaleWidth / tw
    
    p1.PaintPicture p0.Image, 0, 0, tw * r, th * r, 0, 0, tw, th
End Sub

[其他解释]
引用:
引用:
Sub showTxt(str As String)
Dim tw As Single
Dim th As Single
Dim r As Single

p0.Font = p1.Font
p0.Cls
p0.Print str

tw = p0.TextWidth(str)
th = p0.TextHeight(str)
r = p1.Scale……
这个方法很好,字体显示不会难看。
感谢楼上几位的回答!

热点排行