?? 05.2.1 ondraw函數(shù).txt
字號(hào):
5.2.1 OnDraw函數(shù)
在 CTextView類(lèi)中, OnDraw函數(shù)的定義如例 5-4所示。
例 5-4
void CTextView: : OnDraw(CDC* pDC) CTextDoc* pDoc = GetDocument();
ASSERT_VAL工 o (pDoc) ;
// TODO: add draw code for native data here
我們可以在此函數(shù)處設(shè)置一個(gè)斷點(diǎn),調(diào)試運(yùn)行程序,看看程序調(diào)用這個(gè)函數(shù)的時(shí)機(jī)。我們知道當(dāng)窗口初次出現(xiàn)時(shí),即從無(wú)到有時(shí),會(huì)產(chǎn)生 WM_PAINT消息,讓窗口重繪,這時(shí)程序停在所設(shè)置的 OnDraw函數(shù)斷點(diǎn)處。繼續(xù)調(diào)試程序,在調(diào)試過(guò)程中,可以看到,每次窗口要出現(xiàn)的時(shí)候,就會(huì)進(jìn)入 OnDraw函數(shù)。因此,如果希望輸入的圖形或文字始終能夠在窗口上顯示的話,就可以在這個(gè) OnDraw函數(shù)中進(jìn)行處理。
另外,從這個(gè)函數(shù)的定義可知,當(dāng)它被調(diào)用時(shí),應(yīng)用程序框架會(huì)構(gòu)造一個(gè) CDC類(lèi)對(duì)象的指針并傳遞給這個(gè)函數(shù),這給我們提供了方便,在這個(gè)函數(shù)內(nèi)部就不需要再去構(gòu)造 CDC類(lèi)的對(duì)象,可以直接使用傳遞進(jìn)來(lái)的 CDC對(duì)象指針去調(diào)用 CDC類(lèi)的成員函數(shù),完成繪制功能。
接下來(lái),我們要實(shí)現(xiàn)在程序窗口中輸出一串文字這一功能,這可以使用第 1章中介紹的 TextOut這個(gè)函數(shù)來(lái)實(shí)現(xiàn)。在 C語(yǔ)言中,如果要使用宇符串的話,一般是定義一個(gè) char*類(lèi)型的變量。在 MFC中,它提供了一個(gè)字符串類(lèi): CString,這個(gè)類(lèi)沒(méi)有基類(lèi)。一個(gè) CString對(duì)象由一串可變長(zhǎng)度的宇符組成。在 C語(yǔ)言中,利用 char類(lèi)型指針操作宇符串時(shí),一旦給它分配了堆內(nèi)存,那么它就只能存儲(chǔ)己分配大小的字符數(shù)量。如果想要另外再多存儲(chǔ)些字符,就只能對(duì)這個(gè)指針?biāo)赶虻亩褍?nèi)存進(jìn)行再分配。然而,利用 CString操作字符串時(shí),無(wú)論存儲(chǔ)多少個(gè)字符,我們都不需要對(duì)它進(jìn)行內(nèi)存分配,因?yàn)檫@些操作在 CString類(lèi)的內(nèi)部都己經(jīng)替我們完成了,這就是 CString類(lèi)的好處。在 MFC程序中利用 CString類(lèi)對(duì)宇符串進(jìn)行操作是很方便的。讀者可以在 MSDN中查看 CString類(lèi)的成員,將會(huì)發(fā)現(xiàn)它重載了多個(gè)操作符,這為我們操作 CString類(lèi)的對(duì)象提供了極大的便利。可以把 CString類(lèi)型的對(duì)象當(dāng)作簡(jiǎn)單類(lèi)型的變量一樣進(jìn)行賦值、相加操作,例如利用"="操作符,可以直接把一個(gè)字符或另一個(gè) CString類(lèi)型的字符串賦給一個(gè) CString類(lèi)型的對(duì)象:利用"+"操作符,可以方便地把兩個(gè)字符串或一個(gè)字符與一個(gè)字符串聯(lián)成一個(gè)字符串。
CString類(lèi)提供了多個(gè)重載的構(gòu)造函數(shù)(如例 5-5代碼所示),利用這些構(gòu)造函數(shù),我們可以構(gòu)造一個(gè)空的 Cstring對(duì)象,或者用一個(gè)己有的 CString對(duì)象構(gòu)造一個(gè)新的 CString對(duì)象,或者用一個(gè)字符指針構(gòu)造一個(gè) CString對(duì)象。
例 5-5
CString ( );
CString( const CString& stringSrc );
CString( TCHAR ch, int nRepeat = 1 };
CString( LPCTSTR lpch , int nLength };
CString( const unsigned char* psz };
CString( LPCWSTR lpsz } ;
CString( LPCSTR lpsz } ;
例 5-6所示代碼就是利用 CString類(lèi)在 OnDraw函數(shù)內(nèi)實(shí)現(xiàn)字符串顯示的代碼:例 5-6
void CTextView : : OnDraw(CDC* pDC}
{ CTextDoc * pDoc = GetDocurnent(} ;
ASSERT_VALID(pDoc} ;
// TODO: add draw code for native data here
CString str("C++深入編程") ;
pDC->TextOut(50 , 50 , str) ;
注意: CDC封裝的 TextOut函數(shù)與陽(yáng)form SDK提供的會(huì)圖 TextOut
函數(shù)的區(qū)別:前者不需要 DC句柄作為參數(shù),因?yàn)?CDC內(nèi)部專(zhuān)門(mén)有一個(gè)成員變量( 沒(méi)m_hDC)保存了 DC句柄。
Build并運(yùn)行 Text程序,可以看到在程序窗口中輸出了我們指定的字符串,如圖 5.8所示。并且可以發(fā)現(xiàn),當(dāng)窗口大小發(fā)生改變時(shí),字符串仍顯示在窗口當(dāng)中,這是因?yàn)槲覀兪窃?OnDraw函數(shù)中實(shí)現(xiàn)字符串的顯示操作的。
圖 5 .8 字符串顯示結(jié)果
下面是另一種 CString字符串構(gòu)造形式:
CString str;
str = "VC++ 深入編程";
CString類(lèi)重載了" ="操作符,可以直接把一個(gè)字符串賦給一個(gè) CString對(duì)象。讀者可以試試這段代碼,將會(huì)發(fā)現(xiàn)程序運(yùn)行結(jié)果是一樣的。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -