本科《c程序設(shè)計(jì)》visual-c-mfc入門教程_第1頁(yè)
本科《c程序設(shè)計(jì)》visual-c-mfc入門教程_第2頁(yè)
本科《c程序設(shè)計(jì)》visual-c-mfc入門教程_第3頁(yè)
本科《c程序設(shè)計(jì)》visual-c-mfc入門教程_第4頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

VisualC++/MFC入門教程TOC\o"1-5"\h\z\o"CurrentDocument"VisualC++/MFC入門教程 -1-\o"CurrentDocument"VC開(kāi)發(fā)指南 -5-\o"CurrentDocument"如何學(xué)好VC -5\o"CurrentDocument"理解Windows消息機(jī)制 -6-\o"CurrentDocument"利用VisualC++/MFC開(kāi)發(fā)Windows程序的優(yōu)勢(shì) -7-\o"CurrentDocument"利用MFC進(jìn)行開(kāi)發(fā)的通用方法介紹 -9\o"CurrentDocument"MFC中常用類,宏,函數(shù)介紹 -10-\o"CurrentDocument"和GUI有關(guān)的各種對(duì)象 -11-\o"CurrentDocument"使用點(diǎn),刷子,筆進(jìn)行繪圖 -18-\o"CurrentDocument"在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無(wú)關(guān)位圖 -20-\o"CurrentDocument"使用各種映射方式 -23-\o"CurrentDocument"多邊形和剪貼區(qū)域 -24-\o"CurrentDocument"文檔視圖框架窗口間的關(guān)系和消息傳送規(guī)律 -25-\o"CurrentDocument"接收用戶輸入 -25-\o"CurrentDocument"使用菜單 -29-\o"CurrentDocument"文檔,視,框架之間相互作用 -32-\o"CurrentDocument"利用序列化進(jìn)行文件讀寫 -33-\o"CurrentDocument"MFC中所提供的各種視類介紹 -35Button -36-ListBox/CheckListBox -39-ComboBox -41-TreeCtrl -42-ListCtrl -44-TabCtrl -47-AToolBar -48-DialogBar -50-利用AppWizard創(chuàng)建并使用ToolBarStatusBarDialogBar -51-GeneralWindow "55~TOC\o"1-5"\h\z\o"CurrentDocument"使用資源編輯器編輯對(duì)話框 -57-\o"CurrentDocument"創(chuàng)建有模式對(duì)話框 -59-(1)如何通過(guò)代碼獲得應(yīng)用程序主窗口的指針? -61確定應(yīng)用程序的路徑 -61-(3)如何在程序中獲得其他程序的圖標(biāo)? -62-(4)獲得各種目錄信息 -63女U|可自<AL2ノ力,&、 -63-TOC\o"1-5"\h\z如何改變窗口的圖標(biāo)? -64-(7)如何改變窗口的缺省風(fēng)格? -64如何將窗口居中顯示? -65-(9)如何讓窗口和MDI窗ロー啟動(dòng)就最大化和最小化? -65如何限制窗口的大小? -66如何使窗口不可見(jiàn)? * * -66-如何創(chuàng)建一個(gè)字回繞的CEditView -66-(13)如何使程序保持極小狀態(tài)? -67-(14)移動(dòng)窗口 -67通用控件的顯水窗口 -67-重置窗口的大小 -67-(17)如何單擊除了窗口標(biāo)題欄以外的區(qū)域使窗口移動(dòng) -68-(18)如何改變視窗的背景顏色 -69-(19)如何改變窗口標(biāo)題 -70-(20)如何防止主框窗口在其說(shuō)明中顯示活動(dòng)的文檔名 -71-(21)如何獲取有關(guān)窗口正在處理的當(dāng)前消息的信息 -72-(22)如何在代碼中獲取工具條和狀態(tài)條的指針 -72-(23)如何使能和禁止工具條的工具提示 -72-(24)如何創(chuàng)建一個(gè)不規(guī)則形狀的窗口 -73-(25)如何獲取應(yīng)用程序的實(shí)例句柄? -76-(26)如何編程結(jié)束應(yīng)用程序? -77-(27)如何創(chuàng)建和使用無(wú)模式對(duì)話框 -77-(28)如何防止主框窗口在其說(shuō)明中顯示活動(dòng)的文檔名 -79-(29)如何在代碼中獲取工具條和狀態(tài)條的指針 -79-(30)怎樣加載其他的應(yīng)用程序? -80-(31)如何在代碼中獲取工具條和狀態(tài)條的指針 -81-(32)如何使能和禁止工具條的工具提示 -81-(33)如何設(shè)置工具條標(biāo)題 -82-(34)如何使窗口始終在最前方? -82-(35)如何在對(duì)話框中顯示一個(gè)位圖 -83-(36)如何改變對(duì)話或窗體視窗的背景顏色 -83-(37)如何獲取ー個(gè)對(duì)話控件的指針 -85-(38)如何禁止和使能控件 -85-(39)如何改變控件的字體 -86-(40)如何在OLE控件中使用OLE_COLOR數(shù)據(jù)類型 -86-(41)在不使用通用文件打開(kāi)對(duì)話的情況下如何顯示ー個(gè)文件列表 -87-(42)為什么旋轉(zhuǎn)按鈕控件看起來(lái)倒轉(zhuǎn) -88-(43)為什么旋轉(zhuǎn)按鈕控件不能自動(dòng)地更新它下面的編輯控件 -88如何用位圖顯示下壓按鈕 -88-(45)如何一個(gè)創(chuàng)建三態(tài)下壓按鈕 -89如何動(dòng)態(tài)創(chuàng)建控件 -89-(47)如何限制編輯框中的準(zhǔn)許字符 -90-(48)如何改變控件的顏色 -92-(49)當(dāng)向列表框中添加多個(gè)項(xiàng)時(shí)如何防止閃爍 -93-如何向編輯控件中添加文本 -94如何訪問(wèn)預(yù)定義的GDI對(duì)象 -94-如何獲取GDI對(duì)象的屬性信息 -96-(53)如何實(shí)現(xiàn)一個(gè)橡皮區(qū)矩形 -97-(54)如何更新翻轉(zhuǎn)背景顏色的文本 -99-(55)如何創(chuàng)建一個(gè)具有特定點(diǎn)大小的字體 -100如何計(jì)算ー個(gè)串的大小 -101-如何亞ホ旋轉(zhuǎn)文不 -102-(58)如何正確顯示包含標(biāo)簽字符的串 -103-如何快速地格式化ー個(gè)CString對(duì)象 -104-TOC\o"1-5"\h\z(60)串太長(zhǎng)時(shí)如何在其末尾顯示ー個(gè)省略號(hào) -104-(61)為什么即使調(diào)用EnableMenuItem菜單項(xiàng)后,菜單項(xiàng)還處于禁止?fàn)顟B(tài)-105-(62)如何給系統(tǒng)菜單添加一個(gè)菜單項(xiàng) -106-(63)如何確定頂層菜單所占據(jù)的菜單行數(shù) -107-(64)在用戶環(huán)境中如何確定系統(tǒng)顯示元素的顏色 -108-(65)如何査詢和設(shè)置系統(tǒng)參數(shù) -108-(66)如何確定當(dāng)前屏幕分辨率 -108(67)如何使用ー個(gè)預(yù)定義的Windows光標(biāo) -109-(68)如何檢索原先的TaskManager應(yīng)用程序使用的任務(wù)列表 -109(69)如何確定Windows和Windows系統(tǒng)目錄 -111-)我怎樣才能;立一個(gè)等待光標(biāo)? -112-(72)我在MD1框架中有個(gè)form視窗。它有個(gè)取消按鈕,我需要當(dāng)用戶按取消按鈕時(shí)可關(guān)閉form視窗。我應(yīng)該如何關(guān)閉該文檔? -113如何訪問(wèn)桌面窗口 -113什么是COLORREF?我該怎樣用它? -114AppWizard所產(chǎn)生的STDAFX文件是干什么用的? -114-(76)我在我的程序中是了CDWordArrayo我向它添加了約10,00〇個(gè)整數(shù),這使得它變得非常非常慢。為什么會(huì)這么糟? -115-(77)我該如何改變MD1框架窗口的子窗口的大小以使在窗口以一定的大小打開(kāi)? -115-(78)在我的程序的某些部分,我可以調(diào)用MessageBox函數(shù)來(lái)建立一個(gè)信息對(duì)話框,例如在視類中。但是,在其它部分我卻不能,如文檔類中。為什么?我怎樣才能在我的應(yīng)用程序類中建立一個(gè)信息對(duì)話框? -115-(79)我需要在我的程序中設(shè)置全局變量,以使文檔中的所有類都能訪問(wèn)。我應(yīng)該吧它放到哪兒? -115-(80)我聽(tīng)說(shuō)MFC可以發(fā)現(xiàn)內(nèi)存漏洞,我怎樣使用該特性? -116-(81)我怎樣才能在我的應(yīng)用程序中循環(huán)瀏覽已經(jīng)打開(kāi)的文檔? -116-(82)才能在我的應(yīng)用程序中循環(huán)瀏覽已經(jīng)打開(kāi)的視? -116-(83)數(shù)PreCreateWindow是干什么用的? -116-(84)該怎樣防止MFC在窗口標(biāo)題欄上把文檔名預(yù)置成應(yīng)用程序名? -116-(85)我應(yīng)該怎樣防止MFC在窗口標(biāo)題欄上添加文檔名? -116-(86)我應(yīng)該如何改變視窗口的大小? -116-(87)我有一無(wú)模式對(duì)話框。我怎樣才能在窗口退出時(shí)刪除CDialog對(duì)象?-117-為什么把"deletethis”放在PostNcDestroy中而不是OnNcDestroy?-117File菜單中的MRU列表是從哪兒來(lái)的?列表中的名字放在哪兒了?我怎樣才能改變列表中項(xiàng)目的最大值? -117-(90)我在菜單中添加了新的項(xiàng)。但是,當(dāng)我選該項(xiàng)時(shí),在狀態(tài)欄上沒(méi)有出現(xiàn)任何提示信息。為什么? -117-(91)我怎樣才能在應(yīng)用程序的缺省系統(tǒng)菜單中加上一些東西? -117-(92)我建立了一個(gè)對(duì)話框。但是當(dāng)我顯示該對(duì)話框時(shí),第一個(gè)編輯框總是不能獲得焦點(diǎn),我必須單擊它來(lái)使它獲得焦點(diǎn)。我怎樣才能使第一個(gè)編輯框在對(duì)話框打開(kāi)時(shí)就獲得焦點(diǎn)? -118-(93)我怎樣才能使一個(gè)窗口具有“alwaysontop”特性? -118-(94)我要為我的formview添加文檔模板。我先建立了對(duì)話框模板,然后使用ClassWizard建立了基于CFormView的新類,它也是從CDocument繼承來(lái)的。我還建立了相應(yīng)的資源并在Initlnstance中添加了新的文檔模板。但是,當(dāng)我試圖運(yùn)行該程序時(shí),出現(xiàn)了Assertion信息。為什么? -118-(95)我在ー對(duì)話框中有一列表框,我需要tabbed列表框中的項(xiàng)目。但是,當(dāng)我處理含有tab字符(用AddString添加的)的列表項(xiàng)時(shí),tab被顯示成小黑塊而沒(méi)有展開(kāi)。哪兒出錯(cuò)了? -119-(96)我建立了一個(gè)應(yīng)用程序,并使用了CRecordset類。但是,當(dāng)我運(yùn)行該程序時(shí),它試圖要訪問(wèn)數(shù)據(jù)庫(kù),并給出“InternalApplicationError”對(duì)話框。我應(yīng)該怎樣(97)我用ClassWizard建立了一個(gè)類。但是,我把名字取錯(cuò)了,我想把它從項(xiàng)目中刪除,應(yīng)該如何做? -119-(98)當(dāng)我打開(kāi)應(yīng)用程序中的窗口時(shí),我要傳遞該窗口的矩形尺寸。該矩形指定了窗口的外圍大小,但是當(dāng)我調(diào)用GetClientRect時(shí),所得到的尺寸要比所希望的值要小(因?yàn)楣ぞ邫诤痛翱谶吙虻木壒?。有其它方法來(lái)計(jì)算窗口的尺寸嗎?-119-(99)我在文檔類中設(shè)置了一個(gè)整型變量。但是,當(dāng)我試圖把該變量寫入Serialize函數(shù)中的archive文件中時(shí),出現(xiàn)了類型錯(cuò)誤。而文檔中的其它變量沒(méi)有問(wèn)題。為TOC\o"1-5"\h\z什么? - 120-(100)如何控制菜單的大小? - 120-(101)改變LVIS_SELECTED的狀態(tài)顏色? - 121-(102)如何只存儲(chǔ)文檔的某一部分? - 121-(103)保存工具條菜單有bug嗎? - 121-4) Tipoftheday的bug - 122-(105)如何可以讓我的程序可以顯示在其它的窗口上面? - 123-(106)如何控制窗口框架的最大最小尺寸? - 124-(107)如何改變窗口框架的顏色? - 126-(108)如何將應(yīng)用程序窗口置于屏幕正中? - 127-VC開(kāi)發(fā)指南如何學(xué)好VC這個(gè)問(wèn)題很多朋友都問(wèn)過(guò)我,當(dāng)然流汗是必須的,但同時(shí)如果按照某種思路進(jìn)行有計(jì)劃的學(xué)習(xí)就會(huì)起到更好的效果。萬(wàn)事開(kāi)頭難,為了幫助朋友們更快的掌握vc開(kāi)發(fā),下面我將自己的ー點(diǎn)體會(huì)講一下:1、需要有好的C/C++基礎(chǔ)。正所謂“磨刀不誤砍柴エ”,最開(kāi)始接觸VC時(shí)不要急于開(kāi)始Windows程序開(kāi)發(fā),而是應(yīng)該進(jìn)行一些字符界面程序的編寫。這樣做的目的主要是增加對(duì)語(yǔ)言的熟悉程度,同時(shí)也訓(xùn)練自己的思維和熟悉ー些在編程中常犯的錯(cuò)誤。更重要的是理解并能運(yùn)用C++的各種特性,這些在以后的開(kāi)發(fā)中都會(huì)有很大的幫助,特別是利用MFC進(jìn)行開(kāi)發(fā)的朋友對(duì)C++ー定要能熟練運(yùn)用。2、理解Windows的消息機(jī)制,窗口句柄和其他GUI句柄的含義和用途。了解和MFC各個(gè)類功能相近的API函數(shù)。3、一定要理解MFC中消息映射的作用。4、訓(xùn)練自己在編寫代碼時(shí)不使用參考書(shū)而是使用HelpOnlineo5,記住一些常用的消息名稱和參數(shù)的意義。6、學(xué)會(huì)看別人的代碼。7、多看書(shū),少買書(shū),買書(shū)前一定要慎重。8、閑下來(lái)的時(shí)候就看參考書(shū)。9、多來(lái)我的主頁(yè)。AOへ后面幾條是我個(gè)人的一點(diǎn)意見(jiàn),你可以根據(jù)需要和自身的情況選用適用于自己的方法。此外我將一些我在選擇參考書(shū)時(shí)的原則:對(duì)于初學(xué)者:應(yīng)該選擇ー些內(nèi)容比較全面的書(shū)籍,并且書(shū)籍中的內(nèi)容應(yīng)該以合理的方式安排,在使用該書(shū)時(shí)可以達(dá)到循序漸進(jìn)的效果,書(shū)中的代碼要有詳細(xì)的講解。盡量買翻譯的書(shū),因?yàn)檫@些書(shū)一般都比較易懂,而且語(yǔ)言比較輕松。買書(shū)前一定要慎重如果買到不好用的書(shū)可能會(huì)對(duì)自己的學(xué)習(xí)積極性產(chǎn)生打擊。對(duì)于已經(jīng)掌握了VC的朋友:這種程度的開(kāi)發(fā)者應(yīng)該加深自己對(duì)系統(tǒng)原理,技術(shù)要點(diǎn)的認(rèn)識(shí)。需要選擇ー些對(duì)原理講解的比較透徹的書(shū)籍,這樣ー來(lái)オ會(huì)對(duì)新技術(shù)有更多的了解,最好書(shū)中對(duì)技術(shù)的應(yīng)用有一定的闡述。盡量選擇示范代碼必較精簡(jiǎn)的書(shū),可以節(jié)約銀子。此外最好涉獵ー些輔助性的書(shū)籍。

