VB6.0中调用API函数创建和使用逻辑字体

原创 2001年06月07日 02:10:00
VB6.0中调用API函数创建和使用逻辑字体 作者:王寿兵 发布时间:2001/05/15
 
文章摘要:
  我们在用Visual FoxPro或Power Builder 等开发工具开发各种管理系统时,都要打印出一些各式各样的报表,在设计报表时,有时会遇到如下问题:报表的纵向数据列数太多,常用的宽行打印机(如LQ-1600K系列)使用最宽的纸张也无法在同一页面内打印出所有列;
       

正文: button_class.GIF  

VB6.0中调用API函数创建和使用逻辑字体

  我们在用Visual FoxPro或Power Builder 等开发工具开发各种管理系统时,都要打印出一些各式各样的报表,在设计报表时,有时会遇到如下问题:报表的纵向数据列数太多,常用的宽行打印机(如LQ-1600K系列)使用最宽的纸张也无法在同一页面内打印出所有列;如果将打印机设为横向打印,纸张长度设大,虽然可在连续的几页纸上横向打印出来,但是这样的报表一方面不美观,另一方面连续的纸张容易分开,使报表同一页面分成几页,也不适于打印分发给职工的工资条。从STAR-AR3240打印机在DOS环境下能打印出24×12点阵的汉字得到启发,打印报表时采用纵横比可变的字体打印,就可灵活控制报表的页面在一页纸上打印出所有的数据列。例如要打印分发给职工的工资条,当工资的项目较多时,就需要用横向变倍的字体打印。
  因为Windows 系统采用的是TrueType字体,可以平滑的无级变倍,但是纵横比不为1的汉字毕竟不是标准汉字,在Windows的系统字库中没有,然而Windows系统提供了丰富的API(应用程序接口)函数,调用CreateFont()创建理想的逻辑字体,用这些字体打印报表就可满足我们的需要。
  要调用API函数,选取相应的函数,先申明,后调用。Windows系统中CreateFont()的定义如下:
BOOL CreateFont( //创建逻辑字体,成功返回True,否则返回False。
int nHeight, // 所创建字体的字符高度
int nWidth, // 字体的字符平均宽度
int nEscapement, // 字符输出方向与水平向右的方向所成角度,
以0.1度为单位
int nOrientation, // 字符与基线的角度,以0.1度为单位
int nWeight, // 字符颜色的深浅度
BYTE bItalic, // 斜体属性标志(0:正常字体,非0:斜体)
BYTE bUnderline, //下划线属性标志(0:无下划线,非0:有下划线)
BYTE cStrikeOut,//删除线属性标志(0:无删除线,非0:有删除线)
BYTE nCharSet, //字符集标识0:ANSI字符集,1:系统缺省字符集
BYTE nOutPrecision, // 输出精度
BYTE nClipPrecision, // 剪切精度
BYTE nQuality, // 输出品质
BYTE nPitchAndFamily, // 字符间距
LPCTSTR lpszFacename // 现有系统TrueType字体名称
)
  为了显示和打印用户创建的字体,还需要调用另外几个API函数:TextOut()、SelectObject()、DeleteObject(),它们的定义分别如下:
BOOL TextOut( //用当前选定字体向输出设备输出字符串
HDC hdc, // 字符输出设备的句柄
int nXStart, // X-轴起始位置
int nYStart, // Y--轴起始位置
LPCTSTR lpString, // 待输出字符串的首地址
int cbString // 输出的字符个数
); //输出成功返回True,否则返回False。
HGDIOBJ SelectObject( //为指定的字符设备设定对象(字体)
HDC hdc, // 输出设备的句柄
HGDIOBJ hgdiobj // 对象的句柄
);
BOOL DeleteObject( //删除指定的逻辑对象
HGDIOBJ hObject // 对象的句柄
); //删除成功返回True,否则返回False。
  为节省篇幅,本程序仅完成了字体的创建、在屏幕上显示和简单的字符串打印示例,将其功能逐步扩充,可编制出字体灵活的报表打印程序,以满足用水平压缩字体打印超宽报表的要求。
  程序运行时字体压缩效果之一如下两幅对比图所示:

  1.gif

            图1.正常楷体
  2.gif
               图2.水平压缩楷体
程序的源代码如下:

'在窗口体上创建3个ComboBox控件,分别命名为char_type,char_size,char_vhp;
'再创建3个CommandButton控件,分别命名为cmd_prn,cmd_pre,cmd_quit
'最后创建一个4个Label控件和1个Shape控件,Shape控件定义为矩形(Rectangle)

Option Explicit
Private Declare Function CreateFont Lib "gdi32" Alias "CreateFontA" (ByVal H As Long, ByVal W As Long, ByVal E As Long, ByVal O As Long, ByVal W As Long, ByVal I As Long, ByVal u As Long, ByVal S As Long, ByVal C As Long, ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, ByVal PAF As Long, ByVal F As String) As Long
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
'申明要调用的API函数

Private cur_y As Integer
Private prnstr As String '要输出的字符串
Private hsize As Long '逻辑字体的横向长度
Private vsize As Double
Private hFont As Long

