Windows编程之使用外部动态链接库——纸牌
C語言功能強大的一個重要原因是因為具有豐富的庫函數,例如字符串處理有string庫,數學處理有math庫。微軟公司對程序庫的支持又更進一步,提供了豐富的動態鏈接庫。下面以微軟操作系統內嵌的紙牌鏈接庫為例寫一個簡單的小程序。
由于我們已經較為理解Windows應用程序的框架了,因此這次拓展練習將所有的代碼由手工完成一個最簡潔的框架。
在WinLearn中創建新的Win32 Application,項目名叫做WinStep6。在選項中注意選擇簡單的應用程序。
圖1 創建簡單應用程序
初始的代碼應該是這樣的:
我們首先在WinMain中注冊一個窗口類。窗口類的代碼可以從早期的WinStep1中的MyRegistClass函數中復制過來:
注意其中刪除了和資源相關的代碼。
然后通過剛注冊的WinStep6窗口類,生成紙牌的主窗口。相應的代碼可以從WinStep1中的InitInstance函數中復制過來。
向主函數中增加主循環代碼。主循環代碼可以從WinStep1中的WinMain復制過來。
向程序中添加消息處理函數MainProc。消息處理函數可以由WinStep1中的MainWndProc復制并改編而來。因為我們不用處理菜單和快捷鍵,因此將相關的代碼刪除了。剩下的框架如下:
將一些變量的聲明,函數的聲明補充完整,這個最簡單的框架就可以運行了。
我們自定義的框架程序運行結果:
在這個最簡框架基礎上,我們來做一個簡單的紙牌顯示和操作的演示。
微軟提供的紙盤鏈接庫叫做cards.dll,通常在Windows\System32目錄下。若是找不到該鏈接庫,可以從網絡或者網絡課堂下載。
動態鏈接庫(.dll)和常見的靜態鏈接庫(.lib,例如math.lib)類似,都存放了函數的二進制代碼。但是動態鏈接庫要多一些步驟。首先是程序執行時根據需要加載動態鏈接庫,和程序不再需要庫函數時從內存中卸載動態鏈接庫以節約內存開銷。這兩個函數分別是LoadLibrary和FreeLibrary。在剛才的最簡框架基礎上添加對cards的打開和關閉:
程序片段34 動態鏈接庫的加載
程序片段35 動態鏈接庫的釋放
然后需要從動態鏈接庫中獲得函數的入口。
微軟的cards.dll提供了5個函數來繪制紙牌,和大多數靜態鏈接庫不同,微軟的cards.dll沒有提供頭文件,因此需要我們手工建立這5個函數的聲明。一般而言,我們應該為cards.dll的函數專門建立一個cards.h頭文件,但是為了簡潔起見,在WinStep6中,僅僅將這幾個頭文件放置在WinStep6.cpp開頭的位置。
并且在函數聲明后面立即為這5個函數建立全局函數指針備用:
注意這5個typedef定義了一種函數指針類型,舉例而言,第一行的函數定義如下:
這行定義了一個接受兩個整型指針作為形參并且返回BOOL類型(其實BOOL就是int類型)的函數指針,凡是這樣的函數指針都可以叫做pfcdtInit類型。
因此下面的全局變量定義中,使用pfcdtInit定義了一個函數指針:
在應用程序設計中,這樣的書寫方式很常見,希望同學們能夠模仿并書寫自己的函數指針定義。
在主函數中,等動態鏈接庫加載成功后,便可以從動態鏈接庫中獲得這5個函數的入口地址(即給前述5個指針變量賦值)
在正式繪圖前,需要知道所繪制的一張完整的紙牌的大小(所占用的像素)。這使用cdtInit函數可以獲得。
因為在繪圖中會反復用到紙牌的大小,因此將這大小數據以全局變量形式存放:
并且在主函數中獲得牌的大小:
下面在WM_PAINT中繪制我們的第一張牌:紅桃K。注意為了后面的繪圖,下面的代碼中增加了一個矩形結構體RECT,并且在繪圖代碼WM_PAINT中增加了獲得窗口位置大小的信息的代碼。
現在程序可以運行并且繪制一張圖片了。
繪圖函數cdtDraw的參數很直接:hdc表示在哪個窗口繪圖,20,20表示左上角20,20坐標位置;50表示第50號牌。cards每張牌均有一個牌號,若定義花色為suit(03),點數為face(012),則有公式card = suit + face * 4例如紅桃K的卡號為2+12×4=50。卡號53~68為各種牌的背面。type為顯示類型,type=0時表示顯示正面,這時候卡號card只能是0~51,當type=1時表示顯示牌背面,這時候卡號card只能是53~68.使用其他卡號將繪制錯誤的牌。
總結
以上是生活随笔為你收集整理的Windows编程之使用外部动态链接库——纸牌的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去哪儿旅行怎么退票在哪取消(汉典去字的基
- 下一篇: Windows编程初步(三)【说明:有敏