[翻译]VC++中创建并使用自定义控件
原文地址
介紹
您好!這是我在CodeProject上的第四篇文章。遷移到VC++,我第一個(gè)關(guān)注的是通過VC++幫助能夠創(chuàng)建自定義控件,因?yàn)檫@是一個(gè)非常用有的特性,當(dāng)你要修改任意控件的內(nèi)容或創(chuàng)建新的控件的時(shí)候。所以我決定寫這篇文章,這樣新的開發(fā)者或第一次開發(fā)控件的人就能夠從中得到幫助。
這就是所有的介紹,現(xiàn)在轉(zhuǎn)到最初的觀點(diǎn):怎么創(chuàng)建自定義控件,為什么要?jiǎng)?chuàng)建自定義控件。我對(duì)在Win32 API下開發(fā)應(yīng)用程序很感興趣,因?yàn)樗∏刹⒛塥?dú)立運(yùn)行,我從沒用VC++開發(fā)過,但它是非常強(qiáng)大的語(yǔ)言,并且它強(qiáng)大的特性已經(jīng)吸引我轉(zhuǎn)向了它。自定義控件就是其中之一。CodeProjet上有很多使用自定義控件的文章。但是第一次閱讀它們的時(shí)候,我不明白在簡(jiǎn)單的Windows應(yīng)用程序中怎樣去創(chuàng)建、獲取和處理消息。自定義控件給開發(fā)者帶來了一種方便的方式去創(chuàng)建控件并使其和其它常規(guī)控件一樣可視化。(因?yàn)槲沂荲C++的初學(xué)者,所以文章中如果有錯(cuò)請(qǐng)告知我)。
它在哪里
現(xiàn)在的問題是,自定義控件在哪里?答案就在下面。下圖顯示了自定義控件,它躺在控件欄中。
這個(gè)圖顯示了這個(gè)自定義控件的位置。你可以選擇它,并能在你的窗體資源中直接繪制。這里最主要的問題是當(dāng)你把這個(gè)控件放到你的窗體在,然后你編譯并執(zhí)行程序,你會(huì)看不到效果,因?yàn)槟氵€沒有為這個(gè)控件選擇一個(gè)類,所以這個(gè)問題在后面的章節(jié)討論。
創(chuàng)建一個(gè)類
現(xiàn)在,下圖顯示了自定義控件在窗體中繪制。現(xiàn)在,你在自定義控件上面右擊并在彈出的菜單上選擇“類向?qū)А?#xff08;ClassWizard)。
選擇一個(gè)類
在你點(diǎn)擊“類向?qū)А敝?#xff0c;下面這個(gè)對(duì)話框就會(huì)在屏幕上顯示。在它上面,選擇“添加類”(Add Class)然后選“New...”
現(xiàn)在,當(dāng)你點(diǎn)擊New按鈕后,給自定義控件選擇基類的對(duì)話框就會(huì)出現(xiàn)如下面所示。在此,對(duì)于基類你有多個(gè)選擇。意思就是你可以自定義基礎(chǔ)控件,比如給靜態(tài)控件或者編輯控件添加新特性,或者你可以創(chuàng)建一個(gè)全新的控件。我決定創(chuàng)建一個(gè)全新的控件,像便箋本那樣,所以,我選擇基礎(chǔ)類CWnd作為基類。
最后,你已經(jīng)給你的控件創(chuàng)建了類。現(xiàn)在,重要部分開始了……
因?yàn)橹皠?chuàng)建的類使用CWnd作為基類,我們要注冊(cè)這個(gè)類因?yàn)檫@是一個(gè)自定義的類。所以,我們必須寫函數(shù)RegisterWndClass去注冊(cè)它。函數(shù)的代碼可能像下面這樣……
View Code
用這種方式,我們已經(jīng)注冊(cè)了這個(gè)新的窗口類。現(xiàn)在,你要像下面這樣添加這個(gè)函數(shù)到類的默認(rèn)構(gòu)造函數(shù)中:
View Code
我想有人會(huì)想MYWNDCLASS是個(gè)什么。答案是它是我們自定義控件的類名。它定義在MyCustomControl.h文件的的頂部,就像下面這樣:
View Code
?現(xiàn)在,我們就有了自己的類,名叫MyDrawPad。
附加類到自定義控件
所有這些做好之后,自定義控件我們就要?jiǎng)?chuàng)建完成了。最后剩下的事情是把自定義控件設(shè)置為我們創(chuàng)建好的窗口類。為此,在資源視圖里右擊自定義控件然后選擇它的屬性。一個(gè)對(duì)話像下面的對(duì)話框?qū)?huì)出現(xiàn)……
然后,設(shè)置類名為我們之前創(chuàng)建的MyDrawPad。這里你可以通過改變“Style”的編輯框16進(jìn)制數(shù)的值來選擇窗口樣式。我已經(jīng)試過了一些值,你們也可以試試。
實(shí)現(xiàn)數(shù)據(jù)交換
現(xiàn)在,所有的事情都做好了,但數(shù)據(jù)必須要在窗口和我們的應(yīng)用程序之間進(jìn)行交換。所以,在你的對(duì)話框類為我們的自定義控件添加變量,像下面這樣:
View Code
之后,你得添加在DoDataExchage()函數(shù)里添加下面的代碼,讓它與自定義控件進(jìn)行交互。
View Code
現(xiàn)在,你做好準(zhǔn)備動(dòng)作了嗎???好,按Ctrl+F5編譯并執(zhí)行程序。(但愿你都做對(duì)了……我想沒有錯(cuò)誤!!!)
別忘了在對(duì)話框的頭文件里寫#include "MyCustomControl.h",不然的話會(huì)生成很多錯(cuò)誤。(我想你不會(huì)怪我哈哈哈)。
添加消息處理
上面的關(guān)鍵部分成功后,你就能看到對(duì)話框里有一個(gè)白色的矩形。這就是我們的自定義控件(相信我!)。這只是個(gè)不窗口。現(xiàn)在,我們添加一些窗口消息和我們的控件相交互。請(qǐng)仔細(xì)閱讀……
為了給窗口添加Windows消息,右擊MyCustomControl類并選擇Add Windows Message Handler來添加消息,如mouse?move,click等等。
這樣子,在這么長(zhǎng)(很長(zhǎng)嗎?)的工作后,你已經(jīng)創(chuàng)建了你的自定義控件。現(xiàn)在放松一下,開始由你們自己寫了。請(qǐng)對(duì)我的文章進(jìn)行評(píng)論(我喜歡你們?cè)u(píng)論)。比如,我已經(jīng)用包含的源代碼寫了一個(gè)簡(jiǎn)單的DrawPad。
現(xiàn)在我們來梳理一下這篇文件的簡(jiǎn)短概要:
要?jiǎng)?chuàng)建自定義控件,我們要做下面這些事情:
- 創(chuàng)建包含對(duì)話框的簡(jiǎn)單的MFC應(yīng)用程序。
- 從控件欄中選擇自定義控件。
- 在對(duì)話框資源里繪制自定義控件。
- 右擊自定義控件選擇類向?qū)?/strong>。
- 從Add Class菜單在添加新的類,選擇合適的基類。
- 添加代碼并注冊(cè)Custom Window class.
- 在對(duì)話框里給基類(自定義類)添加成員變量。
- 給已經(jīng)注冊(cè)的窗口類設(shè)置自定義控件。
- 添加DoDataExchange代碼。
- 用Ctrl+F5編譯并執(zhí)行程序。
- 在類視圖里通過右擊自定義控件類來添加/編輯Windows消息處理函數(shù)。
如果你喜歡它,給我郵件yogmj@hotmail.com,發(fā)送你的建議或文章里的拼寫錯(cuò)誤。或者這些源代碼里的Bugs(因?yàn)?br /> 我是Bug獵手{我是這么認(rèn)為的,你認(rèn)為嗎?})
總結(jié)
以上是生活随笔為你收集整理的[翻译]VC++中创建并使用自定义控件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC实现自定义控件步骤
- 下一篇: MFC概念问题