VB6.0中調(diào)用API函數(shù)創(chuàng)建和使用邏輯字體
我們在用Visual FoxPro或Power Builder 等開發(fā)工具開發(fā)各種管理系統(tǒng)時,都要打印出一些各式各樣的報表,在設(shè)計報表時,有時會遇到如下問題:報表的縱向數(shù)據(jù)列數(shù)太多,常用的寬行打印機(jī)(如LQ-1600K系列)使用最寬的紙張也無法在同一頁面內(nèi)打印出所有列;如果將打印機(jī)設(shè)為橫向打印,紙張長度設(shè)大,雖然可在連續(xù)的幾頁紙上橫向打印出來,但是這樣的報表一方面不美觀,另一方面連續(xù)的紙張容易分開,使報表同一頁面分成幾頁,也不適于打印分發(fā)給職工的工資條。從STAR-AR3240打印機(jī)在DOS環(huán)境下能打印出24×12點(diǎn)陣的漢字得到啟發(fā),打印報表時采用縱橫比可變的字體打印,就可靈活控制報表的頁面在一頁紙上打印出所有的數(shù)據(jù)列。例如要打印分發(fā)給職工的工資條,當(dāng)工資的項目較多時,就需要用橫向變倍的字體打印。
因為Windows 系統(tǒng)采用的是TrueType字體,可以平滑的無級變倍,但是縱橫比不為1的漢字畢竟不是標(biāo)準(zhǔn)漢字,在Windows的系統(tǒng)字庫中沒有,然而Windows系統(tǒng)提供了豐富的API(應(yīng)用程序接口)函數(shù),調(diào)用CreateFont()創(chuàng)建理想的邏輯字體,用這些字體打印報表就可滿足我們的需要。
要調(diào)用API函數(shù),選取相應(yīng)的函數(shù),先申明,后調(diào)用。Windows系統(tǒng)中CreateFont()的定義如下:
BOOL CreateFont( //創(chuàng)建邏輯字體,成功返回True,否則返回False。
int nHeight, // 所創(chuàng)建字體的字符高度
int nWidth, // 字體的字符平均寬度
int nEscapement, // 字符輸出方向與水平向右的方向所成角度,
以0.1度為單位
int nOrientation, // 字符與基線的角度,以0.1度為單位
int nWeight, // 字符顏色的深淺度
BYTE bItalic, // 斜體屬性標(biāo)志(0:正常字體,非0:斜體)
BYTE bUnderline, //下劃線屬性標(biāo)志(0:無下劃線,非0:有下劃線)
BYTE cStrikeOut,//刪除線屬性標(biāo)志(0:無刪除線,非0:有刪除線)
BYTE nCharSet, //字符集標(biāo)識0:ANSI字符集,1:系統(tǒng)缺省字符集
BYTE nOutPrecision, // 輸出精度
BYTE nClipPrecision, // 剪切精度
BYTE nQuality, // 輸出品質(zhì)
BYTE nPitchAndFamily, // 字符間距
LPCTSTR lpszFacename // 現(xiàn)有系統(tǒng)TrueType字體名稱
)
為了顯示和打印用戶創(chuàng)建的字體,還需要調(diào)用另外幾個API函數(shù):TextOut()、SelectObject()、DeleteObject(),它們的定義分別如下:
BOOL TextOut( //用當(dāng)前選定字體向輸出設(shè)備輸出字符串
HDC hdc, // 字符輸出設(shè)備的句柄
int nXStart, // X-軸起始位置
int nYStart, // Y--軸起始位置
LPCTSTR lpString, // 待輸出字符串的首地址
int cbString // 輸出的字符個數(shù)
); //輸出成功返回True,否則返回False。
HGDIOBJ SelectObject( //為指定的字符設(shè)備設(shè)定對象(字體)
HDC hdc, // 輸出設(shè)備的句柄
HGDIOBJ hgdiobj // 對象的句柄
);
BOOL DeleteObject( //刪除指定的邏輯對象
HGDIOBJ hObject // 對象的句柄
); //刪除成功返回True,否則返回False。
為節(jié)省篇幅,本程序僅完成了字體的創(chuàng)建、在屏幕上顯示和簡單的字符串打印示例,將其功能逐步擴(kuò)充,可編制出字體靈活的報表打印程序,以滿足用水平壓縮字體打印超寬報表的要求。
程序的源代碼如下:
'在窗口體上創(chuàng)建3個ComboBox控件,分別命名為char_type,char_size,char_vhp;
'再創(chuàng)建3個CommandButton控件,分別命名為cmd_prn,cmd_pre,cmd_quit
'最后創(chuàng)建一個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
'申明要調(diào)用的API函數(shù)
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 '清除顯示輸出區(qū)域
hsize = CLng(char_size.Text)
vsize = CDbl(Val(Left(char_vhp.Text, Len(char_vhp.Text) - 1)) / 100)
'獲取設(shè)置的縱橫比
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)
'創(chuàng)建邏輯字體,根據(jù)字符設(shè)備屬性調(diào)整為與標(biāo)準(zhǔn)尺寸相對應(yīng)的單位
Call SelectObject(Form1.hdc, hFont) '為窗體設(shè)置字體
Form1.CurrentY = 600
Print prnstr '在顯示器上輸出字符串
End Sub
Private Sub cmd_prn_Click()
Call TextOut(Printer.hdc, 0, 0, prnstr, LenB(prnstr))
'向打印機(jī)發(fā)送字符串
Printer.EndDoc
End Sub
Private Sub cmd_quit_Click()
Call DeleteObject(hFont) '刪除創(chuàng)建的字體對象
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
(運(yùn)行環(huán)境:PⅡ400聯(lián)想機(jī),Windows98,VB6.0)
作者會員名:wangsb
作者簡介:湖北省十堰市太和醫(yī)院計算機(jī)中心(442000)