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.正常楷体
图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篇。
|