上一篇文章介紹了:如何創建一個最簡單的Windows窗體應用程序。
按照上一篇文章的介紹,我們的HelloApp項目對應如下的窗體應用程序:
這一篇文章中,我們將在這個程序的基礎上,介紹如何在項目中添加資源文件,完成對程序圖標的修改。
最終期望得到的效果為:
明確了目標,下面我們開始正式介紹。
程序是如何加載圖片的?
我們往項目中添加圖片/圖標/光標等資源文件的目的就是在程序中將其顯示出來。為了更好的理解如何在項目中添加資源文件,我們先來看看在下面的兩個程序中是如何加載資源圖片的。
1.HelloApp
還從HelloApp項目入手,回憶下我們是如何設置程序窗體的圖標的?
上文我們介紹過,WinMain函數是程序的入口,在此函數中我們要定義窗口類結構WNDCLASSEX。而此結構包含關于窗口的信息,例如應用程序圖標、窗口背景色、標題欄中顯示的名稱、窗口過程函數的名稱等。
我們可以在WinMain函數中找到設定應用程序圖標的這行代碼:
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_application));可以看到,LoadIcon函數用于加載圖標,代碼中指定使用IDI_APPLICATION作為應用程序圖標,而通過觀察定義我們會發現IDI_APPLICATION僅僅對應一個整形的數,它是如何與一個圖標對應上的呢?我們再看一個例子
2.象棋小巫師
象棋小巫師是一個開源的象棋AI程序,它最早版本的窗體界面如下:
顯然這個象棋程序的界面是通過已有的圖片資源繪制上去的。
如果去追溯它的源碼可以發現,它是通過類似于下面這行代碼來將資源中的圖片加載到程序中的:
LoadImage(Xqwl.hInst, MAKEINTRESOURCE(IDB_BOARD), IMAGE_BITMAP, 0, 0, LR_DEFAULTSIZE | LR_SHARED);其中IDB_BOARD標識的是整個棋盤對應的圖片,通過查找定義可以看到。IDB_BOARD被定義在名為resource.h的頭文件中,截圖如下:
可以看到IDB_BOARD仍然僅僅對應了一個整形的數,它是如何與圖片關聯上的呢?
在解決方案資源管理器中,我發現資源文件下有一個拓展名為.rc的文件:
它很有可能就是我們要找的答案,查看其代碼:
我們欣喜的在拓展名為.rc的文件中發現了IDB_BOARD這個變量,并且發現了疑似文件路徑的字符串。
我們按照這個路徑線索去尋找,發現正是我們想要的那張圖片:
通過我們一系列不嚴謹的求知探索,我們發現了資源圖片使用原理:
程序通過一個resource.h文件和項目的.rc文件配合來完成圖片資源的加載。
程序員只需向相應的函數(例如LoadImage)提供resource.h中定義的整形變量(例如IDB_BOARD)
整形變量IDB_BOARD具體對應的資源文件是什么是通過.rc文件控制的。
如何添加資源文件?
明白了Win32應用程序資源文件的使用原理,我們來看看如何添加資源文件?
也就是我們如何來生成resource.h文件和項目的.rc文件
我們打開上一文介紹的HelloApp項目(我僅以它為例說明,你可選擇在任意項目上完成下面的操作)
1.準備資源文件
為了完成我們的測試你需要在項目中新建一個用于存放資源的文件夾,隨便找幾張圖片放進去即可。
可以看到,我在RES文件夾中準備了一些圖片、視頻和圖標文件。
2.添加資源
在解決方案資源管理器中,右鍵資源文件->單擊添加->單擊資源
完成后會跳出如下的界面
雖然什么都還沒做,此時你已經可以看到,在解決方案資源管理器中,我們的IDE,也就是VS已經幫我們生成了resource.h和HelloApp.rc文件,盡管現在還沒有什么實質性的內容。
選擇圖標選項Icon,然后單擊導入,將我們在RES文件夾中準備的圖標文件導入。
成功后,我們可以分別在resource.h和HelloApp.rc中看到:
可以看到,VS已經幫我們生成了相應的代碼,我們可以使用整形變量IDI_ICON1來標識我們選擇的對應圖標了。
如果我們想要自己命名呢?只需直接修改resource.h和HelloApp.rc相應位置,只要這兩個文件能夠對應即可。
我將變量名修改為了IDI_XQ。
隨后,找到WndMain函數中用于描述窗體信息的WNDCLASSEX結構對應的那部分代碼,我們稍作修改:
我們重新指定了應用程序的圖標,重新生成項目,就得到了我們期望的結果:
到此就介紹完畢了。如果你想向資源文件中添加圖片/光標文件等,方法是完全類似的。
希望閱讀本文能讓你有所收獲,本文中錯誤的地方還望指正。
新聞熱點
疑難解答