VB6.0中調用API函數創建和使用邏輯字體
發表于:2007-07-14來源:作者:點擊數:
標簽:
作者:王壽兵 文章摘要: 我們在用Visual FoxPro或Power Builder 等 開發 工具開發各種管理系統時,都要打印出一些各式各樣的報表,在設計報表時,有時會遇到如下問題:報表的縱向數據列數太多,常用的寬行打印機(如LQ-1600K系列)使用最寬的紙張也無法在同一
作者:王壽兵
文章摘要:
我們在用Visual FoxPro或Power Builder 等
開發工具開發各種管理系統時,都要打印出一些各式各樣的報表,在設計報表時,有時會遇到如下問題:報表的縱向數據列數太多,常用的寬行打印機(如LQ-1600K系列)使用最寬的紙張也無法在同一頁面內打印出所有列;
--------------------------------------------------------------------------------
正文:
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。
為節省篇幅,本程序僅完成了字體的創建、在屏幕上顯示和簡單的字符串打印示例,將其功能逐步擴充,可編制出字體靈活的報表打印程序,以滿足用水平壓縮字體打印超寬報表的要求。
程序的源代碼如下:
'在窗口體上創建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篇。
原文轉自:http://www.anti-gravitydesign.com