★ 5--2--1 圖標(biāo)按鈕
圖標(biāo)按鈕可謂是按鈕控件使用圖像最簡(jiǎn)單的方式,除此之外圖標(biāo)按鈕的優(yōu)點(diǎn)還在于顯示在按鈕上的圖標(biāo)能夠使用透明色,因而不必再去為處理非矩形圖像在按鈕顏色發(fā)生變化時(shí)邊緣顏色的處理而費(fèi)心。不過(guò)也正是使用圖標(biāo)導(dǎo)致了圖標(biāo)按鈕的天生弱點(diǎn)。圖標(biāo)太小了,僅僅才 32×32 像素大小,在有的場(chǎng)合僅靠使用這么小的圖像就有些顯得力不從心了。
在講圖標(biāo)按鈕如何使用之前,先得告訴讀者句柄的概念。句柄是什么?很多教科書(shū)上都這樣定義:句柄是一個(gè)用于代表對(duì)象的 32 位整型值。不過(guò)這對(duì)于很多初學(xué)者而言,并不是太好理解。其實(shí)也可以將未賦值的句柄理解為一個(gè)指向“空白”(void *)的指針,事實(shí)上也如此,在 Winnt.h 中,句柄就是如此被聲明的: void *; 當(dāng)句柄被賦值之后,它就成為指向某個(gè)特定位置的指針,即代表了某個(gè)特定的對(duì)象。之所以在現(xiàn)在提及句柄,是因?yàn)榫浔? 編程中的一個(gè)關(guān)鍵性概念。盡管在前面除第三章外的內(nèi)容中很少涉及它,不過(guò)在下面的學(xué)習(xí)中我們將會(huì)很頻繁的使用到句柄。
技術(shù)概要:
使用圖標(biāo)按鈕很簡(jiǎn)單,大的步驟僅僅就三步:
①.從外部導(dǎo)入一個(gè)圖標(biāo)或自己創(chuàng)建一個(gè)圖標(biāo)作為資源。
②.從資源中載入所要使用的圖標(biāo)。
③.在要使用圖標(biāo)的按鈕上設(shè)置圖標(biāo)。
具體實(shí)現(xiàn):
■第一步導(dǎo)入圖標(biāo)沒(méi)有什么特別之處,同前面 2.2 節(jié)中使用靜態(tài)圖像控件導(dǎo)入位圖是非常類似的。無(wú)非就是使用 菜單上的 命令,導(dǎo)入或創(chuàng)建一個(gè)圖標(biāo)即可。
■第二步載入圖標(biāo)就涉及到一些細(xì)節(jié)問(wèn)題了。使用函數(shù) () 載入圖標(biāo)。因?yàn)?) 是類 的成員函數(shù),同時(shí)函數(shù) () 返回所載入圖標(biāo)的句柄。所以我們采用以下方法來(lái)調(diào)用函數(shù) ():
= () -> ();
當(dāng)然,在該語(yǔ)句之前還必須要有對(duì)圖標(biāo)句柄 的定義:
HICON ;
■第三步為按鈕設(shè)置圖標(biāo)了,這通過(guò)調(diào)用函數(shù) () 來(lái)實(shí)現(xiàn)。同時(shí)不要忘記,還須在使用圖標(biāo)的按鈕的 設(shè)置中設(shè)置 Icon 屬性,指明該按鈕是一個(gè)圖標(biāo)按鈕。因?yàn)楹瘮?shù) () 為類 的成員函數(shù),可以通過(guò)兩種方法來(lái)調(diào)用該函數(shù)。一是通過(guò) 類對(duì)象來(lái)調(diào)用 (),如下面代碼:
.(); // 為一個(gè) 類對(duì)象。
二是先由函數(shù) () 獲得一個(gè)指向 CWnd 對(duì)象的指針,再通過(guò)強(qiáng)制類型轉(zhuǎn)換將該指針轉(zhuǎn)換為一個(gè)指向 類對(duì)象的指針。進(jìn)而通過(guò)該指針來(lái)調(diào)用函數(shù) ()。具體實(shí)現(xiàn)代碼如下:
CWnd *pWnd = ();
*pBton = ( *) pWnd;
pBton -> ();
既然有第一種較為簡(jiǎn)便的方法為按鈕設(shè)置圖標(biāo),為何還要提及第二種方法呢?因?yàn)椴⒉皇窃谌魏吻闆r下都會(huì)有 類對(duì)象的,例如對(duì)于一組單選按鈕。只能為它們定義一個(gè) 類對(duì)象,如果使用該對(duì)象來(lái)調(diào)用函數(shù) (),則只能在設(shè)置了 Group 屬性的那個(gè)單選按鈕上設(shè)置圖標(biāo)。所以要達(dá)到在一組單選按鈕中分別設(shè)置不同圖標(biāo)的目的,就只有使用第二種方法。
盡管在現(xiàn)在的 編程中,資源句柄數(shù)多得相對(duì)于我們而言幾乎是無(wú)限的,但最好在使用完資源句柄后及時(shí)的把它們刪除掉。上面所講述的方法不僅適用于 Push ,而且同樣適用于 Radio 、Check Box 和 Group Box。
★ 5--2--2 位圖按鈕
圖標(biāo)按鈕雖有著種種優(yōu)點(diǎn),但它能顯示的圖像實(shí)在是太小了。在有的場(chǎng)合顯然就不適用了。位圖按鈕可以在按鈕表面顯示一幅位圖而不再是一個(gè)小小的圖標(biāo)。但是因?yàn)樵谖粓D中不能使用透明色,因而當(dāng)顯示的位圖不為矩形時(shí),就得為位圖中非矩形部分的背景色動(dòng)一番腦筋了。因?yàn)榇嬖谥脩舾淖儼粹o表面顏色,也就是位圖背景色的可能性。可以用透明位圖的技術(shù)來(lái)解決這一難題,這將在后面 5.7 實(shí)現(xiàn)具有透明性的位圖中講述。
技術(shù)概要:
位圖按鈕的使用的大致步驟同圖標(biāo)按鈕基本相似,也是以下三個(gè)步驟:
① 從外部導(dǎo)入一個(gè)位圖或自己創(chuàng)建一個(gè)位圖作為資源。
② 從資源中載入所要使用的位圖。
③ 在要使用位圖的按鈕上設(shè)置位圖。
具體實(shí)現(xiàn):
■第一步從外部導(dǎo)入一個(gè)位圖作為資源同使用圖標(biāo)按鈕時(shí)是完全一致的,在此就不詳細(xì)講述了。
■第二步中,利用函數(shù) () 從資源中載入位圖。函數(shù) () 為一個(gè) API 函數(shù),定義如下:
(
, // of
// of name
);
所以,為達(dá)到載入位圖的目的,不僅要定義一個(gè)位圖句柄 :
;
而且還要定義一個(gè)應(yīng)用程序?qū)嵗浔?;:
;
并調(diào)用函數(shù) () 以獲得當(dāng)前的應(yīng)用程序?qū)嵗浔a如下:
= ::();
只有在聲明并獲得了當(dāng)前的應(yīng)用程序句柄后,才能使用以下語(yǔ)句載入位圖:
= ::(,"BMP1");
注意,在函數(shù) () 中的第二個(gè)參數(shù)為資源名,而非資源 ID。因?yàn)橘Y源名是一個(gè)字符串,而資源 ID 則是一個(gè)整型量。所以在創(chuàng)建或?qū)胛粓D后,為該位圖資源命名時(shí)要加上雙引號(hào)以表示這是一個(gè)資源名。如右圖 5-2:
■在第三步中,為要使用位圖的按鈕設(shè)置位圖,方法與圖標(biāo)按鈕完全相同。首先是要在使用位圖的按鈕的 設(shè)置中設(shè)置 屬性,指明該按鈕是一個(gè)位圖按鈕。然后再調(diào)用 類函數(shù) () 為按鈕設(shè)置位圖。代碼如下:
// 為一個(gè) 類對(duì)象。
.();
或
pWnd = ();
pBton = ( *) pWnd;
pBton -> ();
同圖標(biāo)按鈕一樣,使用位圖不局限于 Push ,而且同樣適用于 Radio 、Check Box 和 Group Box。同時(shí),最好在使用完位圖句柄后及時(shí)的將它刪除掉。
★ 5--2--3 類位圖按鈕
前面所講述的圖標(biāo)及位圖按鈕最大的不足在于,無(wú)論當(dāng)按鈕控件處于何種狀態(tài),按鈕上所顯示的圖案總是一成不變的,相比之下那些隨著操作而實(shí)時(shí)改變圖案的按鈕就具有更加生動(dòng)的效果。MFC 庫(kù)為我們捉供了一個(gè)這樣的類 。利用這個(gè)類,我們可以為一個(gè)按鈕設(shè)計(jì)四幅不同位圖、分別用于正常狀態(tài)、按下?tīng)顟B(tài)、獲得輸入焦點(diǎn)和無(wú)效時(shí)。這樣,隨著按鈕狀態(tài)的改變人物圖標(biāo)小按鈕矢量圖,位圖也隨之切換,這樣就使按鈕呈現(xiàn)出很強(qiáng)的動(dòng)感效果。令人高興的是,類 將很多操作的細(xì)節(jié)都封裝了起來(lái),因而我們能夠很方便的達(dá)到上述目的。由于以上原因, 類位圖按鈕有著比圖標(biāo)按鈕和位圖按鈕更為廣闊的使用范圍。在一般情況下,都將 類位圖按鈕稱作是位圖按鈕,而將真正的位圖按鈕給忽略了。
類位圖按鈕的缺點(diǎn)同位圖按鈕是一致的,都是在對(duì)透明色的處理上。還有一個(gè)比較嚴(yán)重的問(wèn)題是 類位圖按鈕是將位圖按原始大小繪制在按鈕上,而不是隨按鈕大小而縮放位圖。這在平時(shí)不會(huì)導(dǎo)致任何問(wèn)題,但若是在 中更改了顯示字體的大小,則對(duì)話框及上面的按鈕控件大小也隨之改變,但位圖按鈕上的位圖卻保持原有大小不變,這樣就會(huì)在外觀上造成嚴(yán)重的問(wèn)題。盡管有以上問(wèn)題的存在, 類位圖按鈕還是具有很大的實(shí)用價(jià)值,因?yàn)楦冻龊苌俚拇a就可以得到生動(dòng)形象的圖形效果。、下面就講述 類位圖按鈕的使用方法(以下均簡(jiǎn)稱為位圖按鈕)。
絕大數(shù)情況下,使用位圖按鈕只需四個(gè)步驟:
● 第一步:在要使用位圖的按鈕的 設(shè)置中設(shè)置 Owner Draw 屬性
● 第二步:創(chuàng)建或從外部導(dǎo)入至少一幅至多四幅位圖。位圖按鈕所使用的位圖顏色最多可達(dá) 256 色,但對(duì)于 256 色的位圖不能通過(guò)剪貼的的方式來(lái)創(chuàng)建。而必須使用導(dǎo)入的方式來(lái)創(chuàng)建。若該按鈕控件的 (標(biāo)題)為 ,則將這四幅位圖的 ID 分別設(shè)定為 “”、“”、“”、“”分別對(duì)應(yīng)于按鈕的正常狀態(tài)、按下?tīng)顟B(tài)、獲得輸入焦點(diǎn)狀態(tài)和無(wú)效狀態(tài)。注意,只有在正常狀態(tài)顯示的位圖是必須的,其它狀態(tài)的位圖都是可選的;還有就是代表位圖的 ID 都必須加上雙引號(hào)并且大寫(xiě)(如下圖 5-3)。實(shí)際上,加上雙引號(hào)就表示該資源是以字符串常量來(lái)標(biāo)識(shí)。
● 第三步:在使用位圖按鈕的類的類定義文件中聲明 類對(duì)象: ;
● 第四步:在對(duì)話框的 () 函數(shù)中通過(guò) 類對(duì)象調(diào)用函數(shù) () 自動(dòng)加載位圖: .(,this);
經(jīng)過(guò)以上四個(gè)步驟,一個(gè)位圖按鈕就創(chuàng)建好了。在運(yùn)行中人物圖標(biāo)小按鈕矢量圖, 類會(huì)自動(dòng)根據(jù)按鈕的狀態(tài)顯示對(duì)應(yīng)的位圖。利用位圖按鈕技術(shù),再加上一點(diǎn)鼠標(biāo)感應(yīng)技術(shù),就很容易做出像網(wǎng)頁(yè)按鈕那樣的在鼠標(biāo)經(jīng)過(guò)時(shí)加亮的動(dòng)態(tài)效果。也能輕易的實(shí)現(xiàn)像 Word 中那樣的平面按鈕。這些將在后面的章節(jié)中講述。
需要說(shuō)明的是, 類位圖按鈕僅限于在 Push 使用。在默寫(xiě)情況下,我們可能需要?jiǎng)討B(tài)創(chuàng)建位圖按鈕,在動(dòng)態(tài)創(chuàng)建位圖按鈕時(shí),不能使用函數(shù) () 加載位圖,而要使用函數(shù) () 來(lái)加載位圖。動(dòng)態(tài)創(chuàng)建位圖按鈕主要有以下幾個(gè)步驟:
●第一步:為要?jiǎng)?chuàng)建的控件分配一個(gè) ID 值。
●第二步:定義一個(gè) 類對(duì)象。
●第三步:由該對(duì)象調(diào)用函數(shù) () 創(chuàng)建位圖按鈕,并調(diào)用函數(shù) () 加載位圖。在調(diào)用函數(shù) () 調(diào)整按鈕控件的大小以適應(yīng)位圖。
● 第四步:加入對(duì)新創(chuàng)建按鈕的消息處理。