http://vistaswx.com/blog/article/category/tutorial/page/2
2009 年 6 月 18 日 7条评论
标签: GdiPlus,vb,文字 分类: Tutorial,VB6 GDI+

图形我们已经会画了,现在还有一个问题,就是怎么显示文字呢?这一篇我将介绍GDI+中绘制文字的推荐方法(感谢reker的修正)

1.GDI+中文字的必须要素

首先,与其它软件一样,GDI+中的文字也有格式。画文字有多种画法,但是无论如何,我们都需要创建一个FontFamily,这其中包含了字体类型的信息,包括字体名称、字体对齐方式(需要设置)等等。一般的画法然后还要从这个FontFamily创建一个Font,这个Font中包括字体样式(粗体、斜体)、字号等等,再后来我们调用一个函数把文字用这个Font显示出来~;路径画法(可以显示边框画法)则不需要创建字体,直接调用函数,字体的样式包括在函数里面了。

可见,GDI+中文字是需要一个FontFamily(一般是全局的),和一些Font(各种不同样式)以及文字组成的。

2.GDI+绘制文字

GDI+绘制文字有几种,下面将分别示例。

(1)标准画法:GdipDrawString

这是一般的画文字的办法,这种画法支持ClearTypeGridFit(还需要用语句再设置下),需要创建Font。

以下是主要绘图部分(窗体):

 
Option Explicit
 
Dim graphics As Long, Brush As Long
Dim fontfam As Long, strformat As Long, curfont As Long, rclayout As RECTF
 
Private Sub Form_Load()
    InitGDIPlus
 
    GdipCreateFromHDC Me.hDC, graphics
    GdipCreateFontFamilyFromName StrPtr("黑体"), 0, fontfam
    GdipCreateStringFormat 0, 0, strformat
    GdipCreateSolidFill &HFFFF0000, Brush
    GdipSetStringFormatAlign strformat, StringAlignmentNear
    GdipCreateFont fontfam, 15, FontStyle.FontStyleItalic, UnitPixel, curfont
 
    GdipSetTextRenderingHint graphics, TextRenderingHintClearTypeGridFit
 
    rclayout.Left = 100
    rclayout.Top = 100
    rclayout.Right = 150
    rclayout.Bottom = 150
 
    GdipDrawString graphics, StrPtr("Hellow world! 这是我们第一个GDI+文字~!!"), -1, curfont, rclayout, strformat, Brush
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    GdipDeleteFontFamily fontfam
    GdipDeleteStringFormat strformat
    GdipDeleteFont curfont
    GdipDeleteBrush Brush
    GdipDeleteGraphics graphics '释放graphics占用的内存
 
    TerminateGDIPlus
End Sub

可以看到这种画法思路是:

1.创建FontFamily (StrPtr:获取字符串指针,这样就能支持中文了!这就是不用TLB的原因……)

2.创建stringFormat(一般也可以不创),设置样式

3.创建Font。其中一定要注意单位问题。否则不要问我进去14输出的怎么不是14px大小文字……这里我们字体样式也巧妙了下,虽然声明中可以改写为As FontStyle但是不推荐。于是我们写就写FontStyle.xxx这样又可读性高,又不会出错。

4.创建Brush(显示文字咯)

5.设置文字区域(RcLayout)

6.绘制图形

7.扫地工作

这样 完美地画出了字。

注意:rectf中虽然是right,bottom但是实际上是width height,不要被误导哟。!

 

(2)路径画法:GdipAddPathString

这种画法一般用于绘制旋转文字、描边的文字等等。虽然可以设置graphics的圆滑设置,但是它画出来的文字依然不怎么清晰(相对于第一种来说)

窗体中:

 
Option Explicit
 
Dim graphics As Long, Brush As Long, Pen As Long
Dim fontFam As Long, strFormat As Long, strPath As Long, rclayout As RECTL
 
Private Sub Form_Load()
    InitGDIPlus
 
    GdipCreateFromHDC Me.hDC, graphics
    GdipSetSmoothingMode graphics, SmoothingModeAntiAlias
 
    GdipCreateFontFamilyFromName StrPtr("Verdana"), 0, fontFam
    GdipCreateStringFormat 0, 0, strFormat
    GdipSetStringFormatAlign strFormat, StringAlignmentNear
 
    GdipCreateSolidFill &HFFDEDEDE, Brush
    GdipCreatePen1 &HFF222222, 2, UnitPixel, Pen
 
    rclayout.Left = 10
    rclayout.Top = 10
    rclayout.Right = 200
    rclayout.Bottom = 150
 
    GdipCreatePath FillModeAlternate, strPath
    GdipAddPathStringI strPath, StrPtr("描边 0123"), -1, fontFam, FontStyle.FontStyleBold, 55, rclayout, strFormat
    GdipFillPath graphics, Brush, strPath
    GdipDrawPath graphics, Pen, strPath
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    GdipDeleteFontFamily fontFam
    GdipDeleteStringFormat strFormat
    GdipDeletePath strPath
    GdipDeleteBrush Brush
    GdipDeletePen Pen
 
    GdipDeleteGraphics graphics '释放graphics占用的内存
 
    TerminateGDIPlus
