VB6.0中調用API函數建立和使用邏輯字型

來源:互聯網
上載者:User
VB6.0中調用API函數建立和使用邏輯字型 作者:王壽兵 發布時間:2001/05/15
 
文章摘要:
  我們在用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。
  為節省篇幅,本程式僅完成了字型的建立、在螢幕上顯示和簡單的字串列印樣本,將其功能逐步擴充,可編製出字型靈活的報表列印程式,以滿足用水平壓縮字型列印超寬報表的要求。
  程式運行時字型壓縮效果之一如下兩幅對比圖所示:

  

            圖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篇。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.