理解Windows消息機(jī)制Windows系統(tǒng)是ー個(gè)消息驅(qū)動(dòng)的OS,什么是消息呢?我很難說(shuō)得清楚,也很難下一個(gè)定義(誰(shuí)在噓我),我下面從不同的幾個(gè)方面講解一下,希望大家看了后有一點(diǎn)了解。1,消息的組成:ー個(gè)消息由一個(gè)消息名稱(UINT),和兩個(gè)參數(shù)(WPARAM,LPARAM)。當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí)系統(tǒng)都會(huì)發(fā)送消息到某ー個(gè)窗口。例如當(dāng)菜單轉(zhuǎn)中之后會(huì)有WM一COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam))是命令的1D號(hào),對(duì)菜單來(lái)講就是菜單ID。當(dāng)然用戶也可以定義自己的消息名稱,也可以利用自定義消息來(lái)發(fā)送通知和傳送數(shù)據(jù)。2、誰(shuí)將收到消息、:一個(gè)消息必須由一個(gè)窗口接收。在窗口的過(guò)程(WNDPROC)中可以對(duì)消息進(jìn)行分析,對(duì)自己感興趣的消息進(jìn)行處理。例如你希望對(duì)菜單選擇進(jìn)行處理那么你可以定義對(duì)WM一COMMAND進(jìn)行處理的代碼,如果希望在窗口中進(jìn)行圖形輸出就必須對(duì)WM_PAINT進(jìn)行處理。3、未處理的消息到那里去了:乂$為窗口編寫了默認(rèn)的窗口過(guò)程,這個(gè)窗口過(guò)程將負(fù)責(zé)處理那些你不處理消息。正因?yàn)橛辛诉@個(gè)默認(rèn)窗口過(guò)程我們オ可以利用Windows的窗口進(jìn)行開(kāi)發(fā)而不必過(guò)多關(guān)注窗口各種消息的處理。例如窗口在被拖動(dòng)時(shí)會(huì)有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。4,窗口句柄:說(shuō)到消息就不能不說(shuō)窗口句柄,系統(tǒng)通過(guò)窗口句柄來(lái)在整個(gè)系統(tǒng)中唯一標(biāo)識(shí)ー個(gè)窗口,發(fā)送ー個(gè)消息時(shí)必須指定一個(gè)窗口句柄表明該消息由那個(gè)窗口接收。而每個(gè)窗口都會(huì)有自己的窗口過(guò)程,所以用戶的輸入就會(huì)被正確的處理。例如有兩個(gè)窗口共用一個(gè)窗口過(guò)程代碼,你在窗ロー上按下鼠標(biāo)時(shí)消息就會(huì)通過(guò)窗ロー的句柄被發(fā)送到窗ロー而不是窗ロニ。5、示例:下面有一段偽代碼演示如何在窗口過(guò)程中處理消息LONGyourWndProc(HWNDhWnd,UINTuMessageType,WPARAMwP.LPARAM)switch(uMessageType){〃使用SWITCH語(yǔ)句將各種消息分開(kāi)case(WM_PAINT):doYourWindow(?.);〃在窗口需要重新繪制時(shí)進(jìn)行輸出break;case(WM_LBUTTONDOWN):doYourWork(...);〃在鼠標(biāo)左鍵被按下時(shí)進(jìn)行處理break;default:

callDefaullWndProc(...);〃對(duì)于其它情況就讓系統(tǒng)自己處理break;接下來(lái)談?wù)勈裁词窍C(jī)制:系統(tǒng)將會(huì)維護(hù)ー個(gè)或多個(gè)消息隊(duì)列,所有產(chǎn)生的消息都回被放入或是插入隊(duì)列中。系統(tǒng)會(huì)在隊(duì)列中取出每一條消息,根據(jù)消息的接收句柄而將該消息發(fā)送給擁有該窗U的程序的消息循環(huán)。每ー個(gè)運(yùn)行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的窗口過(guò)程。而在沒(méi)有消息時(shí)消息循環(huán)就將控制權(quán)交給系統(tǒng)所以Windows可以同時(shí)進(jìn)行多個(gè)任務(wù)。下面的偽代碼演示了消息循環(huán)的用法:while(1)id=getMessage(...);if(id==quit)break;translateMessage(…);當(dāng)該程序沒(méi)有消息通知時(shí)getMessage就不會(huì)返回,也就不會(huì)占用系統(tǒng)的CPU時(shí)間。圖示消息投遞模式在16位的系統(tǒng)中系統(tǒng)中只有一個(gè)消息隊(duì)列,所以系統(tǒng)必須等待當(dāng)前任務(wù)處理消息后オ可以發(fā)送下ー消息到相應(yīng)程序,如果ー個(gè)程序陷如死循環(huán)或是耗時(shí)操作時(shí)系統(tǒng)就會(huì)得不到控制權(quán)。這種多任務(wù)系統(tǒng)也就稱為協(xié)同式的多任務(wù)系統(tǒng)。Windows3.X就是這種系統(tǒng)。而32位的系統(tǒng)中每ー運(yùn)行的程序都會(huì)有一個(gè)消息隊(duì)列,所以系統(tǒng)可以在多個(gè)消息隊(duì)列中轉(zhuǎn)換而不必等待當(dāng)前程序完成消息處理就可以得到控制權(quán)。這種多任務(wù)系統(tǒng)就稱為搶先式的多任務(wù)系統(tǒng)。Windows95/NT就是這種系統(tǒng)。利用VisualC++/MFC開(kāi)發(fā)Windows程序的優(yōu)勢(shì)MFC借助C++的優(yōu)勢(shì)為Windows開(kāi)發(fā)開(kāi)辟了一片新天地,同時(shí)也借助ApplicationWizzard使開(kāi)發(fā)者擺脫離了那些每次都必寫基本代碼,借助ClassWizard和消息映射使開(kāi)發(fā)者擺脫了定義消息處理時(shí)那種混亂和冗長(zhǎng)的代碼段。更令人興奮的是利用C++的封裝功能使開(kāi)發(fā)者擺脫Windows中各種句柄的困擾,只需要面對(duì)C++中的對(duì)象,這樣一來(lái)使開(kāi)發(fā)更接近開(kāi)發(fā)語(yǔ)言而遠(yuǎn)離系統(tǒng)。(但我個(gè)人認(rèn)為了解系統(tǒng)原理對(duì)開(kāi)發(fā)很有幫助)正因?yàn)镸FC是建立在C++的基礎(chǔ)上,所以我強(qiáng)調(diào)C/C++語(yǔ)言基礎(chǔ)對(duì)開(kāi)發(fā)的重要性。利用C++的封裝性開(kāi)發(fā)者可以更容易理解和操作各種窗口對(duì)象:利用C++的派生性開(kāi)發(fā)者可以減少開(kāi)發(fā)自定義窗口的時(shí)間和創(chuàng)造出可重用的代碼;利用虛擬性可以在必要時(shí)更好的控制窗口的活動(dòng)。而且C++本身所具備的超越C語(yǔ)言的特性都可以使開(kāi)發(fā)者編寫出更易用,更靈活的代碼。在MFC中對(duì)消息的處理利用了消息映射的方法,該方法的基礎(chǔ)是宏定義實(shí)現(xiàn),通過(guò)宏定義將消息分派到不同的成員函數(shù)進(jìn)行處理。下面簡(jiǎn)單講述一下這種方法的實(shí)現(xiàn)方法:代碼如下BEGIN一MESSAGE_MAP(CMainFrame,CFrameWnd)//((AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()〃}}AFX_MSG一MAPON_COMMAND(ID_FONT_DROPDOWN,DoNothing)END_MESSAGE_MAP()經(jīng)過(guò)編譯后,代碼被替換為如下形式(這只是作講解,實(shí)際情況比這え雜得多):〃BEGIN-MESSAGE-MAP(CMainFrame,CFrameWnd)CMainFrame::newWndProc(...)(switch(...)(//{{AFX_MSG_MAP(CMainFrame)//ON_WM_CREATE()case(WM_CREATE):OnCreate(...);break;//}}AFX_MSG_MAP//ON_COMMAND(ID_FONT_DROPDOWN,DoNothing)case(WM.COMMAND):if(Hl\VORD(wP)==ID_FONT_DROPDOWN)DoNothing(...);)break;//END_MESSAGE_MAP()})newWndProc就是窗口過(guò)程只要是該類的實(shí)例生成的窗II都使用該窗口過(guò)程。所以了解了Windows的消息機(jī)制在加上對(duì)消息映射的理解就很容易了解MFC開(kāi)發(fā)的基本思路了。利用MFC進(jìn)行開(kāi)發(fā)的通用方法介紹以下是我在最初學(xué)習(xí)VC時(shí)所常用的開(kāi)發(fā)思路和方法,希望能對(duì)初學(xué)VC的朋友有所幫助和啟發(fā)。1、開(kāi)發(fā)需要讀寫文件的應(yīng)用程序并且有簡(jiǎn)單的輸入和輸出可以利用單文檔視結(jié)構(gòu)。2、開(kāi)發(fā)注重交互的簡(jiǎn)單應(yīng)用程序可以使用對(duì)話框?yàn)榛A(chǔ)的窗ロ,如果文件讀寫簡(jiǎn)單這可利用CFile進(jìn)行。3、開(kāi)發(fā)注重交互并且文件讀寫復(fù)雜的的簡(jiǎn)單應(yīng)用程序可以利用以CFormView為基礎(chǔ)視的單文檔視結(jié)構(gòu)。4,利用對(duì)話框得到用戶輸入的數(shù)據(jù),在等級(jí)提高后可使用就地輸入。5、在對(duì)多文檔要求不強(qiáng)烈時(shí)盡量避免多文檔視結(jié)構(gòu),可以利用分隔條產(chǎn)生單文檔多視結(jié)構(gòu)。6、在要求在多個(gè)文檔間傳遞數(shù)據(jù)時(shí)使用多文檔視結(jié)構(gòu).7、學(xué)會(huì)利用子窗口,并在自定義的子窗口包含多個(gè)控件達(dá)到封裝功能的目的。8、盡量避免使用多文檔多視結(jié)構(gòu)。9,不要使用多重繼承并盡量減少ー個(gè)類中封裝過(guò)多的功能。MFC中常用類,宏,函數(shù)介紹常用類CRect:用來(lái)表示矩形的類,擁有四個(gè)成員變量:topleftbottomright。分別表是左上角和右下角的坐標(biāo)??梢酝ㄟ^(guò)以下的方法構(gòu)造:CRect(int1,intt,intr,intb);指明四個(gè)坐標(biāo)CRect(constRECT&srcRect);由RECT結(jié)構(gòu)構(gòu)造CRect(LPCRECTIpSrcRect);由RECT結(jié)構(gòu)構(gòu)造CRect(POINTpoint,SIZEsize);有左上角坐標(biāo)和尺寸構(gòu)造CRect(POINTtopLeft,POINTbottomRight);有兩點(diǎn)坐標(biāo)構(gòu)造下面介紹幾個(gè)成員函數(shù):intWidth()const;得到寬度intHeight()const;得到髙度CSizeSize()const;得到尺寸CPoint&TopLeft();得到左上角坐標(biāo)CPoint&BottomRight();得到右下角坐標(biāo)CPointCenterPoint()const;得當(dāng)中心坐標(biāo)此外矩形可以和點(diǎn)(CPoint)相加進(jìn)行位移,和另ー個(gè)矩形相加得到“并”操作后的矩形。CPoint:用來(lái)表示ー個(gè)點(diǎn)的坐標(biāo),有兩個(gè)成員變量:xy0可以和另ー個(gè)點(diǎn)相加。CString:用來(lái)表示可變長(zhǎng)度的字符串。使用CString可不指明內(nèi)存大小,CString會(huì)根據(jù)需要自行分配。下面介紹幾個(gè)成員函數(shù):GetLength得到字符串長(zhǎng)度GetAt得到指定位置處的字符operator+相當(dāng)于strcatvoidFormat(LPCTSTRIpszFormat,...);相當(dāng)于sprintfFind查找指定字符,字符串Compare比較CompareNoCase不區(qū)分大小寫比較MakeUpper改為小寫MakeLower改為大寫CStringAn-ay:用來(lái)表示可變長(zhǎng)度的字符串?dāng)?shù)組。數(shù)組中每ー個(gè)元素為CString對(duì)象的實(shí)例。下面介紹幾個(gè)成員函數(shù):Add增加CStringRemoveAt刪除指定位置CString對(duì)象RemoveAl!刪除數(shù)組中所有CString對(duì)象GetAt得到指定位置的CString對(duì)象SetAt修改指定位置的CString對(duì)象InsertAt在某一位置插入CString對(duì)象常用宏RGBTRACEASSERTVERIFY常用函數(shù)CWindApp*AfxGetAppO;HINSTANCEAfxGetInstanceHandle();H1NSTANCEAfxGetResourceHandle();intAfxMessageBox(LPCTSTRIpszText,UINTnType=MB_OK,UINTnIDHelp=0);用于彈出ー個(gè)消息框和GUI有關(guān)的各種對(duì)象在Windows中有各種GU!対象(不要和C++對(duì)象混淆),當(dāng)你在進(jìn)行繪圖就需要利用這些對(duì)象。而各種對(duì)象都擁有各種屬性,下面分別講述各種GUI對(duì)象和擁有的屬性。字體對(duì)象CFont用于輸出文字時(shí)選用不同風(fēng)格和大小的字體??蛇x擇的風(fēng)格包括:是否為斜體,是否為粗體,字體名稱,是否有下劃線等。顏色和背景色不屬于字體的屬性。關(guān)于如何創(chuàng)建和使用字體在2.2在窗口中輸出文字中會(huì)詳細(xì)講解。刷子CBrush對(duì)象決定填充區(qū)域時(shí)所采用的顏色或模板。對(duì)于一個(gè)固定色的刷子來(lái)講它的屬性為顏色,是否采用網(wǎng)格和網(wǎng)格的類型如水平的,垂直的,交叉的等。你也可以利用8*8的位圖來(lái)創(chuàng)建一個(gè)自定義模板的刷子,在使用這種刷子填充時(shí)系統(tǒng)會(huì)利用位圖逐步填充區(qū)域。關(guān)于如何創(chuàng)建和使用刷子在2.3使用刷子,筆進(jìn)行繪圖中會(huì)詳細(xì)講解。畫(huà)筆CPen對(duì)象在畫(huà)點(diǎn)和畫(huà)線時(shí)有用。它的屬性包括顏色,寬度,線的風(fēng)格,如虛線,實(shí)線,點(diǎn)劃線等。關(guān)于如何創(chuàng)建和使用畫(huà)筆在2.3使用刷子,筆進(jìn)行繪圖中會(huì)詳細(xì)講解。位圖CBitm叩對(duì)象可以包含一幅圖像,可以保存在資源中。關(guān)于如何使用位圖在2.4在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無(wú)關(guān)位圖中會(huì)詳細(xì)講解。還有一種特殊的GU!對(duì)象是多邊形,利用多邊形可以很好的限制作圖區(qū)域或是改變窗口外型。關(guān)于如何創(chuàng)建和使用多邊形在2.6多邊形和剪貼區(qū)域中會(huì)詳細(xì)講解。在Windows中使用GUI對(duì)象必須遵守一定的規(guī)則。首先需要?jiǎng)?chuàng)建一個(gè)合法的對(duì)象,不同的對(duì)象創(chuàng)建方法不同。然后需要將該GUI對(duì)象選入DC中,同時(shí)保存DC中原來(lái)的GUI對(duì)象。如果選入ー個(gè)非法的對(duì)象將會(huì)引起異常。在使用完后應(yīng)該恢復(fù)原來(lái)的對(duì)象,這一點(diǎn)特別重要,如果保存一個(gè)臨時(shí)對(duì)象在DC中,而在臨時(shí)對(duì)象被銷毀后可能引起異常。有一點(diǎn)必須注意,每ー個(gè)對(duì)象在重新創(chuàng)建前必須銷毀,下面的代碼演示了這一種安全的使用方法:OnDraw(CDC*pDC)CPenpenl,pen2;pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));〃創(chuàng)建對(duì)象pen2.CreatePen(PS_SOLID2RGB(128,128,0));〃創(chuàng)建對(duì)象CPen*pPenOld=(CPen*)pDC->SelectObject(&penl);〃選擇對(duì)象進(jìn)DCdrawWithPeni...(CPen*)pDC->SelectObject(&pen2);〃選擇對(duì)象進(jìn)DCdrawWithPen2...pen1.DeleteObject。;//再次創(chuàng)建前先銷毀pen1.CreatePen(PS_SOLID2RGB(0,0,0));〃再次創(chuàng)建對(duì)象(CPen*)pDC?>SelectObject(&penl);〃選擇對(duì)象進(jìn)DCdrawWithPeni...pDC?>SelectObject(pOldPen);〃恢復(fù)

