圖標(biāo)和光標(biāo)是圖形資源,圖標(biāo)通常用做應(yīng)用程序的“形象代表”出現(xiàn)在文件瀏覽器,、運(yùn)行窗口左上角或程序的快捷方式等所有代表文件的地方,,為自己寫的應(yīng)用程序選一個(gè)合適的圖標(biāo)會(huì)使程序變得引人注目;而光標(biāo)就是鼠標(biāo)移動(dòng)時(shí)屏幕上那個(gè)指示位置的東西,,應(yīng)用程序可以定義自己的光標(biāo),,這樣光標(biāo)移到程序的客戶區(qū)中就會(huì)變成需要的形狀。
5.2.1 圖標(biāo)和光標(biāo)的資源定義
和菜單,、加速鍵等資源不同,,在資源腳本文件中定義圖標(biāo)和光標(biāo)時(shí)并不是一個(gè)個(gè)像素地定義,而是指定圖標(biāo)和光標(biāo)的文件名,,由資源編譯器將像素?cái)?shù)據(jù)讀入再轉(zhuǎn)換成二進(jìn)制格式,,所以在資源定義之前要用其他工具先創(chuàng)建圖標(biāo)和光標(biāo)文件,。圖標(biāo)和靜態(tài)光標(biāo)文件的擴(kuò)展名分別是ico和cur,,還有一種擴(kuò)展名為ani的動(dòng)態(tài)光標(biāo)文件。
光標(biāo)和圖標(biāo)在資源文件中的定義語句是:
圖標(biāo)ID ICON [DISCARDABLE] 圖標(biāo)文件名 ,;定義圖標(biāo)
光標(biāo)ID CURSOR [DISCARDABLE] 光標(biāo)文件名 ,;定義光標(biāo)
DISCARDABLE關(guān)鍵字是內(nèi)存選項(xiàng),表示在不用的時(shí)候可以從內(nèi)存暫時(shí)卸掉,,當(dāng)文件名包含空格時(shí),,兩邊要用雙引號(hào)引起來,圖標(biāo)ID和光標(biāo)ID同樣也可以用16位的整數(shù)或字符串表示,,這里是幾個(gè)定義的例子:
MyIcon icon “1.ico” ,;把1.ico定義為ID為“MyIcon”的圖標(biāo)資源
1000 icon discardable 2.ico ;把2.ico定義為ID為1000的圖標(biāo)資源
1001 icon “big icon.ico” ,;把big icon.ico定義為ID為1001的圖標(biāo)資源
1002 cursor “big arrow.ani” ,;把big arrow.ani定義為ID為1002的光標(biāo)資源
GoodCursor cursor arrow.cur ;把a(bǔ)rrow.cur定義為ID為“GoodCursor”的光標(biāo)資源
資源文件中定義的圖標(biāo)可以不止一個(gè),,但
Windows在“我的電腦”中列出文件的時(shí)候總是使用資源中的第一個(gè)圖標(biāo)當(dāng)做文件的圖標(biāo),,所以在資源腳本文件中要把想用做程序圖標(biāo)的圖標(biāo)定義語句排在最前面,。
5.2.2 使用圖標(biāo)和光標(biāo)
在這里,用一個(gè)例子來說明圖標(biāo)和光標(biāo)的用法,,程序是建立在FirstWindow.asm和Menu.asm程序的基礎(chǔ)上的,,為了節(jié)省篇幅,在這里就不列出全部源程序了,,完整的源程序可以在所附光盤的Chapter05\Icon目錄中找到,。程序中創(chuàng)建了一個(gè)菜單,運(yùn)行后可以在“圖標(biāo)和光標(biāo)”菜單中選擇不同的圖標(biāo)和光標(biāo),,選擇不同的圖標(biāo)以后,,窗口標(biāo)題欄左邊的圖標(biāo)和桌面任務(wù)欄上的窗口圖標(biāo)都會(huì)變化;選擇不同的光標(biāo)后,,當(dāng)鼠標(biāo)移動(dòng)到窗口客戶區(qū)中的時(shí)候,,光標(biāo)會(huì)變成程序指定的光標(biāo)。具體的效果如圖5.3所示,,大圖標(biāo)對(duì)應(yīng)“笑臉”,,小圖標(biāo)對(duì)應(yīng)“箭頭”,而光標(biāo)A和B分別是“小恐龍”光標(biāo)和“手型”光標(biāo),,其中“小恐龍”光標(biāo)是ani類型的動(dòng)態(tài)光標(biāo),,在屏幕上顯示為一個(gè)走動(dòng)中的恐龍模樣。
圖5.3 不同的圖標(biāo)和光標(biāo)
資源文件Icon.rc的定義如下:
//>>
#include <resource.h>
//>>
#define ICO_BIG Ox1000
#define ICO_SMALL Ox1001
#define CUR_2 Ox1000
#define IDM_MAIN Ox2000
#define IDM_EXIT Ox2101
#define IDM_BIG Ox2201
#define IDM_SMALL Ox2202
#define IDM_CUR1 Ox2203
#define IDM_CUR2 Ox2204
//>>
ICO_SMALL ICON "Small.ico"
ICO_BIG ICON "Big.ico"
CUR_2 CURSOR "2.cur"
//>>
IDM_MAIN menu discardable
BEGIN
popup "文件(&F)"
BEGIN
menuitem "退出(&X)", IDM_EXIT
END
popup "圖標(biāo)和光標(biāo)(&I)"
BEGIN
menuitem "大圖標(biāo)(&G)", IDM_BIG
menuitem "小圖標(biāo)(&M)", IDM_SMALL
menuitem separator
menuitem "光標(biāo)A(&A)", IDM_CUR1
menuitem "光標(biāo)B(&B)", IDM_CUR2
END
END
//>>
經(jīng)過上一節(jié)的“洗禮”,,讀者對(duì)菜單的定義應(yīng)該很熟悉了,,這里就不再說明IDM_MAIN的定義了,腳本文件中定義了ICO_SMALL,,ICO_BIG兩套圖標(biāo)和CUR_2靜態(tài)光標(biāo),,磁盤上還有個(gè)動(dòng)態(tài)光標(biāo)文件1.ani。
Icon.asm的大部分是窗口模板程序的內(nèi)容,,和FirstWindow.asm是相同的,,僅在窗口過程的WM_CREATE和WM_COMMAND增加了一些內(nèi)容:
.const
szCursorFile db '1.ani',0
.code
…
.if eax == WM_CREATE