End Sub

好 回来了 我们来比较一下这个画法有什么好处。

看出来了 它可以描边……恩 我不是在上面说了嘛 它还支持旋转、合并等等。

对了 我还说过“画出来不怎么清晰”,这里好像很好嘛!其实不然。如果你把描边去掉,单单FillPath,并且把字号减小 比如14,字体样式为普通,你就会发现不清晰了~!

它的过程是这样的:

1.首先前面部分和画普通文字一样 都需要创建FontFamily还有可选的创建字体对齐格式等等。

2.接下来路径画法不需要创建Font,我们需要创建(初始化)一个路径,否则可是什么都没有哦~

3.然后我们需要把文字增加到Path中去。

4.我们要FillPath填充这个路径 或者是DrawPath描出这个路径。如果是实心文字自然就是FillPath咯

5.最后别忘了释放Pen(如果有)和Brush(如果有) 以及最后一个Path。

(3)底层画法:GdipDrawDriverString

如名,底层画法。这种画法是最底层的绘制文字,底层到了……它不会自动转换字体(比如用Verdana绘制中文字体就不会显示出来) 由于不常使用,这里不贴画法了。

VB6 GDI+ 入门教程[4] 文字绘制的更多相关文章

  1. VB6 GDI+ 入门教程[3] 笔、刷子、矩形、椭圆绘制

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[3] 笔.刷子.矩形.椭圆绘制 2009 年 6 月 1 ...

  2. VB6 GDI+ 入门教程[2] GDI+初始化

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[2] GDI+初始化 2009 年 6 月 18 日 7 ...

  3. VB6 GDI+ 入门教程[5] 基础绘图小结

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[5] 基础绘图小结 2009 年 6 月 18 日 4条 ...

  4. VB6 GDI+ 入门教程[6] 图片

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...

  5. VB6 GDI+ 入门教程[7] Graphics 其他内容

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[7] Graphics 其他内容 2009 年 9 月 ...

  6. VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[8] Bitmap魔法(1):创建 2009 年 9 月 ...

  7. VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写

    本文转自 http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[9] Bitmap魔法(2):数据读写 200 ...

  8. VB6 GDI+ 入门教程[1] GDI+介绍

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[1] GDI+介绍 2009 年 6 月 18 日 17 ...

  9. WebGL入门教程(二)-webgl绘制三角形

    前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...

随机推荐

  1. COM技术の接口

    什么是接口 DLL的接口可以理解为其导出的那些函数,C++类的接口则是该类的一个成员函数集. 对于COM来说,接口是一个包含一个函数指针数组的内存结构,每一个数组元素包含的是一个由组件所实现的函数的地 ...

  2. if for case 及多参数同时传递

    #!/bin/bash in 'start') echo "start server..." ;; 'stop') echo "stop server..." ...

  3. shell中awk用法

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  4. 压缩和解压缩gz包

    gz是Linux和OSX中常见的压缩文件格式,下面是用java压缩和解压缩gz包的例子 public class GZIPcompress { public static void FileCompr ...

  5. java配置问题

    先安装jdk.然后这样设置:**********************全为系统变量**************************变量名:JAVA_HOME变量值:D:\Program File ...

  6. easyui DataGrid 的 Checkbox 选择多行

    这么一来在取得 DataGrid 的 Checkbox 有勾选的数据值就可以沿用方式一的程序, 1.$('#ButonGetCheck').click(function(){ 2.var checke ...

  7. 在vs中怎样一次性的添加一个文件夹到解决方案里

    这个方法通常用到编译源码库方面,在这里我以编译静态库为例: 1.首先建立自己的工程Mytest 第二步 选择静态库 点击finish 完成工程的建立 第三步 点击PROJECT菜单项 选中Show A ...

  8. Mysql任务调度

    Mysql任务调度 Event调度配置 Mysql任务调度Event不执行 Mysql任务作业Event不执行 我采用的方法就是: 方法一:找到当前使用的 .cnf 文件,在 [mysqld] 的下面 ...

  9. bzoj 3234: [Ahoi2013]立方体

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3234 题意:求长方体交的表面积. 思路:flood-fill const int ...

  10. asynchronous vs non-blocking

    http://stackoverflow.com/questions/2625493/asynchronous-vs-non-blocking In many circumstances they a ...