此外系統(tǒng)中還擁有一些庫(kù)存GUI對(duì)象,你可以利用CDC::SelectStockObject(SelectStockObject(intnlndex)選入這些對(duì)象,它們包括ー些固定顏色的刷子,畫(huà)筆和一些基本字體。BLACK_BRUSHBlackbrush.DKGRAY.BRUSHDarkgraybrush.GRAY.BRUSHGraybrush.HOLLOW_BRUSHHollowbrush.LTGRAY.BRUSHLightgraybrush.NULL_BRUSHNullbrush.WHITE_BRUSHWhitebrush.BLACK_PENBlackpen.NULL.PENNullpen.WHITE_PENWhitepen.ANSLFIXED_FONTANSIfixedsystemfont.ANSI_VAR_FONTANSIvariablesystemfont.DEVICE_DEFAULT_FONTDevice-dependentfont.OEM_FIXED_FONTOEM-dependentfixedfont.SYSTEM_FONTThesystemfont.Bydefault,Windowsusesthesystemfonttodrawmenus,dialog-boxcontrols,andothertext.InWindowsversions3.0andlater,thesystemfontisproportionalwidth;earlierversionsofWindowsuseafixed-widthsystemfont.SYSTEM_FIXED_FONTThefixed-widthsystemfontusedinWindowspriortoversion3.0.ThisobjectisavailableforcompatibilitywithearlierversionsofWindows.DEFAULT_PALETTEDefaultcolorpalette.Thispaletteconsistsofthe20staticcolorsinthesystempalette.這些對(duì)象留在DC中是安全的,所以你可以利用選入庫(kù)存對(duì)象來(lái)作為恢復(fù)DC中GUI對(duì)象。大家可能都注意到了繪圖時(shí)都需要一個(gè)DC對(duì)象,DC(DeviceContext設(shè)備環(huán)境)對(duì)象是ー個(gè)抽象的作圖環(huán)境,可能是對(duì)應(yīng)屏幕,也可能是對(duì)應(yīng)打印機(jī)或其它。這個(gè)環(huán)境是設(shè)備無(wú)關(guān)的,所以你在對(duì)不同的設(shè)備輸出時(shí)只需要使用不同的設(shè)備環(huán)境就行了,而作圖方式可以完全不變。這也就是Windows耀眼的一點(diǎn)設(shè)備無(wú)關(guān)性。如同你將對(duì)一幅畫(huà)使用照相機(jī)或復(fù)印機(jī)將會(huì)產(chǎn)生不同的輸出,而不需要對(duì)畫(huà)進(jìn)行任何調(diào)整。DC的使用會(huì)穿插在本章中進(jìn)行介紹。

在窗口中輸出文字在這里我假定讀者己經(jīng)利用Applicationwizard生成了一個(gè)SD!界面的程序代碼。接下來(lái)的你只需要在CView派生類的OnDraw成員函數(shù)中加入繪圖代碼就可以了。在這里我需要解釋一下OnDraw函數(shù)的作用,OnDraw函數(shù)會(huì)在窗口需要重繪時(shí)自動(dòng)被調(diào)用,傳入的參數(shù)CDC*pDC對(duì)應(yīng)的就是DC環(huán)境。使用OnDraw的優(yōu)點(diǎn)就在于在你使用打印功能的時(shí)候傳入OnDraw的DC環(huán)境將會(huì)是打印機(jī)繪圖環(huán)境,使用打印預(yù)覽時(shí)傳入的是ー個(gè)稱為CPreviewDC的繪圖環(huán)境,所以你只需要一份代碼就可以完成窗口/打印預(yù)覽/打印機(jī)繪圖三重功能。利用Windows的設(shè)備無(wú)關(guān)性和乂$為打印預(yù)覽所編寫的上千行代碼你可以很容易的完成一個(gè)具有所見(jiàn)即所得的軟件。輸出文字一般使用CDC::BOOLTextOut(intx,inty,constCString&str)和CDC::intDrawText(constCString&str,LPRECTIpRect,UINTnFormat)兩個(gè)函數(shù),對(duì)TextOut來(lái)講只能輸出單行的文字,而DrawText可以指定在一個(gè)矩形中輸出單行或多行文字,并且可以規(guī)定對(duì)齊方式和使用何種風(fēng)格。nFormat可以是多種以下標(biāo)記的組合(利用位或操作)以達(dá)到選擇輸出風(fēng)格的目的。DT_BOTTOM底部對(duì)齊Specifiesbottom-justifiedtext.ThisvaluemustbecombinedwithDT.SINGLELINE.DT_CALCRECT計(jì)算指定文字時(shí)所需要矩形尺寸Determinesthewidthandheightoftherectangle.Iftherearemultiplelinesoftext,DrawTextwillusethewidthoftherectanglepointedtobyIpRectandextendthebaseoftherectangletoboundthelastlineoftext.Ifthereisonlyonelineoftext,DrawTextwillmodifytherightsideoftherectanglesothatitboundsthelastcharacterintheline.Ineithercase,DrawTextreturnstheheightoftheformattedtext,butdoesnotdrawthetext.DT.CENTER中部對(duì)齊Centerstexthorizontally.DT_END_ELLIPSISorDT_PATH_ELLIPSISReplacespartofthegivenstringwithellipses,ifnecessary,sothattheresultfitsinthespecifiedrectangle.ThegivenstringisnotmodifiedunlesstheDT_MODIFYSTRINGflagisspecified.YoucanspecifyDT_END_ELLIPSIStoreplacecharactersattheendofthestring,orDT_PATH_ELLIPSIStoreplacecharactersinthemiddleofthestring.Ifthestringcontainsbackslash(\)characters,DT_PATH_ELLIPSISpreservesasmuchaspossibleofthetextafterthelastbackslash.DT_EXPANDTABSExpandstabcharacters.Thedefaultnumberofcharacterspertabiseight.DT_EXTERNALLEADINGIncludesthefont扌且externalleadinginthelineheight.Normally,externalleadingisnotincludedintheheightofalineoftext.DT_LEFT左對(duì)齊Alignstextflush-left.DT_MODIFYSTRINGModifiesthegivenstringtomatchthedisplayedtext.ThisflaghasnoeffectunlesstheDT_END_ELLIPSISorDT_PATH_ELLIPSISflagisspecified.NoteSomeuFormatflagcombinationscancausethepassedstringtobemodified.UsingDT_MODIFYSTRINGwitheitherDT_END_ELLIPSISorDT_PATH_ELLIPSISmaycausethestring

tobemodified,causinganassertionintheCStringoverride.DT_NOCLIPDrawswithoutclipping.DrawTextissomewhatfasterwhenDT_NOCLIPisused.DT_NOPREFIX禁止使用&前綴Turnsoffprocessingofprefixcharacters.Normally,DrawTextinterpretstheampersand(&)mnemonic-prefixcharacterasadirectivetounderscorethecharacterthatfollows,andthetwo-ampersand(&&)mnemonic-prefixcharactersasadirectivetoprintasingleampersand.ByspecifyingDT_NOPREFIX,thisprocessingisturnedoff.DT_PATH_ELL1PS1SDT.RIGHT右對(duì)齊Alignstextflush-right.DT_SINGLELINE單行輸出Specifiessinglelineonly.Carriagereturnsandlinefeedsdonotbreaktheline.DT_TABSTOP設(shè)置TAB字符所占寬度Setstabstops.Thehigh-orderbyteofnFormatisthenumberofcharactersforeachtab.Thedefaultnumberofcharacterspertabiseight.DT_TOP定部對(duì)齊Specifiestop-justifiedtext(singlelineonly).DT_VCENTER中部對(duì)齊Specifiesverticallycenteredtext(singlelineonly).DT_WORDBREAK每行只在單詞間被折行Specifiesword-breaking.LinesareautomaticallybrokenbetweenwordsifawordwouldextendpasttheedgeoftherectanglespecifiedbyIpRect.Acarriagereturn札inefeedsequencewillalsobreaktheline.在輸出文字時(shí)如果希望改變文字的顏色,你可以利用CDC::SetTextColor(COLORREFcrColor)進(jìn)行設(shè)置,如果你希望改變背景色就利用CDC::SetBkColor(COLORREFcrColor),很多時(shí)候你可能需要透明的背景色你可以利用CDC::SetBkMode(intnBkMode)設(shè)置,可接受的參數(shù)有OPAQUEBackgroundisfilledwiththecurrentbackgroundcolorbeforethetext,hatchedbrush,orpenisdrawn.Thisisthedefaultbackgroundmode.TRANSPARENTBackgroundisnotchangedbeforedrawing.接下來(lái)講講如何創(chuàng)建字體,你可以創(chuàng)建的字體有兩種:庫(kù)存字體CDC::CreateStockObject(intnlndex)和自定義字體。在創(chuàng)建非庫(kù)存字體時(shí)需要填充一個(gè)LOGFONT結(jié)構(gòu)并使用CFont::CreateFontIndirect(constLOGFONT*IpLogFont)(可以參考文章在同一系統(tǒng)中顯示GB字符和BIG5字符),或使用CFont::CreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbltalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRIpszFacename)其中的參數(shù)和LOGFONT中的分量有一定的對(duì)應(yīng)關(guān)系。下面分別講解參數(shù)的意義:nHeight字體高度(邏輯單位)等于零為缺省高度,否則取絕對(duì)值并和可用的字體高度進(jìn)行匹配。nWidth寬度(邏輯單位)如果為零則使用可用的橫縱比進(jìn)行匹配。nEscapement出口矢量與X軸間的角度nOrientation字體基線與X軸間的角度nWeight字體粗細(xì),可取以下值ConstantValueFW_DONTCARE0FW_THIN100FW_EXTRALIGHT200FW.ULTRALIGHT200FW.LIGHT300FW_NORMAL400FW_REGULAR400FW_MEDIUM500FW_SEMIBOLD600FW_DEMIBOLD600FW_BOLD700FW_EXTRABOLD800FW_ULTRABOLD800FW_BLACK900FW_HEAVY900bltalic是否為斜體bUnderline是否有下劃線cStrikeOut是否帶刪除線nCharSet指定字符集合,可取以下值ConstantValueANSI.CHARSET0DEFAULT_CHARSET1SYMBOL.CHARSET2SHIFTJIS_CHARSET128OEM.CHARSET255nOutPrecision輸出精度OUT_CHARACTER_PRECISOUT_STRING_PREC1SOUT_DEFAULT_PRECISOUT_STROKE_PRECISOUT_DEVICE_PRECISOUT_TT_PRECISOUT_RASTER_PREC1SnClipPrecision剪輯精度,可取以下值CLIP_CHARACTER_PRECISCLIP_MASKCL1P_DEFAULT_PREC1SCL1P_STROKE_PRECISCLIP.ENCAPSULATECLIP_TT_ALWAYSCLIP_LH_ANGLESnQuality輸出質(zhì)量,可取以下值DEFAULT_QUAL1TYAppearanceofthefontdoesnotmatter.DRAFT_QUALITYAppearanceofthefontislessimportantthanwhenPROOF_QUALITYisused.ForGDIrasterfonts,scalingisenabled.Bold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary.PROOF_QUALITYCharacterqualityofthefontismoreimportantthanexactmatchingofthelogical-fontattributes.ForGDIrasterfonts,scalingisdisabledandthefontclosestinsizeischosen.Bold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary.nPitchAndFamily字體間的間距IpszFacename指定字體名稱,為了得到系統(tǒng)所擁有的字體可以利用EmunFontFamiliesEx。(可以參考文章在同一系統(tǒng)中顯示GB字符和BIG5字符)此外可以利用CFontDialog來(lái)得到用戶選擇的字體的LOGFONT數(shù)據(jù)。最后我講ー下文本坐標(biāo)的計(jì)算,利用CDC::GetTextExtent(constCString&str)可以得到字符串的在輸出時(shí)所占用的寬度和高度,這樣就可以在手工輸出多行文字時(shí)使用正確的行距。另外如果需要更精確的對(duì)字體高度和寬度進(jìn)行計(jì)算就需要使用CDC::GetTextMetrics(LPTEXTMETR1CIpMetrics)該函數(shù)將會(huì)填充TEXTMETRIC結(jié)構(gòu),該結(jié)構(gòu)中的分量可以非常精確的描述字體的各種屬性。使用點(diǎn),刷子,筆進(jìn)行繪圖在Windows中畫(huà)點(diǎn)的方法很簡(jiǎn)單,只需要調(diào)用COLORREFCDC::SetPixel(intx,inty,COLORREFcrColor)就可以在指定點(diǎn)畫(huà)上指定顏色,同時(shí)返回原來(lái)的顏色。COLORREFCDC::GetPixel(intx,inty)可以得到指定點(diǎn)的顏色。在Windows中應(yīng)該少使用畫(huà)點(diǎn)的函數(shù),因?yàn)檫@樣做的執(zhí)行效率比較低。刷子和畫(huà)筆在Windows作圖中是使用最多的GUI對(duì)象,本節(jié)在講解刷子和畫(huà)筆使用方法的同時(shí)也講述ー寫基本作圖函數(shù)。在畫(huà)點(diǎn)或畫(huà)線時(shí)系統(tǒng)使用當(dāng)前DC中的畫(huà)筆,所以在創(chuàng)建畫(huà)筆后必須將其選入DCオ會(huì)在繪圖時(shí)產(chǎn)生效果。畫(huà)筆可以通過(guò)CPen對(duì)象來(lái)產(chǎn)生,通過(guò)調(diào)用CPen::CreatePen(intnPenStyle,intnWidth,COLORREFcrColor)來(lái)創(chuàng)建。其中nPenStyle指名畫(huà)筆的風(fēng)格,可取如下值:PS_SOLID實(shí)線Createsasolidpen.PS_DASH虛線,寬度必須為ーCreatesadashedpen.Validonlywhenthepenwidthis1orless,indeviceunits.PS_DOT點(diǎn)線,寬度必須為ーCreatesadottedpen.Validonlywhenthepenwidthis1orless,indeviceunits.PS_DASHDOT點(diǎn)劃線,寬度必須為ーCreatesapenwithalternatingdashesanddots.Validonlywhenthepenwidthis1orless,indeviceunits.PS_DASHDOTDOT雙點(diǎn)劃線,寬度必須為ーCreatesapenwithalternatingdashesanddoubledots.Validonlywhenthepenwidthis1orless,indeviceunits.PS_NULL空線,使用時(shí)什么也不會(huì)產(chǎn)生Createsanullpen.PS_ENDCAP_ROUND結(jié)束處為圓形Endcapsareround.PS_ENDCAP_SQUARE結(jié)束處為方形Endcapsaresquare.nWidth和crColor為線的寬度和顏色。刷子是在畫(huà)封閉曲線時(shí)用來(lái)填充的顏色,例如當(dāng)你畫(huà)圓形或方形時(shí)系統(tǒng)會(huì)用當(dāng)前的刷子對(duì)內(nèi)部進(jìn)行填充。刷子可利用CBrush對(duì)象產(chǎn)生。通過(guò)以下幾種函數(shù)創(chuàng)建刷子:BOOLCreateSolidBrush(COLORREFcrColor)1創(chuàng)建一種固定顏色的刷子BOOLCreateHatchBrush(intnlndex,COLORREFcrColor);創(chuàng)建指定顏色和網(wǎng)格的刷子,nlndex可取以下值:HS_BDIAGONALDownwardhatch(lefttoright)at45degreesHS_CROSSHorizontalandverticalcrosshatchHS_DIAGCROSSCrosshatchat45degreesHS_FDIAGONALUpwardhatch(lefttoright)at45degreesHS_HORIZONTALHorizontalhatchHS.VERTICALVerticalhatchBOOLCreatePattemBrush(CBitmap*pBitmap);創(chuàng)建以8*8位圖為模板的刷子在選擇了畫(huà)筆和刷子后就可以利用Windows的作圖函數(shù)進(jìn)行作圖了,基本的畫(huà)線函數(shù)有以下幾種CDC::MoveTo(intx,inty);改變當(dāng)前點(diǎn)的位置CDC::LineTo(intx,inty);畫(huà)一條由當(dāng)前點(diǎn)到參數(shù)指定點(diǎn)的線CDC::BOOLArc(LPCRECTIpRect,POINTptStart,POINTptEnd);畫(huà)弧線CDC::BOOLPolyline(LPPOINTIpPoints,intnCount);將多條線依次序連接基本的作圖函數(shù)有以下幾種:CDC::BOOLRectangle(LPCRECTIpRect)1矩形CDC::RoundRect(LPCRECTIpRect,POINTpoint);圓角矩形CDC::Draw3dRect(intx,inty,intex,intcy,COLORREFclrTopLeft,COLORREFclrBottomRight);3D邊框CDC::Chord(LPCRECTIpRect,POINTptStart,POINTptEnd);扇形CDC::Ellipse(LPCRECTIpRect):橢圓形CDC::Pie(LPCRECTIpRect,POINTptStart,POINTptEnd);CDC::Polygon(LPPOINTIpPoints,intnCount);多邊形對(duì)于矩形,圓形或類似的封閉曲線,系統(tǒng)會(huì)使用畫(huà)筆繪制邊緣,使用刷子填充內(nèi)部。如果你不希望填充或是畫(huà)出邊緣,你可以選入空刷子(NULL_PEN)或是(NULL-BRUSH)空筆。下面的代碼創(chuàng)建一條兩象素寬的實(shí)線并選入DC。并進(jìn)行簡(jiǎn)單的作圖:(CPenpen;pen.CreatePen(PS_SOLID,2,RGB(128,128,128));CPen*pOldPen=(CPen*)dc.SelectObject(&pen);dc.SelectStockObject(NULL一BRUSH);〃選入空刷子dc.Rectangle(CRect(0,0,20,20));〃畫(huà)矩形在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無(wú)關(guān)位圖在Windows中可以將預(yù)先準(zhǔn)備好的圖像復(fù)制到顯示區(qū)域中,這種內(nèi)存拷貝執(zhí)行起來(lái)是非常快的。在Windows中提供了兩種使用圖形拷貝的方法:通過(guò)設(shè)備相關(guān)位圖(DDB)和設(shè)備無(wú)關(guān)位圖(DIB)。DDB可以用MFC中的CBitmap來(lái)表示,而DDB一般是存儲(chǔ)在資源文件中,在加載時(shí)只需要通過(guò)資源ID號(hào)就可以將圖形裝入。BOOLCBitmap::LoadBitmap(UINTnIDResource)可以裝入指定DDB,但是在繪制時(shí)必須借助另一個(gè)和當(dāng)前繪圖DC兼容的內(nèi)存DC來(lái)進(jìn)行。通過(guò)CDC::BitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop)繪制圖形,同時(shí)指定光柵操作的類型。BitBlt可以將源DC中位圖復(fù)制到冃的DC中,其中前四個(gè)參數(shù)為目的區(qū)域的坐標(biāo),接下來(lái)是源DC指針,然后是源DC中的起始坐標(biāo),由于BitBIt為等比例復(fù)制,所以不需要再次指定長(zhǎng)寬,(StretchBlt可以進(jìn)行縮放)最后ー個(gè)參數(shù)為光柵操作的類型,可取以下值:BLACKNESS輸出區(qū)域?yàn)楹谏玊urnsalloutputblack.DSTINVERT反色輸出區(qū)域Invertsthedestinationbitmap.MERGECOPY在源和冃的間使用AND操作CombinesthepatternandthesourcebitmapusingtheBooleanANDoperator.MERGEPAINT在反色后的目的和源間使用OR操作Combinestheinvertedsourcebitm叩withthedestinationbitmapusingtheBooleanORoperator.NOTSRCCOPY將反色后的源拷貝到目的區(qū)Copiestheinvertedsourcebitmaptothedestination.PATINVERT源和目的間進(jìn)行XOR操作CombinesthedestinationbitmapwiththepatternusingtheBooleanXORoperator.SRCAND源和目的間進(jìn)行AND操作CombinespixelsofthedestinationandsourcebitmapsusingtheBooleanANDoperator.SRCCOPY復(fù)制源到目的區(qū)Copiesthesourcebitmaptothedestinationbitmap.SRCINVERT源和目的間進(jìn)行XOR操作CombinespixelsofthedestinationandsourcebitmapsusingtheBooleanXORoperator.SRCPAINT源和目的間進(jìn)行OR操作CombinespixelsofthedestinationandsourcebitmapsusingtheBooleanORoperator.WHITENESS輸出區(qū)域?yàn)榘咨玊urnsalloutputwhite.下面用代碼演示這種方法:CYourView::OnDraw(CDC*pDC)(CDCmemDC;〃定義ー個(gè)兼容DCmemDC.CreateCompatibleDC(pDC);〃創(chuàng)建DCCBitmapbmpDraw;bmpDraw.LoadBitmap(ID_BMP);〃裝入DDBCBitmap*pbmpOld二memDC.SelectObject(&bmpDraw);〃保存原有DDB,并選入新DDB入DCpDC->BilBlt(0,0,20,20,&memDC,0,0,SRCCOPY);〃將源DC中(0,0,20,20)復(fù)制到目的DC(0,0,20,20)pDC->BitBlt(20,20,40,40,&memDC,0,0,SRCAND);〃將源DC中(0,0,20,20)和目的DC(20,20,40,40)中區(qū)域進(jìn)行AND操作memDC.SelectObject(pbmpOld);〃選入原DDB(圖標(biāo)并不是ー個(gè)GDI對(duì)象,所以不需要選入DC)在MFC中沒(méi)有一個(gè)專門的圖標(biāo)類,因?yàn)閳D標(biāo)的操作比較簡(jiǎn)單,使用HICONCWinApp::LoadIcon(UINTnIDResource)或是HICONCWinApp::LoadStandardIcon(LPCTSTRIpszIconName)裝入后就可以利用BOOLCDC::DrawIcon(intx,inty,HICONhlcon)繪制。由于在圖標(biāo)中可以指定透明區(qū)域,所以在某些需要使用非規(guī)則圖形而且面積不大的時(shí)候使用圖標(biāo)會(huì)比較簡(jiǎn)單。下面給出簡(jiǎn)單的代碼:OnDraw(CDC*pDC)HICONhlcon1=AfxGetApp()->Loadlcon(lDI_11);HICONhIcon2=AfxGetApp()->LoadIcon(IDIJ2);pDC->DrawIcon(0,0,hlcon1);pDC->Drawlcon(0,40,hlcon2);Destroylcon(hlconl);Destroylcon(hlcon2);同樣在MFC也沒(méi)有提供ー個(gè)DIB的類,所以在使用DIB位圖時(shí)我們需要自己讀取位圖文件中的頭信息,并讀入數(shù)據(jù),并利用API函數(shù)StretchDIBits繪制。位圖文件以BITMAPFILEHEADER結(jié)構(gòu)開(kāi)始,然后是BITMAPINFOHEADER結(jié)構(gòu)和調(diào)色版信息和數(shù)據(jù),其實(shí)位圖格式是圖形格式中最簡(jiǎn)單的ー種,而且也是Windows可以理解的一種。我不詳細(xì)講解DIB位圖的結(jié)構(gòu),提供ー個(gè)CDib類供大家使用,這個(gè)類包含了基本的功能如:Load,Save,DraWo使用各種映射方式所謂的映射方式簡(jiǎn)單點(diǎn)講就是坐標(biāo)的安排方式,系統(tǒng)默認(rèn)的映射方式為MM_TEXT即X坐標(biāo)向右增加,丫坐標(biāo)向下增加,(0,0)在屏幕左上方,DC中的每一點(diǎn)就是屏幕上的ー個(gè)象素。也許你會(huì)認(rèn)為這種方式下是最好理解的,但是ー個(gè)點(diǎn)和象素對(duì)應(yīng)的關(guān)系在屏幕上看來(lái)是正常的,但到了打印機(jī)上就會(huì)很不正常。因?yàn)槲覀冏鲌D是以點(diǎn)為單位并且打印機(jī)的分辨率遠(yuǎn)遠(yuǎn)比顯示器高(800DPI800點(diǎn)每英寸)所以在打印機(jī)上圖形看起來(lái)就會(huì)很小。這樣就需要為打印另做ー套代碼而加大了工作量。如果每個(gè)點(diǎn)對(duì)應(yīng)0.1毫米那么在屏幕上的圖形就會(huì)和打印出來(lái)的圖形ー樣大小。通過(guò)intCDC::SetMapMode(intnMapMode)可以指定映射方式,可用的有以下幾種:MM_HIENGLISH每點(diǎn)對(duì)應(yīng)0.001英寸Eachlogicalunitisconvertedto0.001inch.Positivexistotheright;positiveyisup.MM_HIMETRIC每點(diǎn)對(duì)應(yīng)0.001毫米Eachlogicalunitisconvertedto0.01millimeter.Positivexistotheright;positiveyisup.MM_LOENGLISH每點(diǎn)對(duì)應(yīng)0.01英寸Eachlogicalunitisconvertedto0.01inch.Positivexistotheright;positiveyisup.MM_LOMETRIC每點(diǎn)對(duì)應(yīng)0.001毫米Eachlogicalunitisconvertedto0.1millimeter.Positivexistotheright;positiveyisup.MM_TEXT象素對(duì)應(yīng)Eachlogicalunitisconvertedto1devicepixel.Positivexistotheright;positiveyisdown.以上幾種映射默認(rèn)的原點(diǎn)在屏幕左上方。除MM_TEXT外都為X坐標(biāo)向右增加,Y坐標(biāo)向上增加,和自然坐標(biāo)是一致的。所以在作圖是要注意什么時(shí)候應(yīng)該使用負(fù)坐標(biāo)。而且以上的映射都是X?Y等比例的,即相同的長(zhǎng)度在X,Y軸上顯示的長(zhǎng)度都是相同的。另外的一種映射方式為MM.ANISOTROPIC,這種方式可以規(guī)定不同的長(zhǎng)寬比例。在設(shè)置這中映射方式后必須調(diào)用CSizeCDC::SetWindowExt(SIZEsize)和CSizeCDC::SetViewportExt(SIZEsize)來(lái)設(shè)定長(zhǎng)寬比例。系統(tǒng)會(huì)根據(jù)兩次設(shè)定的長(zhǎng)寬的比值來(lái)確定長(zhǎng)寬比例。下面給出一段代碼比較映射前后的長(zhǎng)寬比例:OnDraw(CDC*pDC)(CRectrcC1(200,0,400,200);pDC->FillSolidRect(rcCl,RGB(0,0,255));pDOSetM叩Mode(MM_ANISOTROPIC);CSizesizeO;sizeO=pDC->SetWindowExt(5,5);TRACE("winExt%d%d\nH,sizeO.cx,sizeO.cy);sizeO=pDC->SetViewportExt(5,10);TRACE("ViewExt%d%d\n,\sizeO.cx,sizeO.cy);CRectrcC(〇。200,20〇);pDC->FillSolidRect(rcC,RGB(0,128,0));)上面代碼在映射后畫(huà)出的圖形將是ー個(gè)長(zhǎng)方形。最后講講視原點(diǎn)(viewportorigin),你可以通過(guò)調(diào)用CPointCDC::SetViewportOrg(POINTpoint)重新設(shè)置原點(diǎn)的位置,這就相對(duì)于對(duì)坐標(biāo)進(jìn)行了位移。例如你將原點(diǎn)設(shè)置在(20,20)那么原來(lái)的(0,0)就變成了(-20,-20)。多邊形和剪貼區(qū)域多邊形也是ー個(gè)GDI對(duì)象,同樣遵守其他GDI對(duì)象的規(guī)則,只是通常都不將其選入DC中。在MFC中多邊形有CRgn表示。多邊形用來(lái)表示一個(gè)不同與矩形的區(qū)域,和矩形具有相似的操作。如:檢測(cè)某點(diǎn)是否在內(nèi)部,并操作等。此外還得到ー個(gè)包含此多邊形的最小矩形。下面介紹一下多邊形類的成員函數(shù):CreateRectRgn由矩形創(chuàng)建一個(gè)多邊形CreateEllipticRgn由橢圓創(chuàng)建一個(gè)多邊形CreatePolygonRgn創(chuàng)建一個(gè)有多個(gè)點(diǎn)圍成的多邊形PtlnRegion某點(diǎn)是否在內(nèi)部CombineRgn兩個(gè)多邊形相并EqualRgn兩個(gè)多邊形是否相等在本節(jié)中講演多邊形的意義在于重新在窗口中作圖時(shí)提高效率。因?yàn)橐l(fā)窗口重繪的原因是某個(gè)區(qū)域失效,而失效的區(qū)域用多邊形來(lái)表示。假設(shè)窗口大小為500*400當(dāng)上方的另ー個(gè)窗口從(0,0,10,10)移動(dòng)到(20,20,30,30)這時(shí)(0,0,10,10)區(qū)域就失效了,而你只需要重繪這部分區(qū)域而不是所有區(qū)域,這樣你程序的執(zhí)行效率就會(huì)提高。通過(guò)調(diào)用API函數(shù)intGetClipRgn(HDChdc,HRGNhrgn)就可以得到失效區(qū)域,但是一般用不著那么精確而只需得到包含該區(qū)域的最小矩形就可以了,所以可以利用intCDC::GetClipBox(LPRECTIpRect)完成這一功能。文檔視圖框架窗口間的關(guān)系和消息傳送規(guī)律在MFC中M$引入了文檔ー視結(jié)構(gòu)的概念,文檔相當(dāng)于數(shù)據(jù)容器,視相當(dāng)于查看數(shù)據(jù)的窗口或是和數(shù)據(jù)發(fā)生交互的窗口。(這ー結(jié)構(gòu)在MFC中的OLE,ODBC開(kāi)發(fā)時(shí)又得到更多的拓展)因此ー個(gè)完整的應(yīng)用一般由四個(gè)類組成:CWinApp應(yīng)用類,CFrameWnd窗口框架類,CDocument文檔類,CView視類。(VC6中支持創(chuàng)建不帶文檔ー視的應(yīng)用)在程序運(yùn)行時(shí)CWinApp將創(chuàng)建一個(gè)CFrameWnd框架窗口實(shí)例,而框架窗口將創(chuàng)建文檔模板,然后有文檔模板創(chuàng)建文檔實(shí)例和視實(shí)例,并將兩者關(guān)聯(lián)。一般來(lái)講我們只需對(duì)文檔和視進(jìn)行操作,框架的各種行為己經(jīng)被MFC安排好了而不需人為干預(yù),這也是乂$設(shè)計(jì)文檔ー視結(jié)構(gòu)的本意,讓我們將注意力放在完成任務(wù)上而從界面編寫中解放出來(lái)。在應(yīng)用中一個(gè)視對(duì)應(yīng)ー個(gè)文檔,但ー個(gè)文檔可以包含多個(gè)視。ー個(gè)應(yīng)用中只用ー個(gè)框架窗口,對(duì)多文檔界面來(lái)講可能有多個(gè)MDI子窗口。每ー個(gè)視都是ー個(gè)子窗口,在單文檔界面中父窗口即是框架窗口,在多文檔界面中父窗口為MDI子窗口。ー個(gè)多文檔應(yīng)用中可以包含多個(gè)文檔模板,ー個(gè)模板定義了一個(gè)文檔和一個(gè)或多個(gè)視之間的對(duì)應(yīng)關(guān)系-同一個(gè)文檔可以屬于多個(gè)模板,但ー個(gè)模板中只允許定義一個(gè)文檔。同樣ー個(gè)視也可以屬于多個(gè)文檔模板。(不知道我說(shuō)清楚沒(méi)有)接下來(lái)看看如何在程序中得到各種對(duì)象的指針:全局函數(shù)AfxGetApp可以得到CWinApp應(yīng)用類指針AfxGetApp()->m_pMainWnd為框架窗口指針在框架窗口中:CFrameWnd::GetActiveDocument得到當(dāng)前活動(dòng)文檔指針在框架窗口中:CFrameWnd::GetActiveView得到當(dāng)前活動(dòng)視指針在視中:CView::GetDocument得到對(duì)應(yīng)的文檔指針在文檔中:CDocument::GetFirstViewPosition,CDocument::GetNextView用來(lái)遍歷所有和文檔關(guān)聯(lián)的視。在文檔中:CDocument::

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論