Private Sub cmd_pre_Click()
Form1.Cls '清除显示输出区域
hsize = CLng(char_size.Text)
vsize = CDbl(Val(Left(char_vhp.Text, Len(char_vhp.Text) - 1)) / 100)
'获取设置的纵横比
hFont = CreateFont(CInt(hsize * 22 / 17), CInt(hsize * vsize * 2 / 3), 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, char_type.Text)
'创建逻辑字体,根据字符设备属性调整为与标准尺寸相对应的单位
Call SelectObject(Form1.hdc, hFont) '为窗体设置字体
Form1.CurrentY = 600
Print prnstr '在显示器上输出字符串
End Sub

Private Sub cmd_prn_Click()
Call TextOut(Printer.hdc, 0, 0, prnstr, LenB(prnstr))
'向打印机发送字符串
Printer.EndDoc
End Sub

Private Sub cmd_quit_Click()
Call DeleteObject(hFont) '删除创建的字体对象
End
End Sub

Private Sub Form_Load()
prnstr = "字体纵横变倍显示打印示范效果!"
char_type.AddItem ("宋体") '为各个ComboBox控件增加常用选项
char_type.AddItem ("仿宋_GB2312")
char_type.AddItem ("黑体")
char_type.AddItem ("楷体_GB2312")
char_type.AddItem ("隶书")

char_size.AddItem ("9")
char_size.AddItem ("10")
char_size.AddItem ("11")
char_size.AddItem ("12")
char_size.AddItem ("14")
char_size.AddItem ("16")
char_size.AddItem ("18")
char_size.AddItem ("20")

char_vhp.AddItem ("100%")
char_vhp.AddItem ("80%")
char_vhp.AddItem ("60%")
char_vhp.AddItem ("40%")
char_vhp.AddItem ("20%")
End Sub
(运行环境:PⅡ400联想机,Windows98,VB6.0)

作者会员名:wangsb

作者简介:湖北省十堰市太和医院计算机中心(442000) 王寿兵(Email:wangshoubing@sina.com),男,1994年7月毕业于湖北工学院计算机及应用专业,同年8月被分配到湖北省十堰市太和医院(在职职工约1500人,病床1200张的三级甲等医院)工作至今,主要从事医院内部局域网络维护工作,并从事应用软件开发,主要开发了十堰市太和医院工资管理系统,十堰市太和医院职工筹资结算系统,十堰市太和医院院外门诊收费系统等,先后在《电了产品维修与制作》、《医疗装备》,《医疗设备信息》等杂志上发表论文5篇。

版权声明:本文为博主原创文章,未经博主允许不得转载。

VB6.0中调用API函数创建和使用逻辑字体

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 05:11
  • 128

php函数的创建,以及引用传递和值传递的介绍!

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • a690353073
  • a690353073
  • 2016年05月28日 12:00
  • 252

Oracle 创建/调用函数小示例

函数与过程非常相似,它也是一种存储在数据库中的命名程序块,并且函数也可以接受零个或多个输入参数。函数与过程的主要区别在于,函数必须有返回值,并且可以作为一个表达式的一部分,函数不能作为一个完整的语句使...
  • linhaiyun_ytdx
  • linhaiyun_ytdx
  • 2017年05月02日 17:56
  • 479

创建COM并调用

在自动生成的PCOMServer_TLB.cpp中修改AddInt函数代码,实现此函数的功能。 创建客户端过程如下: project->Import Type Library 找到创建的COM类型库 ...
  • chinayu2007
  • chinayu2007
  • 2016年01月26日 20:00
  • 182

用一个函数实现链表的创建

在我以前有关链表的创建,都是用的多个函数实现的。首先要创建一个节点 然后再向节点后面插入一个个节点,即生成一条链表。 至少用两个函数实现的,一个创建节点函数 ,一个插入函数。最近发现原来用一个函数即...
  • pengqian652
  • pengqian652
  • 2013年09月18日 09:33
  • 1152

函数创建和调用

/** * Created by admin on 2017/11/3. */ //一个函数可以作为另一个函数的参数。我们可以先定义一个函数,然后传递 function say(word) { ...
  • u013127751
  • u013127751
  • 2017年11月15日 10:15
  • 28

函数的调用过程,栈桢的创建和销毁

为了能够说明wen 1.函数的调用过程 主函数main里定义了4个局部变量,然后调用同文件里的foo1()函数。4个局部变量毫无疑问都在进程的栈空间上,当进程运行起来后我们逐步了解一下main函数里是...
  • Quinn0918
  • Quinn0918
  • 2017年04月20日 14:35
  • 521

VB6.0调用DLL

目 录 第1章 VB6.0调用DLL    1 1 VC++编写DLL    1 1.1 使用__stdcall    1 1.2 使用 .DEF 文件 ...
  • Hanford
  • Hanford
  • 2016年12月10日 16:25
  • 2433

Android SQLite数据库创建和使用实战(一)

转载地址:http://blog.csdn.net/yanbober/article/details/20688273 Android SQLiteSQLiteOpenHelper数据库...
  • qq_20816947
  • qq_20816947
  • 2015年08月06日 11:05
  • 302

在Visual Studio中使用C++创建和使用LIB

什么是LIB库? 库是已经写好的,成熟的,可以复用的代码。本质上说来,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。所谓的静态,是指的链接过程。让我们来看看将一个程序编译成可执行程...
  • thebirthgod
  • thebirthgod
  • 2015年03月11日 15:25
  • 212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB6.0中调用API函数创建和使用逻辑字体
举报原因:
原因补充:

(最多只允许输入30个字)