DrawString打印文字的居中和右对齐高级问题讨论!

oo渣渣oo 2007-05-24 05:20:45
前提条件:
本人已经能够打印出居中对齐和右对齐的文字,前提是给出的RectangleF足够长!

情况说明:
如果文字内容比给出的RectangleF长,结果实际打印出来的文字效果始终都是右边多出的字符被截断(就象左对齐一样了!)

问题:
1.居中对齐,如何让打印出来的文字实现去头去尾,保留中间的在RectangleF范围内的部份?
2.同上,右对齐,如何让打印出来的文字实现去头,保留右边的在RectangleF范围内的部份?

请赐教!
...全文
1758 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
junjie1015 2010-11-12
  • 打赏
  • 举报
回复
StringFormat strFormat1 = new StringFormat();
strFormat1.LineAlignment = StringAlignment.Center;
strFormat1.Alignment = StringAlignment.Near;
strFormat1.Trimming = StringTrimming.Word;


g.DrawString(strBookInfo,
BodyFont, new SolidBrush(Color.Gray), _r_name, strFormat);
北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
我的代码中对测量出的Width加了个常数4,这个是个近似值.

如果你要精确的测量字符串的宽,可以通过
Dim s As Size = TextRenderer.MeasureText(Text, Font)
北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
是这样的Graphics的对字符串的测量不是太精确,所以你看不到那个"串"字了,这个差值大约是4,你可以对任一个字符来测试,代码我改了一下,你可以看一下:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

Dim str As String = "测试用的字符串,再加长一些看的更明白"
Dim rect As New Rectangle(100, 10, 50, 30)

e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, rect)
Dim format As New StringFormat(StringFormatFlags.NoWrap)
format.LineAlignment = StringAlignment.Center
format.Alignment = StringAlignment.Far

Dim size As SizeF = e.Graphics.MeasureString(str, Me.Font)
rect = New Rectangle(rect.Right - size.Width, rect.Top, size.Width + 4, rect.Height)
e.Graphics.DrawString(str, Me.Font, SystemBrushes.ControlDarkDark, rect, format)
End Sub
北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
怎么会呢,我这里就是可以的啊.
oo渣渣oo 2007-05-25
  • 打赏
  • 举报
回复
因为用你的方法试过,显示出来的字符串始终都看不到那个"串"字,设置成右对齐都不行......
oo渣渣oo 2007-05-25
  • 打赏
  • 举报
回复
感谢hbxtlhx(平民百姓-自已动手,丰衣足食) 给出的例子,不过好象你的方法没有解决我说的问题.
oo渣渣oo 2007-05-25
  • 打赏
  • 举报
回复
问题没有解决,只好采用笨办法:发现字符串过长就先截断几个字符再打印......

过几天看看没有新的方法就结贴了
北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
如果不想使用TextRenderer来绘制,可以使用计算的方法来绘制,代码如下:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Dim str As String = "测试用的字符串"
Dim rect As New Rectangle(10, 10, 50, 30)

Dim reg As Region = e.Graphics.Clip '记录原来的剪切区域
e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, rect)
Dim format As New StringFormat(StringFormatFlags.NoWrap)
format.LineAlignment = StringAlignment.Center
format.Alignment = StringAlignment.Far
'应用新的区域
e.Graphics.Clip = New Region(rect)
Dim size As SizeF = e.Graphics.MeasureString(str, Me.Font)
rect.X = (rect.X + (rect.Width - CInt(size.Width)))
rect.Width = (rect.Width - (rect.Width - CInt(size.Width)))
e.Graphics.DrawString(str, Me.Font, SystemBrushes.ControlDarkDark, rect, format)
'恢复原来的区域
e.Graphics.Clip = reg
End Sub

北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
代码多了,简单一下,是如下的样子:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Dim m_Rect As New Rectangle(10, 10, 50, 30)
e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, m_Rect)
TextRenderer.DrawText(e.Graphics, "测试用的字符串", Me.Font, m_Rect, Color.Red, Color.White, (TextFormatFlags.VerticalCenter Or TextFormatFlags.Right))
End Sub


