VB6.0中调用API函数创建和使用逻辑字体
来源:互联网 发布:安卓软件源码是什么 编辑:程序博客网 时间:2024/05/01 17:38
正文:
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篇。
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>- VB6.0中调用API函数创建和使用逻辑字体
- 在VB6中使用API函数实现矢量图的绘制。
- 在VB6中使用API函数实现矢量图的绘制
- 如何在VB6.0中创建和使用文本资源文件
- 如何在VB6.0中创建和使用文本资源文件
- 【VB6】使用VB6创建和访问Dom树【爬虫基础知识】
- EXCEL表格中直接使用vb6创建的dll中的自定义函数
- excel VBA中调用VB6写的DLL中的窗体和过程函数
- VB6.0 中怎样调用一个EXE
- 常用 API 函数: 文本和字体函数
- 自编的VB6.0调用WinAPI的模块(整合了许多函数和过程)
- vb6如何设置和获取 cookie,使用 WinInet api url
- 在.Net中创建和使用自已的私有字体
- VB6.0 Windows API
- VB6.0中MsgBox函数的Bug
- VB6.0中Dir()函数的使用方法
- 函数创建和调用
- VB6使用API下载文件
- XML简明教程(8)什么是经过类型定义的XML值
- 用VB实现目录选择+浏览
- XML简明教程(6)什么是XML Schema
- 经典加密算法在VB中的实现(1)- Base64
- XML简明教程(4)什么是XML对象模型
- VB6.0中调用API函数创建和使用逻辑字体
- XSL函数介绍(1)
- 用Visual Basic自编小游戏
- XML简明教程(5)什么是XML名域
- 让标题栏文字居中
- XML简明教程(3)什么是XML数据岛
- 禁止使用 Alt+F4 关闭窗口
- XML简明教程(1)什么是XML元素
- 用VB创建不规则窗口