日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows编程之使用外部动态链接库——纸牌

發布時間:2023/12/2 windows 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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编程之使用外部动态链接库——纸牌的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。