北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
你可以使用如下的方法来显示这样的字符串内容:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Dim m_Rect As New Rectangle(10, 10, 50, 30)
e.Graphics.FillRectangle(SystemBrushes.ControlDark, m_Rect)
e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, m_Rect)
Dim format As New StringFormat(StringFormatFlags.NoWrap)
format.LineAlignment = StringAlignment.Center
format.Alignment = StringAlignment.Center
TextRenderer.DrawText(e.Graphics, "测试用的字符串", Me.Font, m_Rect, Color.Red, Color.White, (TextFormatFlags.VerticalCenter Or TextFormatFlags.Right))
End Sub

oo渣渣oo 2007-05-25
  • 打赏
  • 举报
回复
还没有解决......搞过打印的都来说说啊
oo渣渣oo 2007-05-25
  • 打赏
  • 举报
回复
感谢hbxtlhx(平民百姓-自已动手,丰衣足食)!
已经搞定了!

TextRenderer是2.0的函数我是1.1用不了,不过你提供的使用Region的思路是正确的!

我已经完全解决了问题,现把代码贴出来大家参考!同时结贴!

---------------------------------------------------------------------------
Private Sub DrawText_Right(ByVal ev As Printing.PrintPageEventArgs, ByVal strText As String, ByVal ft As Font, ByVal br As Brush, ByVal rect As RectangleF, ByVal fm As StringFormat)
If strText <> "" Then
Dim txtSize As SizeF = ev.Graphics.MeasureString(strText, ft)
Dim reg As Region = ev.Graphics.Clip '记录原来的剪切区域
Dim sngCut As Single = txtSize.Width - rect.Width '文字长度和指定框体的差异值

ev.Graphics.Clip = New Region(rect) '应用新的区域
rect.X = rect.X - sngCut
rect.Width += sngCut
ev.Graphics.DrawString(strText, ft, br, rect, fm)
ev.Graphics.Clip = reg '恢复原来的区域

txtSize = Nothing
reg.Dispose()
reg = Nothing
sngCut = Nothing
End If
End Sub

Private Sub DrawText_Center(ByVal ev As Printing.PrintPageEventArgs, ByVal strText As String, ByVal ft As Font, ByVal br As Brush, ByVal rect As RectangleF, ByVal fm As StringFormat)
If strText <> "" Then
Dim txtSize As SizeF = ev.Graphics.MeasureString(strText, ft)
Dim reg As Region = ev.Graphics.Clip '记录原来的剪切区域
Dim sngCut As Single = txtSize.Width - rect.Width '文字长度和指定框体的差异值

ev.Graphics.Clip = New Region(rect) '应用新的区域
rect.X = rect.X - sngCut / 2
rect.Width += sngCut
ev.Graphics.DrawString(strText, ft, br, rect, fm)
ev.Graphics.Clip = reg '恢复原来的区域

txtSize = Nothing
reg.Dispose()
reg = Nothing
sngCut = Nothing
End If
End Sub
---------------------------------------------------------------------------
点点星灯 2007-05-25
  • 打赏
  • 举报
回复
关注
北京的雾霾天 2007-05-25
  • 打赏
  • 举报
回复
最后的结果,如果再不行没招了:

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)

Dim str As String = "测试用的字符串,再加长一些看的更明白"
Dim rect As New Rectangle(200, 100, 50, 30)

e.Graphics.DrawRectangle(SystemPens.ControlDarkDark, rect)
Dim format As New StringFormat(StringFormatFlags.NoWrap)
format.LineAlignment = StringAlignment.Center
format.Alignment = StringAlignment.Far

Dim size As SizeF = e.Graphics.MeasureString(str, Me.Font)
rect = New Rectangle(rect.Right - size.Width, rect.Top, size.Width + 1, rect.Height)

e.Graphics.DrawString(str, Me.Font, SystemBrushes.ControlDarkDark, rect, format)
End Sub
magicbacon 2007-05-24
  • 打赏
  • 举报
回复
学习。
51Crack 2007-05-24
  • 打赏
  • 举报
回复
关注
copall 2007-05-24
  • 打赏
  • 举报
回复
嗬嗬,能不能把leftMargin搞成负的
hertcloud 2007-05-24
  • 打赏
  • 举报
回复
看看http://www.getpaint.net/index2.html 源码中 是否有
CathySun118 2007-05-24
  • 打赏
  • 举报
回复
参考:http://bbs.lnd.com.cn/dispbbs.asp?boardID=150&ID=79192&page=3
programart_life 2007-05-24
  • 打赏
  • 举报
回复
估计和api的DrawText差不多吧,GDI+貌似很多都是win32的翻版。DrawText里文字对其很容易实现的
加载更多回复(1)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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