




已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
CRect類介紹注意:這個(gè)類是從tagRECT結(jié)構(gòu)派生而來的。(tagRECT是RECT結(jié)構(gòu)的不太常用的別名。)這意味著RECT結(jié)構(gòu)的數(shù)據(jù)成員(left,top,right,和bottom)也是CRect的可訪問數(shù)據(jù)成員。 一個(gè)CRect包含用于定義矩形的左上角和右下角點(diǎn)的成員變量。 當(dāng)指定一個(gè)CRect時(shí),必須謹(jǐn)慎地構(gòu)造它,以使它符合規(guī)范也就是說,使其左坐標(biāo)值小于右坐標(biāo)值,使頂坐標(biāo)值小于底坐標(biāo)值。例如,左上角為(10,10),右下角為(20,20)就定義了一個(gè)符合規(guī)范的矩形,但是左上角為(20,20)而右下角為(10,10)的值就定義了一個(gè)不符合規(guī)范的矩形。如果矩形是不符合規(guī)范的,則CRect的許多成員函數(shù)都會(huì)符合不正確的結(jié)果。(參見CRect:NormalizeRect可以得到這些函數(shù)的列表。)在你調(diào)用一個(gè)要求符合規(guī)范的矩形的函數(shù)之前,你可以通過調(diào)用NormalizeRect函數(shù)來使不符合規(guī)范的矩形成為符合規(guī)范的矩形。 當(dāng)用成員函數(shù)CDC:DPtoLP和CDC:LPtoDP來處理CRect時(shí)要小心。如果顯示環(huán)境的映射模式y(tǒng)-extent是負(fù)的,就像在MM_LOENGLISH中一樣,則CDC:DPtoLP將轉(zhuǎn)換CRect,以使它的頂部坐標(biāo)大于底部坐標(biāo)。然后像Height和Size這樣的函數(shù)將返回負(fù)值作為轉(zhuǎn)換后的矩形的高度,則此矩形將是不符合規(guī)范的。 當(dāng)使用重載的CRect操作符時(shí),第一個(gè)操作數(shù)必須是一個(gè)CRect;第二個(gè)操作數(shù)可以是一個(gè)RECT結(jié)構(gòu)或一個(gè)CRect對象。CRect類介紹及GetClientRect函數(shù)功能該函數(shù)獲取窗口客戶區(qū)的坐標(biāo)??蛻魠^(qū)坐標(biāo)指定客戶區(qū)的左上角和右下角。由于客戶區(qū)坐標(biāo)是相對窗口客戶區(qū)的左上角而言的,因此左上角坐標(biāo)為(0,0) 函數(shù)原型 在Win32 SDK, 該API函數(shù)原型為 BOOL GetClientRect( HWND hWnd, / 窗口句柄 LPRECT lpRect / 客戶區(qū)坐標(biāo) ); 在MFC中,該函數(shù)的原型為void GetClientRect(LPRECT lpRect) const; 參數(shù) hWnd:是程序窗口的句柄。 lpRect:是一個(gè)指針,指向一個(gè)RECT類型的rectangle結(jié)構(gòu)。該結(jié)構(gòu)有四個(gè)LONG字段,分別為left、top、right和bottom。GetClientRect將這四個(gè)字段設(shè)定為窗口顯示區(qū)域的尺寸。left和top字段通常設(shè)定為0。right和bottom字段設(shè)定為顯示區(qū)域的寬度和高度(像素點(diǎn)數(shù))。 也可以是一個(gè)CRrect對象指針。CRect對象有多個(gè)參數(shù),與RECT用法相同。 函數(shù)的作用總的來說就是把客戶區(qū)的大小寫進(jìn)第二個(gè)參數(shù)所指的Rect結(jié)構(gòu)當(dāng)中。 返回值 如果函數(shù)成功,返回一個(gè)非零值。 如果函數(shù)失敗,返回零。要得到更多的錯(cuò)誤信息,請使用GetLastError函數(shù) VC+技術(shù)內(nèi)幕學(xué)習(xí)筆記(1) 寫在前面:我看的VC+技術(shù)內(nèi)幕版本為-潘愛民和王國印譯清華大學(xué)出版的第四版,因從網(wǎng)上看到此版譯的最好。這篇學(xué)習(xí)筆記是后補(bǔ)的,因?yàn)檫@本書我已經(jīng)看到了第三十二章,之前并沒有做筆記,只是隨意的在書上畫了畫重點(diǎn),可是越向后學(xué)越覺得前面的知識(shí)并沒有掌握,所以決定重新來過并補(bǔ)上筆記。我認(rèn)為只有踏踏實(shí)實(shí)的記錄下每天的學(xué)習(xí)心得才能真正的有所收獲。我個(gè)人認(rèn)為學(xué)習(xí)這本經(jīng)典之前最好先看看WINDOWS 32位編程的書,至少能用純SDK寫出一些小程序。第一天:WINDOWS應(yīng)用程序一定要有WinMain函數(shù),該函數(shù)用來完成一些特殊的任務(wù),象創(chuàng)建程序的主窗口,主窗口用來處理消息的代碼。MFC將WinMain隱藏在框架中,不象寫SDK程序時(shí)可以很容易的找到它。WINDOWS采用的消息處理機(jī)制也交給了程序框架,我們不必?fù)?dān)心如何使這些消息和代碼聯(lián)系起來。并且WINDOWS定義好了一些消息,當(dāng)窗口被創(chuàng)建時(shí)系統(tǒng)就會(huì)發(fā)送WM_CREATE消息,當(dāng)點(diǎn)擊鼠標(biāo)左鍵時(shí)便系統(tǒng)會(huì)發(fā)送WM_LBUTTONDOWN消息,當(dāng)用戶按下鍵盤時(shí)系統(tǒng)會(huì)發(fā)送WM_CHAR消息,當(dāng)用戶關(guān)閉窗口時(shí)系統(tǒng)會(huì)發(fā)送WM_CLOSE消息,當(dāng)用戶進(jìn)行菜單項(xiàng)選擇或單擊按鈕時(shí)系統(tǒng)回發(fā)送WM_COMMAND消息,什么都不做系統(tǒng)還會(huì)發(fā)送WM_TIMER消息。先不說別的,先搞清出這幾個(gè)消息再說。從MSDN中可以很方便的找到關(guān)于這幾個(gè)消息的幫助文檔。WINDOWS提供通用的圖形設(shè)備接口(GUI),我們通過調(diào)用(GDI)函數(shù)和硬件打交道,不必理會(huì)設(shè)備環(huán)境,WINDOWS會(huì)自動(dòng)將設(shè)備環(huán)境結(jié)構(gòu)映射到相應(yīng)的物理設(shè)備,這應(yīng)該就是設(shè)備無關(guān)性吧。動(dòng)態(tài)連接庫(DLL)應(yīng)該是代碼重用的典型例子(不知道可不可這樣說),把一些模塊、自己新編的類單獨(dú)調(diào)試并編譯成DLL,及增加代碼的可讀性也提高了程序模塊的靈活性。用Developer Studio建立項(xiàng)目Developer Studio會(huì)創(chuàng)建很多中間文件,這些文件還是有必要說一下的。APS /支持ResourceViewBSC /瀏覽器信息文件CLW /支持ClassWizardDSP /項(xiàng)目文件,不能刪除和用文本編輯器編輯DSW /工作空間文件,不能刪除和用文本編輯器編輯MAK /外部的創(chuàng)建文件NCB /支持ClassViewOPT /保存工作空間的配置PLG /建立日志文件這些文件都有一定的作用,拿CLW來說,如果你有一個(gè)新類,需要加到ClassWizard中,除了將相應(yīng)的.h 和.cpp加到DSP中還需要重新編譯CLW。PLG文件記錄著你的項(xiàng)目配置信息。VC+的源程序?yàn)g覽器能夠使我們從類或函數(shù)的角度來了解或編輯程序,而不是直接從文件入手。在看別人的源代碼時(shí)如果能熟練的使用源代碼瀏覽器將會(huì)事倍功半。源程序?yàn)g覽器主要的查看狀態(tài)有以下幾種:Definitions and References選擇任何函數(shù)、變量、類型、宏定義可以看到它在項(xiàng)目中的定義,并且在何處和什么地方用到它。Call Graph/Caller Graph對于所選擇的函數(shù),給出它的調(diào)用與被調(diào)用函數(shù)的圖示。Derived Class Graph/Base Class Graph給出類層次關(guān)系的圖形表示,可以看到所選擇的類的派生類和基類以及成員。File Outline對于所選的文件,列出文件中的類、函數(shù)和數(shù)據(jù)成員,同時(shí)還顯示它們定義的位置和使用位置??梢奡ource Brower比起Class View來功能多了很多也更加好用,以前我就不知道,因?yàn)橐话愕腣C+書沒有講或根本沒有注意這塊,看到講菜單、操作界面、編輯器時(shí)總是跳過,心想“沒吃過豬肉還沒見過豬跑?這種東西不用學(xué)就會(huì)”??蓪?shí)際上還是應(yīng)該仔細(xì)的看看的。對于本章學(xué)習(xí)雷神建議大家在VC+6中用AppWizard生成一個(gè)空的程序,然后試著看看都有那些文件,和他們的類層次、函數(shù)、宏、結(jié)構(gòu)的定義,我就是這樣干的,學(xué)編程不動(dòng)手是不行的 VC+技術(shù)內(nèi)幕學(xué)習(xí)筆記(2) 第二天:Microsoft基本類庫應(yīng)用程序框架MFC是C+的Microsoft Windows API,如果想要開發(fā)WINDOWS的應(yīng)用程序當(dāng)然VC/MFC是開發(fā)環(huán)境的首選。MFC產(chǎn)生的應(yīng)用程序使用了標(biāo)準(zhǔn)化的結(jié)構(gòu)。(我現(xiàn)在還體會(huì)不出這點(diǎn)的優(yōu)勢所在,請高手指點(diǎn))MFC產(chǎn)生的應(yīng)用程序短而運(yùn)行速度快。這應(yīng)該說的是可以很容易的建立動(dòng)態(tài)連接,其實(shí)程序還是需要大量的DLL,不過由于WINDOWS上有很多可以用DLL所以應(yīng)用程序很短,我是這樣想的不知對否。VC+工具降低了編碼的復(fù)雜性。這點(diǎn)不容質(zhì)疑比起TC方便太多了。MFC庫功能非常豐富。書上列出了MFC從1.0-4.21的一些特性,我就不廢話了,大家應(yīng)該看看。 這一章節(jié)主要介紹了MFC庫的優(yōu)點(diǎn),其實(shí)我本人認(rèn)為在某些特定環(huán)境下其實(shí)MFC不一定就象說的那樣好。我想不會(huì)有人用純VC做MIS系統(tǒng)吧,太累了。我是這樣理解編程序的,如果把學(xué)編程看成學(xué)武的話,C/C+語言及編程思想(OOP)是內(nèi)功,API是基本功(編程思想是內(nèi)功、API是基本功這適用于任何WIN32編程,不論Visual C+、Delphi、C+Builder、VB.),VC/MFC應(yīng)該不同武功其中的一種,不同的學(xué)習(xí)方法效果不一樣,只要下工夫也都可以達(dá)到一定的境界。真正的高手是有著深厚的內(nèi)功,扎實(shí)的基本功,至于武功招數(shù)無所謂了,隨便一站不丁不八全無破綻,無招勝有招了。對不住扯遠(yuǎn)了。 C+可以通過類庫來進(jìn)行擴(kuò)展,我們除了可以使用隨編譯器提供的類庫外還可以很方便使用軟件公司銷售的類庫產(chǎn)品,甚至可以自己開發(fā)。而應(yīng)用程序框架是一種類庫的超集,它定義了程序的結(jié)構(gòu)。 下面給出兩個(gè)示例程序(一個(gè)是書上的一個(gè)是我寫的):雷神建議:雖然現(xiàn)在很多書都附CD,CD上有書中所有示例的源代碼,但還是應(yīng)該親自在VC6用手敲進(jìn)去。這樣可以加深印象以及感受一下編譯除錯(cuò)后程序正確運(yùn)行時(shí)的樂趣,因?yàn)槭羌兪止ご蛟臁W詮奈仪昧私话賯€(gè)代碼示例后,由于筆誤的BUG就很少了,打字速度也提高了。而且最好在原示例代碼的基礎(chǔ)上做些改動(dòng)例如別千篇一律的顯示HELLO WORLD!換點(diǎn)別的,這樣做也可以加深對示例程序的理解。 我的HELLO WORLD用AppWizard向?qū)?chuàng)建一個(gè)顯示一個(gè)字符串的單文檔程序,只需要敲入一行語句,主要是體驗(yàn)MFC的強(qiáng)大功能。1、打開VC+6從菜單選擇NEW,給項(xiàng)目命名為”MyApp01“。2、選擇MFC AppWizardexe 選項(xiàng),除STEP 1選擇單文檔外其他STEP缺省。3、在Class View選擇CMyApp01View類的OnDraw()成員函數(shù)雙擊會(huì)在C+編譯器看到以下內(nèi)容void CMyApp01View:OnDraw(CDC* pDC)CMyApp01Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here在 / TODO: add draw code for native data here的位置增加一行代碼void CMyApp01View:OnDraw(CDC* pDC)CMyApp01Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(10,10,雷神愿意和所有學(xué)VC的朋友共同進(jìn)步!); /Add to project-Files,分別創(chuàng)建一個(gè)名為MyApp.h和一個(gè)名為MyApp.cpp的文件。3、添加代碼:(最好照敲以下代碼到編譯器,別用Ctrl+C/Ctrl+V)/*/ MyApp.h/class CMyApp:public CWinApp /見下public:virtual BOOL InitInstance();class CMyFrame:public CFrameWndpublic:CMyFrame();protected:afx_msg void OnLButtonDown(UINT nFlags,CPoint point);afx_msg void OnPaint();DECLARE_MESSAGE_MAP();/*/ MyApp.cpp/#include afxwin.h#include myapp.hCMyApp theApp;/建立一個(gè)CMyAPP對象見下BOOL CMyApp:InitInstance ()m_pMainWnd=new CMyFrame();m_pMainWnd-ShowWindow (m_nCmdShow);m_pMainWnd-UpdateWindow ();return TRUE;BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd)ON_WM_LBUTTONDOWN()ON_WM_PAINT()END_MESSAGE_MAP()CMyFrame:CMyFrame()Create(NULL,MYAPP Application);void CMyFrame:OnLButtonDown (UINT nFlags,CPoint point)TRACE(Entering CMyFrame:OnLButtonDown - %lx,%d,%dn,(long)nFlags,point.x ,point.y);void CMyFrame:OnPaint ()CPaintDC dc(this);dc.TextOut (0,0,Hello World!);4、編譯運(yùn)行,報(bào)錯(cuò)。為什么呢?原來還沒有添加MFC的支持,在Project Setting選項(xiàng)General屬性頁選擇”Use MFC in a Static Library5、再Ctrl+F5,哈成功了。 VC+技術(shù)內(nèi)幕學(xué)習(xí)筆記(3) 第三篇:消息映射和視圖類 在寫了兩篇筆記后有很多朋友給我發(fā)信,和我交流一些在學(xué)習(xí)過程中的問題。但由于我也是一個(gè)初學(xué)者,對一些問題自己也沒有把握,所以實(shí)在不敢做答,但我會(huì)盡量盡我所能和大家一起研究,謝謝大家的鼓勵(lì)和信任。 在開始先補(bǔ)充一下上一篇的內(nèi)容“內(nèi)容窗口的創(chuàng)建”,兼答天歌網(wǎng)友的問題(如果天歌兄弟能看到的話 )。為了簡化我們看一個(gè)更簡單代碼,只有一個(gè)文件,創(chuàng)建一個(gè)空白的窗口,什么也不做。注意哦:真寫程序時(shí)還是要分成.h和.cpp兩個(gè)文件比較清晰。 前幾步和VC+技術(shù)內(nèi)幕學(xué)習(xí)筆記(2)中的一樣,下面是代碼:/*/ MyApp.cpp#include afxwin.h /afxwin.h會(huì)調(diào)用windows.h是MFC編程的途徑,只要用到MFC就一定要包含它。class CMyApp:public CWinApp /從CWinApp繼承一個(gè)類public:virtual BOOL InitInstance();/重載InitInstance虛函數(shù);class CMyFrame:public CFrameWnd /從CFrameWnd繼承一個(gè)類;CMyApp myApp; /最后又激活應(yīng)用程序的構(gòu)造函數(shù)BOOL CMyApp:InitInstance ()m_pMainWnd=new CMyFrame;/new 激活了CMyFrame類構(gòu)造函數(shù)CFrameWnd(),構(gòu)造函數(shù)調(diào)又用CREATE()/m_pMainWnd在MFC的定義CWnd* m_pMainWnd;/ main window (usually same AfxGetApp()-m_pMainWnd)/m_pMainWnd保存窗口的位置(CMyFrame * )m_pMainWnd)-Create(NULL,一個(gè)MFC應(yīng)用程序:空白窗口); /創(chuàng)建窗口m_pMainWnd-ShowWindow(m_nCmdShow); /顯示在屏幕上return TRUE; 如果還不明白建議查看MSDN或看看侯大師的深入淺出。關(guān)于這個(gè)問題就說到這,最后對天歌朋友的學(xué)習(xí)態(tài)度表示敬意。下面進(jìn)入正體,讓我們繼續(xù)來看看MFC的消息映射。 MFC是通過一些宏來將特定的消息影射到派生類相應(yīng)的成員函數(shù)上,這種體制的好處是允許某些非窗口類(如文檔類)來控制命令消息。且不需要C+作任何擴(kuò)展。 MFC的消息控制函數(shù)要求提供函數(shù)原形、函數(shù)體以及消息映射中的入口。真的很麻煩,還好用Class Wizard可以很容易的將上面說到的東西加到我們的類中。例如只要在Class Wizard中添加WM_LBUTTONDOWN消息,則相應(yīng)的代碼便加在合適的地方。怎么樣簡單多了吧。 應(yīng)用程序除了包含應(yīng)用程序框架類外,一般還要包含文檔和視圖類。這種文檔-視圖結(jié)構(gòu)是應(yīng)用框架的核心。我一直做MIS開發(fā),當(dāng)然不是用VC用的是VB,所以看到這我很不自覺的想到了后臺(tái)數(shù)據(jù)庫和界面的關(guān)系,這個(gè)例子可能不是很恰當(dāng),但卻能很好的幫助我們理解文檔和視圖。文檔好比后臺(tái)的數(shù)據(jù)庫,視圖就是界面上顯示的內(nèi)容,同一個(gè)數(shù)據(jù)庫可以用不同的界面顯示,但由于所有的界面內(nèi)容都是從數(shù)據(jù)庫中數(shù)據(jù)得來,所以當(dāng)數(shù)據(jù)庫發(fā)生變化時(shí)所有的相關(guān)界面顯示都會(huì)跟著改變。越來越覺得不恰當(dāng),不過實(shí)在想不出別的例子了。我們的應(yīng)用程序?qū)嶋H上就是通過視圖對文檔進(jìn)行一系列操作,不單指輸出。下面我們看看視圖類。 視圖是一個(gè)從CView類派生的類的對象,在屏幕上顯示的窗口就是一種。對象的行為完全由類的成員函數(shù)和數(shù)據(jù)成員決定,其中及包括派生類中的特定函數(shù),也包括基類的標(biāo)準(zhǔn)函數(shù),所以了解MFC類庫的結(jié)構(gòu)以及各類的標(biāo)準(zhǔn)成員函數(shù)是多么重要啊,別怕麻煩找來MFC的源碼讀讀,看多少算多少,但肯定不白看,這是雷神的經(jīng)驗(yàn)。記得上一篇的我的例子嗎1、打開VC+6從菜單選擇NEW,給項(xiàng)目命名為”MyApp01“。2、選擇MFC AppWizardexe 選項(xiàng),除STEP 1選擇單文檔外其他STEP缺省。此時(shí)MFC應(yīng)用程序框架便幫我們完成了應(yīng)用程序,你可以執(zhí)行它,它會(huì)在屏幕上顯示一個(gè)典型的WINDOWS風(fēng)格的空白窗口。我們來看一下項(xiàng)目程序所在目錄下的文件:myapp01.dsp /項(xiàng)目文件myapp01.dsw /工作空間文件myapp01.rc /資源描述文件myapp01View.cpp /包含CMyAppView類成員函數(shù)的視圖類實(shí)現(xiàn)文件 重點(diǎn)myapp01View.h /包含CMyAppView類成員函數(shù)的視圖類頭文件 重點(diǎn)myapp01.opt /二進(jìn)制文件,告訴Developer Studio本項(xiàng)目的哪些文件是打開的,又是如何排列的readme.txt /用來解釋所產(chǎn)生的所有文件,未列出的myapp01Doc.cpp、myapp01Doc.h、StdAfx.cpp、StdAfx.h.在這里都可以找到相應(yīng)解釋。resource.h /包含#define常量定義的頭文件 仔細(xì)研究一下myapp01View.cpp和myapp01View.h文件,程序核心CMyAppView類在這兩個(gè)文件中定義,就是我們今天要學(xué)的視圖類。要想看到CMyAppView類的全貌,應(yīng)該用Source Browser查看,選擇CMyApp01View,按Alt+F12,選擇Base Class and Members 選項(xiàng)。我們會(huì)看到CMyAppView類的層次關(guān)系(從哪來得),以及所有成員函數(shù),包括從基類繼承的(在Class View中不能顯示父類的成員函數(shù))。我們發(fā)現(xiàn)實(shí)際上你什么也不用做就擁有了一個(gè)有著強(qiáng)大功能的類。 下面我們看一下CMyAppView類的OnDraw成員函數(shù),它是虛函數(shù)作用是每當(dāng)窗口需重繪時(shí)應(yīng)用程序框架會(huì)調(diào)用它。它的原型是這樣的(在myapp01View.h可以找到)virtual void OnDraw(CDC* pDC); / overridden to draw this view 參數(shù)是CDC類的指針,WINDOWS是通過和窗口相關(guān)聯(lián)的設(shè)備環(huán)境(CDC類的對象就是設(shè)備環(huán)境)和顯示硬件進(jìn)行通訊。有了這個(gè)指針我們便可以調(diào)用CDC類的成員函數(shù)來完成各種繪制工作,如上一篇用到的textout()還有一些Ellipse()、Polygon()、BitBlt()等等在MSDN中有好長的一篇,它是直接從CObject派生的,好了我們開始在OnDraw()里添加一些繪圖工作。3、在Class View選擇CMyApp01View類的OnDraw()成員函數(shù)雙擊會(huì)在C+編譯器看到以下內(nèi)容void CMyApp01View:OnDraw(CDC* pDC)CMyApp01Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here在 / TODO: add draw code for native data here的位置增加一行代碼void CMyApp01View:OnDraw(CDC* pDC)CMyApp01Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);第四篇:資源和編譯 資源文件(就是以應(yīng)用程序名和擴(kuò)展名是.rc的文件)很大程度上決定了應(yīng)用程序的用戶界面。在VC+中資源文件包括以下內(nèi)容:Accelerator /模擬菜單和工具欄的選擇內(nèi)容Dialog /對話框的布局及內(nèi)容Icon /圖標(biāo)有兩種一種是16X16一種是32X32。Menu /應(yīng)用程序的主菜單及所屬的彈出式菜單String table /字符串不屬于C+源代碼部分Toolbar /工具條。Version /程序的描述、版本號(hào)、支持語言信息。以上信息都在.rc文件中包含,同時(shí).rc文件還包含了以下語句:#include afxres.h#include afxres.rc 它們的作用是把適合于所有應(yīng)用程序的一些通用MFC庫資源包含進(jìn)來。 關(guān)于資源編輯器的使用就不多說了,因?yàn)樗牟僮骱芎唵?,需要注意的是雖然resource.h是一個(gè)ASCII碼文件可以用文本編輯器進(jìn)行編輯,單如果使用文本編輯器進(jìn)行編輯的話,下次再使用資源編輯器時(shí)所做的修改有可能丟失,所以我們應(yīng)該在盡量在資源編輯器中編輯應(yīng)用程序的資源,新增的資源內(nèi)容回自動(dòng)的添加在我們的程序相應(yīng)位置,例如resource.h而不用我們操心。這便是為什么稱為Visual (可視)的原因之一。 編譯在VC+中有兩種模式,一種是Release Build另一種是Debug Build。它們之間的區(qū)別在于,Release Build不對源代碼進(jìn)行調(diào)試,不考慮MFC的診斷宏,使用的是MFC Release庫,編譯十對應(yīng)用程序的速度進(jìn)行優(yōu)化,而Debug Build則正好相反,它允許對源代碼進(jìn)行調(diào)試,可以定義和使用MFC的診斷宏,采用MFC Debug庫,對速度沒有優(yōu)化。所以我們應(yīng)該在Debug模式下開發(fā)應(yīng)用程序,然后在Release模式下發(fā)布應(yīng)用程序。在我們的工程文件夾下會(huì)有一個(gè)Debug文件夾和一個(gè)Release文件夾分別存放輸出文件和中間文件。 診斷宏是我們編譯程序時(shí)檢測程序狀態(tài)的有利工具,例如上兩篇用到的TRACE宏,可以在Debug窗口獲得你需要的診斷信息,而不用設(shè)置對話框之類的方法,在發(fā)布時(shí)Release會(huì)自動(dòng)濾掉此信息。 實(shí)際上對一個(gè)應(yīng)用程序的調(diào)式是一件很具挑戰(zhàn)的工作,我相信我們都有類似的經(jīng)歷,從網(wǎng)上或書本上找來了一段代碼或源程序,當(dāng)我們一點(diǎn)點(diǎn)將他們敲進(jìn) Deleloper Studio后進(jìn)行編譯時(shí)一下子出現(xiàn)了無數(shù)的錯(cuò)誤和警告,(有些書的源代碼就是錯(cuò)誤的)這是需要的耐心和經(jīng)驗(yàn),有了VC+提供的調(diào)試工具如診斷宏、設(shè)斷點(diǎn)、單步執(zhí)行等等,會(huì)讓我們省不少力氣。至于編譯的話題其實(shí)應(yīng)該有很多可以說,但由于雷神本身的經(jīng)驗(yàn)不足只能把書上所講的作一個(gè)總結(jié),大家應(yīng)該熟練的掌握VC+為我們提供的的各種調(diào)試工具,象SPY之類的工具在MSDN中也有很詳細(xì)的使用幫助說明,到現(xiàn)在我體會(huì)到了高手們所說的MSDN是最好的最全的也是最權(quán)威的。第五篇:基本事件處理 我們已經(jīng)知道MFC庫應(yīng)用程序框架調(diào)用CView視圖類的虛函數(shù)OnDraw來完成屏幕顯示。其實(shí)CView和CWnd類包含了幾百個(gè)成員函數(shù),在MSDN中可以看到這些成員函數(shù),其中有許多On開頭的,例如第二篇的例子就有一個(gè)OnLButtonDown,它們都是應(yīng)用程序框架響應(yīng)各種事件所需調(diào)用的函數(shù)。 OnDraw便是當(dāng)窗口發(fā)生變化是被調(diào)用的,OnLButtonDown是鼠標(biāo)左鍵被按下時(shí)調(diào)用,還有OnKeyDown是鍵盤被按下時(shí)調(diào)用等等。 當(dāng)用戶在視窗中按下鼠標(biāo)左鍵時(shí),Windows會(huì)自動(dòng)發(fā)送WM_LBUTTONDOWN消息給該視窗,當(dāng)然你可以什么都不做象我們第3篇的例子一樣,如果你想要讓程序?qū)Υ讼⒆龀龇磻?yīng)就必須在視圖類給出相應(yīng)的函數(shù),類似下面這樣:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)/做些事情的代碼還需要在類頭文件包含相應(yīng)的函數(shù)原型說明afx_msg void OnLButtonDown(UINT nFlags,CPoint point);afx_msg只是說明該函數(shù)原型是針對消息映射函數(shù)。下一步在代碼文件中還需要有一個(gè)消息映射宏,作用是把OnLButtonDown函數(shù)和應(yīng)用程序框架聯(lián)系在一起。BEGIN_MESSAGE_MAP(CMyView,CView)ON_WM_LBUTTONDOWNEND_MESSAGE_MAP()最后在類庫的頭文件還需包含:DECLARE_MESSAGE_MAP() 函數(shù)和Windows消息的對應(yīng)關(guān)系可以從MSDN中找到在MSDN中索引輸入(WM_ Messages)便會(huì)列出所有的Windows消息和消息控制函數(shù)原型。在實(shí)際的編程過程中我們不可能全部都用手工的添加或編制消息控制函數(shù)。除了一些特殊的,我們一般是借助Class Wizard來自動(dòng)編制消息映射函數(shù)。這又是MFC應(yīng)用程序框架比起SDK來的有一個(gè)便捷的地方。 MFC庫對140種windows消息直接提供了消息控制函數(shù),并且我們還可以自己定義自己的消息,下面列出的五種消息是我們應(yīng)該特別注意的(MSDN上有更詳細(xì)的內(nèi)容)。WM_CREATE 該消息是Windows發(fā)給視圖的第一個(gè)消息。當(dāng)應(yīng)用程序框架調(diào)用create函數(shù)時(shí)該消息便會(huì)被發(fā)送,此時(shí)窗口還未創(chuàng)建完成,不可見,因此在消息控制函數(shù)OnCreate內(nèi)不能調(diào)用那些依賴窗口處于完全激活狀態(tài)的Windows函數(shù)。如果需要可以在重載的OnInitialUpdate函數(shù)內(nèi)調(diào)用。不過注意在SDI應(yīng)用程序OnInitialUpdate函數(shù)可能被多次調(diào)用。WM_CLOSE 當(dāng)用戶關(guān)閉窗口時(shí),系統(tǒng)會(huì)發(fā)送WM_CLOSE消息。如果派生類重新定義了OnClose函數(shù),就可以完全控制關(guān)閉過程,可以將提醒用戶存盤之類的工作放在這里完成。我們可以通過重載CDocument:SaveModified虛函數(shù)達(dá)到相同的目的。WM_QUERYENDSESSION 從字面的意思看就可以看出,當(dāng)用戶退出Windows時(shí),或者調(diào)用了ExitWindows 函數(shù)時(shí)。Windows會(huì)發(fā)送WM_QUERYENDSESSION消息給所有的正在運(yùn)行的應(yīng)用程序,由OnQueryEndSession消息映射函數(shù)對消息進(jìn)行處理。在它之后應(yīng)該是WM_ENDSESSION 消息。 WM_DESTROY在Windows發(fā)送WM_CLOSE消息后,緊接著會(huì)發(fā)送WM_DESTROY消息,雖然窗口已經(jīng)Close但實(shí)際上并沒有完全清除,在任務(wù)管理器中還可以看見應(yīng)用程序的進(jìn)程(我想很多木馬或病毒都是無窗口的程序,它們的做法是生成了已經(jīng)活動(dòng)狀態(tài)的窗口但不顯示出來),利用這個(gè)消息控制函數(shù)便可以對依賴于當(dāng)前窗口存在的東西做清除工作,不過一定要注意,應(yīng)該調(diào)用基類的OnDestroy函數(shù),而不能在用戶自己的視圖的OnDestroy函數(shù)中終止窗口的析構(gòu)過程,終止析構(gòu)過程應(yīng)該在OnClose函數(shù)中。WM_NCDESTROY 當(dāng)窗口被取消所發(fā)送的最后一個(gè)消息就是這個(gè)消息。我們可以在OnNcDestroy函數(shù)中做一些不依賴該窗口是否處于活動(dòng)狀態(tài)的最后的處理工作,(我實(shí)在想不出還需要做什么?那位朋友能給個(gè)例子),注意一定要調(diào)用基類中的OnNcDestroy函數(shù)。 我們可以做一個(gè)小惡作劇程序:當(dāng)在窗口內(nèi)單擊鼠標(biāo)右鍵(注意是右鍵)時(shí)退出所有的正在運(yùn)行的應(yīng)用程序。void CMy007View:OnDraw(CDC* pDC)CMy007Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut (100,100,請不要單擊鼠標(biāo)右鍵,否則后果自負(fù)!);void CMy007View:OnRButtonDown(UINT nFlags, CPoint point):MessageBox (NULL,你確定要這樣做嗎?,警告,1);:ExitWindows ();/web/189/21186.htm映射模式 在此篇之前我們已經(jīng)學(xué)會(huì)了在窗口顯示圖形,更準(zhǔn)確的說是在窗口指定位置顯示圖形或文字,我們使用的坐標(biāo)單位是象素,稱之為設(shè)備坐標(biāo)??聪旅嬲Z句: pDC-Rectangle(CRect(0,0,200,200); 畫一個(gè)高和寬均為200個(gè)象素的方塊,因?yàn)椴捎玫氖悄J(rèn)的MM_TEXT映射模式,所以在設(shè)備環(huán)境不一樣時(shí),畫的方塊大小也不一樣,在1024*768的顯示器上看到的方塊會(huì)比640*480的顯示器上的小(在不同分辨率下的屏幕象素,在WINDOWS程序設(shè)計(jì)一書中有示例程序可以獲得,或者可以用GetClientRect函數(shù)獲得客戶區(qū)的矩形大小。在這里就不說了,大家只要知道就行了),在輸出到打印機(jī)時(shí)也會(huì)有類似的情況發(fā)生。如何做才能保證在不同設(shè)備上得到大小一致的方塊或者圖形、文字呢?就需要我們進(jìn)行選擇模式映射,來轉(zhuǎn)換設(shè)備坐標(biāo)和邏輯坐標(biāo)。 Windows提供了以下幾種映射模式: MM_TEXT MM_LOENGLISH MM_HIENGLISH MM_LOMETRIC MM_HIMETRIC MM_TWIPS MM_ISOTROPIC MM_ANISOTROPIC 下面分別講講這幾種映射模式: MM_TEXT: 默認(rèn)的映射模式,把設(shè)備坐標(biāo)被映射到象素。x值向右方向遞增;y值向下方向遞增。坐標(biāo)原點(diǎn)是屏幕左上角(0,0)。但我們可以通過調(diào)用CDC的SetViewprotOrg和SetWindowOrg函數(shù)來改變坐標(biāo)原點(diǎn)的位置看下面兩個(gè)例子: /* / 例子6-1 void CMyView:OnDraw(CDC * pDC) pDC-Rectangle(CRect(0,0,200,200);/全部采用默認(rèn)畫一個(gè)寬和高為200象素的方塊 /* / 例子6-2 void CMyView:OnDraw(CDC * pDC) pDC-SetMapMode(MM_TEXT);/設(shè)定映射模式為MM_TEXT pDC-SetWindowOrg(CPoint(100,100);/設(shè)定邏輯坐標(biāo)原點(diǎn)為(100,100) pDC-Rectangle(CRect(100,100,300,300);/畫一個(gè)寬和高為200象素的方塊 這兩個(gè)例子顯示出來的圖形是一樣的,都是從屏幕左上角開始的寬和高為200象素的方塊,可以看出例子2將邏輯坐標(biāo)(100,100)映射到了設(shè)備坐標(biāo)(0,0)處,這樣做有什么用?滾動(dòng)窗口使用的就是這種變換。 固定比例映射模式: MM_LOENGLISH、MM_HIENGLISH、MM_LOMETRIC、MM_HIMETRIC、MM_TWIPS這一組是Windows提供的重要的固定比例映射模式。 它們都是x值向右方向遞增,y值向下遞減,并且無法改變。它們之間的區(qū)別在于比例因子見下:(我想書上P53頁肯定是印錯(cuò)了,因?yàn)橥ㄟ^程序?qū)嶒?yàn)x值向右方向也是遞增的) MM_LOENGLISH 0.01英寸 MM_HIENGLISH 0.001英寸 MM_LOMETRIC 0.1mm MM_HIMETRIC 0.01mm MM_TWIPS 1/1440英寸 /應(yīng)用于打印機(jī),一個(gè)twip相當(dāng)于1/20磅,一磅又相當(dāng)于1/72英寸。 看例3 /* / 例子6-3 void CMyView:OnDraw(CDC * pDC) pDC-SetMapMode(MM_HIMETRIC);/設(shè)定映射模式為MM_HIMETRIC pDC-Rectangle(CRect(0,0,4000,-4000);/畫一個(gè)寬和高為4厘米的方塊 還有一種是可變比例映射模式,MM_ISOTROPIC、MM_ANISOTROPIC。用這種映射模式可以做到當(dāng)窗口大小發(fā)生變化時(shí)圖形的大小也會(huì)相應(yīng)的發(fā)生改變,同樣當(dāng)翻轉(zhuǎn)某個(gè)軸的伸展方向時(shí)圖象也會(huì)以另外一個(gè)軸為軸心進(jìn)行翻轉(zhuǎn),并且我們還可以定義任意的比例因子,怎么樣很有用吧。 MM_ISOTROPIC、MM_ANISOTROPIC兩種映射模式的區(qū)別在于MM_ISOTROPIC模式下無論比例因子如何變化縱橫比是1:1而M_ANISOTROPIC模式則可以縱橫比獨(dú)立變化。 讓我們看例子4 /* / 例子6-4 void CMy002View:OnDraw(CDC* pDC) CRect rectClient; / GetClientRect(rectClient);/返回客戶區(qū)矩形的大小 pDC-SetMapMode(MM_ANISOTROPIC);/設(shè)定映射模式為MM_ANISOTROPIC pDC-SetWindowExt(1000,1000); pDC-SetViewportExt (rectClient.right ,-rectClient.bottom ); /用SetWindowExt和SetViewportExt函數(shù)設(shè)定窗口為1000邏輯單位高和1000邏輯單位寬 pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2 );/設(shè)定邏輯坐標(biāo)原點(diǎn)為窗口中心 pDC-Ellipse(CRect(-500,-500,500,500);/畫一個(gè)撐滿窗口的橢圓。 / TODO: add draw code for native data here 怎么樣,屏幕上有一個(gè)能跟隨窗口大小改變而改變的橢圓。把 pDC-SetMapMode(MM_ANISOTROPIC);這句改為pDC-SetMapMode(MM_ISOTROPIC)會(huì)怎樣?大家可以試試。那還有一個(gè)問題就是上例的比例因子是多少呢?看下面公式(注意是以例子4為例的) x比例因子=rectClient.right/1000 /視窗的寬除以窗口范圍 y比例因子=-rectClient.bottom/1000 /視窗的高除以窗口范圍 從Windows的鼠標(biāo)消息可以獲得鼠標(biāo)指針的當(dāng)前坐標(biāo)值(point.x和point.y)此坐標(biāo)值是設(shè)備坐標(biāo)。 很多MFC庫函數(shù)尤其是CRect的成員函數(shù)只能工作在設(shè)備坐標(biāo)下。 還有我們有時(shí)需要利用物理坐標(biāo),物理坐標(biāo)的概念就是現(xiàn)實(shí)世界的實(shí)際尺寸。 設(shè)備坐標(biāo)-邏輯坐標(biāo)-物理坐標(biāo)之間如何進(jìn)行轉(zhuǎn)換便成為我們要考慮的一個(gè)問題,物理坐標(biāo)和邏輯坐標(biāo)是完全要我們自己來做的,但WINDOWS提供了函數(shù)來幫助我們轉(zhuǎn)換邏輯坐標(biāo)和設(shè)備坐標(biāo)。 CDC的LPtoDP函數(shù)可以將邏輯坐標(biāo)轉(zhuǎn)換成設(shè)備坐標(biāo) CDC的DPtoLP函數(shù)可以將設(shè)備坐標(biāo)轉(zhuǎn)換成邏輯坐標(biāo) 下面列出我們應(yīng)該在什么時(shí)候使用什么樣的坐標(biāo)系一定要記?。?CDC的所有成員函數(shù)都以邏輯坐標(biāo)為參數(shù) CWnd的所有成員函數(shù)都以設(shè)備坐標(biāo)為參數(shù) 區(qū)域的定義采用設(shè)備坐標(biāo) 所有的選中測試操作應(yīng)考慮使用設(shè)備坐標(biāo)。 需要長時(shí)間使用的值用邏輯坐標(biāo)或物理坐標(biāo)來保存。因設(shè)備坐標(biāo)會(huì)因窗口的滾動(dòng)變化而改變。 用書上的例子作為以前幾篇的復(fù)習(xí),如果你能夠獨(dú)立完成它說明前面的內(nèi)容已經(jīng)掌握。另外有些東西是新的,我會(huì)比較詳細(xì)的做出說明,例如客戶區(qū)、滾動(dòng)窗口等。 第七篇:圖形設(shè)備接口(GDI) 我想大家和我一樣通過前幾天的學(xué)習(xí),對VC+MFC應(yīng)用程序框架的神奇功能有了一些了解,但是還是感覺不能駕御這個(gè)強(qiáng)的開發(fā)工具,不過別擔(dān)心,我170多斤體重不是一口吃出來的,是經(jīng)過了30年不懈的努力才吃成了如此“魁梧”的體形,呵呵開個(gè)玩笑。所以學(xué)習(xí)也一樣。學(xué)VC尤其如此。還有我發(fā)現(xiàn)很多好的技術(shù)類書籍有一個(gè)共同的特點(diǎn),就是在前幾章學(xué)到了一些東西在你正在疑惑或者苦苦領(lǐng)會(huì)的時(shí)候,接下來的章節(jié)便給你解除疑惑。雷神經(jīng)驗(yàn):遇到實(shí)在想不明白的地方先放下,繼續(xù)向下讀,也許讀著讀著前面的問題就明白了。VC+技術(shù)內(nèi)幕當(dāng)然屬于好的技術(shù)書籍一類,所以在本書第五章開始仔細(xì)的給我們講解設(shè)備環(huán)境類和圖形設(shè)備接口(GDI),使得我們能守得云開見月明。設(shè)備環(huán)境類CDC: CDC是設(shè)備環(huán)境類的基類直接由CObject派生。是GDI的關(guān)鍵元素,它代表了物理設(shè)備。每一個(gè)C+設(shè)備環(huán)境對象都有相對應(yīng)Windows設(shè)備環(huán)境,并通過一個(gè)32位類型的HDC句柄來標(biāo)識(shí)。CDC類的虛擬性使我們可以很容易的做到編寫同時(shí)適用于多種設(shè)備的代碼。例如OnDraw函數(shù)的pDC-TextOut(0,0,Hello);既可以適用于顯示器、還可以適用于打印預(yù)覽和打印,只需要在CView:OnDraw函數(shù)的pDC參數(shù)指向不同的對象類。CClientDC和CWindowDC是顯示設(shè)備環(huán)境類,都是由CDC派生而來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標(biāo)題欄和菜單欄,(0,0)指客戶區(qū)域的左上角。CWindowDC的(0,0)指整個(gè)屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標(biāo)題欄和菜單欄等等。CWindowDC一般應(yīng)用在框架窗口,而不是視圖窗口。CDC對象被創(chuàng)建后一定要在合適的時(shí)候?qū)⑺鼊h除掉,如果忘記了刪除設(shè)備環(huán)境對象則會(huì)造成內(nèi)存丟失。如何做才能避免出現(xiàn)這個(gè)問題呢,我們應(yīng)該在堆棧中構(gòu)造對象??蠢?-1/*/ 例子7-1void CMyView:OnLButtonDown(UINT nFlags,CPoint point)CRect rect;CClientDC dc(this); /在堆棧中構(gòu)造設(shè)備環(huán)境對象,用一個(gè)窗口指針this作參數(shù)。dc.GetClipBox(rect); /GetClipBox函數(shù)是一個(gè)虛函數(shù),作用是可以獲得選定區(qū)域的尺寸/析構(gòu)函數(shù)在函數(shù)返回時(shí)自動(dòng)調(diào)用,也就完成對設(shè)備環(huán)境對象的刪除。書上還給出了另一種寫法:void CMyView:OnLButtonDown(UINT nFlags,CPoint point)CRect rect;CDC * pDC=GetDC(); /通過調(diào)用CWnd的GetDC()函數(shù)獲得設(shè)備環(huán)境指針pDC-GetClipBox(rect); /可以獲得選定區(qū)域的尺寸ReleaseDC(pDC); /一定不能忘記,釋放設(shè)備環(huán)境。(書上又寫錯(cuò)了) 創(chuàng)建的設(shè)備環(huán)境對象具有一些默認(rèn)的特性,通過CDC類的成員函數(shù)可以設(shè)定這些特性。例如前一篇筆記用到的刷子、映射模式等等。我們還可以通過重載SelectObject函數(shù)將GDI對象選進(jìn)設(shè)備環(huán)境中。GDI對象是通過CGdiObject派生類的C+對
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 趙志祥的一分鐘教學(xué)課件
- 紋身教學(xué)課件
- 美術(shù)教學(xué)課件大綱
- 閱讀教學(xué)指導(dǎo)課件
- 順采茶教學(xué)課件
- 教學(xué)課件母版設(shè)計(jì)
- 散步教學(xué)說課課件
- 幼兒教學(xué)掛圖課件
- 浙江寧波寧??h2022自主招生考試數(shù)學(xué)試題真題(含答案詳解)
- 書法篆書教學(xué)課件下載
- 商協(xié)會(huì)公章管理制度
- 企業(yè)檔案利用管理制度
- 安全生產(chǎn)月題庫-2025年安全生產(chǎn)月安全知識(shí)競賽題庫(附題目答案)
- 口腔正畸模型測量分析
- 機(jī)加工獎(jiǎng)罰管理制度
- 2024年中汽中心招聘真題
- 2024年貴州省黔西縣教育局公開招聘試題含答案分析
- 集裝箱投資項(xiàng)目可行性研究報(bào)告
- 2025-2030中國農(nóng)業(yè)電商行業(yè)經(jīng)營規(guī)模及投資發(fā)展戰(zhàn)略研究報(bào)告
- 拆分合同:合伙企業(yè)解散及債務(wù)分擔(dān)協(xié)議
- 2025河北邯鄲市肥鄉(xiāng)區(qū)選聘農(nóng)村黨務(wù)(村務(wù))工作者100人筆試參考題庫完整參考答案詳解
評論
0/150
提交評論