(適合初學(xué)者)MFC基礎(chǔ)教程_第1頁
(適合初學(xué)者)MFC基礎(chǔ)教程_第2頁
(適合初學(xué)者)MFC基礎(chǔ)教程_第3頁
(適合初學(xué)者)MFC基礎(chǔ)教程_第4頁
(適合初學(xué)者)MFC基礎(chǔ)教程_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

(適合初學(xué)者)MFC基礎(chǔ)教程(適合初學(xué)者)MFC基礎(chǔ)教程(適合初學(xué)者)MFC基礎(chǔ)教程xxx公司(適合初學(xué)者)MFC基礎(chǔ)教程文件編號:文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計(jì),管理制度VisualC++/MFC初學(xué)教程

目錄

+--第一章VC入門

|HYPERLINK如何學(xué)好VC

|HYPERLINK理解Windows消息機(jī)制

|HYPERLINK利用VisualC++/MFC開發(fā)Windows程序的優(yōu)勢

|HYPERLINK利用MFC進(jìn)行開發(fā)的通用方法介紹

|HYPERLINKMFC中常用類,宏,函數(shù)介紹

+--第二章圖形輸出

|HYPERLINK和GUI有關(guān)的各種對象

|HYPERLINK在窗口中輸出文字

|HYPERLINK使用點(diǎn),刷子,筆進(jìn)行繪圖

|HYPERLINK在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無關(guān)位圖

|HYPERLINK使用各種映射方式

|HYPERLINK多邊形和剪貼區(qū)域

+--第三章文檔視結(jié)構(gòu)

|HYPERLINK文檔視圖框架窗口間的關(guān)系和消息傳送規(guī)律

|HYPERLINK接收用戶輸入

|HYPERLINK使用菜單

|HYPERLINK文檔,視,框架之間相互作用

|HYPERLINK利用序列化進(jìn)行文件讀寫

|HYPERLINKMFC中所提供的各種視類介紹

+--第四章窗口控件

|HYPERLINKButton

|HYPERLINKStaticBox

|HYPERLINKEditBox

|HYPERLINKScrollBar

|HYPERLINKListBox/CheckListBox

|HYPERLINKComboBox/ComboBoxEx

|HYPERLINKTreeCtrl

|HYPERLINKListCtrl

|HYPERLINKTabCtrl

|HYPERLINKToolBar

|HYPERLINKStatusBar

|HYPERLINKDialogBar

|HYPERLINK利用AppWizard創(chuàng)建并使用ToolBarStatusBarDialogBar

|HYPERLINKGeneralWindow

|HYPERLINK關(guān)于WM_NOTIFY的使用方法

+--第五章對話框

|HYPERLINK使用資源編輯器編輯對話框

|HYPERLINK創(chuàng)建有模式對話框

|HYPERLINK創(chuàng)建無模式對話框

|HYPERLINK在對話框中進(jìn)行消息映射

|HYPERLINK在對話框中進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)檢查

|HYPERLINK使用屬性對話框

|HYPERLINK使用通用對話框

|HYPERLINK建立以對話框?yàn)榛A(chǔ)的應(yīng)用

|HYPERLINK使用對話框作為子窗口

+--第六章網(wǎng)絡(luò)通信開發(fā)

|HYPERLINKWinSock介紹

|HYPERLINK利用WinSock進(jìn)行無連接的通信

+HYPERLINK利用WinSock建立有連接的通信

如何學(xué)好VC

這個問題很多朋友都問過我,當(dāng)然流汗是必須的,但同時(shí)如果按照某種思路進(jìn)行有計(jì)劃的學(xué)習(xí)就會起到更好的效果。萬事開頭難,為了幫助朋友們更快的掌握VC開發(fā),下面我將自己的一點(diǎn)體會講一下:1、需要有好的C/C++基礎(chǔ)。正所謂“磨刀不誤砍柴工”,最開始接觸VC時(shí)不要急于開始Windows程序開發(fā),而是應(yīng)該進(jìn)行一些字符界面程序的編寫。這樣做的目的主要是增加對語言的熟悉程度,同時(shí)也訓(xùn)練自己的思維和熟悉一些在編程中常犯的錯誤。更重要的是理解并能運(yùn)用C++的各種特性,這些在以后的開發(fā)中都會有很大的幫助,特別是利用MFC進(jìn)行開發(fā)的朋友對C++一定要能熟練運(yùn)用。2、理解Windows的消息機(jī)制,窗口句柄和其他GUI句柄的含義和用途。了解和MFC各個類功能相近的API函數(shù)。3、一定要理解MFC中消息映射的作用。4、訓(xùn)練自己在編寫代碼時(shí)不使用參考書而是使用HelpOnline。5、記住一些常用的消息名稱和參數(shù)的意義。6、學(xué)會看別人的代碼。7、多看書,少買書,買書前一定要慎重。8、閑下來的時(shí)候就看參考書。后面幾條是我個人的一點(diǎn)意見,你可以根據(jù)需要和自身的情況選用適用于自己的方法。此外我將一些我在選擇參考書時(shí)的原則:對于初學(xué)者:應(yīng)該選擇一些內(nèi)容比較全面的書籍,并且書籍中的內(nèi)容應(yīng)該以合理的方式安排,在使用該書時(shí)可以達(dá)到循序漸進(jìn)的效果,書中的代碼要有詳細(xì)的講解。盡量買翻譯的書,因?yàn)檫@些書一般都比較易懂,而且語言比較輕松。買書前一定要慎重如果買到不好用的書可能會對自己的學(xué)習(xí)積極性產(chǎn)生打擊。對于已經(jīng)掌握了VC的朋友:這種程度的開發(fā)者應(yīng)該加深自己對系統(tǒng)原理,技術(shù)要點(diǎn)的認(rèn)識。需要選擇一些對原理講解的比較透徹的書籍,這樣一來才會對新技術(shù)有更多的了解,最好書中對技術(shù)的應(yīng)用有一定的闡述。盡量選擇示范代碼必較精簡的書,可以節(jié)約銀子。此外最好涉獵一些輔助性的書籍。

HYPERLINK返回首頁理解Windows消息機(jī)制

Windows系統(tǒng)是一個消息驅(qū)動的OS,什么是消息呢我很難說得清楚,也很難下一個定義(誰在噓我),我下面從不同的幾個方面講解一下,希望大家看了后有一點(diǎn)了解。1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)。當(dāng)用戶進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí)系統(tǒng)都會發(fā)送消息到某一個窗口。例如當(dāng)菜單轉(zhuǎn)中之后會有WM_COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam))是命令的ID號,對菜單來講就是菜單ID。當(dāng)然用戶也可以定義自己的消息名稱,也可以利用自定義消息來發(fā)送通知和傳送數(shù)據(jù)。2、誰將收到消息:一個消息必須由一個窗口接收。在窗口的過程(WNDPROC)中可以對消息進(jìn)行分析,對自己感興趣的消息進(jìn)行處理。例如你希望對菜單選擇進(jìn)行處理那么你可以定義對WM_COMMAND進(jìn)行處理的代碼,如果希望在窗口中進(jìn)行圖形輸出就必須對WM_PAINT進(jìn)行處理。3、未處理的消息到那里去了:M$為窗口編寫了默認(rèn)的窗口過程,這個窗口過程將負(fù)責(zé)處理那些你不處理消息。正因?yàn)橛辛诉@個默認(rèn)窗口過程我們才可以利用Windows的窗口進(jìn)行開發(fā)而不必過多關(guān)注窗口各種消息的處理。例如窗口在被拖動時(shí)會有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。4、窗口句柄:說到消息就不能不說窗口句柄,系統(tǒng)通過窗口句柄來在整個系統(tǒng)中唯一標(biāo)識一個窗口,發(fā)送一個消息時(shí)必須指定一個窗口句柄表明該消息由那個窗口接收。而每個窗口都會有自己的窗口過程,所以用戶的輸入就會被正確的處理。例如有兩個窗口共用一個窗口過程代碼,你在窗口一上按下鼠標(biāo)時(shí)消息就會通過窗口一的句柄被發(fā)送到窗口一而不是窗口二。5、示例:下面有一段偽代碼演示如何在窗口過程中處理消息LONGyourWndProc(HWNDhWnd,UINTuMessageType,WPARAMwP,LPARAM){ switch(uMessageType) {.);.);.);.); if(id==quit) break; translateMessage(...);}當(dāng)該程序沒有消息通知時(shí)getMessage就不會返回,也就不會占用系統(tǒng)的CPU時(shí)間。下圖為消息投遞模式在16位的系統(tǒng)中系統(tǒng)中只有一個消息隊(duì)列,所以系統(tǒng)必須等待當(dāng)前任務(wù)處理消息后才可以發(fā)送下一消息到相應(yīng)程序,如果一個程序陷如死循環(huán)或是耗時(shí)操作時(shí)系統(tǒng)就會得不到控制權(quán)。這種多任務(wù)系統(tǒng)也就稱為協(xié)同式的多任務(wù)系統(tǒng)。就是這種系統(tǒng)。而32位的系統(tǒng)中每一運(yùn)行的程序都會有一個消息隊(duì)列,所以系統(tǒng)可以在多個消息隊(duì)列中轉(zhuǎn)換而不必等待當(dāng)前程序完成消息處理就可以得到控制權(quán)。這種多任務(wù)系統(tǒng)就稱為搶先式的多任務(wù)系統(tǒng)。Windows95/NT就是這種系統(tǒng)。HYPERLINK返回首頁利用VisualC++/MFC開發(fā)Windows程序的優(yōu)勢

MFC借助C++的優(yōu)勢為Windows開發(fā)開辟了一片新天地,同時(shí)也借助ApplicationWizzard使開發(fā)者擺脫離了那些每次都必寫基本代碼,借助ClassWizard和消息映射使開發(fā)者擺脫了定義消息處理時(shí)那種混亂和冗長的代碼段。更令人興奮的是利用C++的封裝功能使開發(fā)者擺脫Windows中各種句柄的困擾,只需要面對C++中的對象,這樣一來使開發(fā)更接近開發(fā)語言而遠(yuǎn)離系統(tǒng)。(但我個人認(rèn)為了解系統(tǒng)原理對開發(fā)很有幫助)正因?yàn)镸FC是建立在C++的基礎(chǔ)上,所以我強(qiáng)調(diào)C/C++語言基礎(chǔ)對開發(fā)的重要性。利用C++的封裝性開發(fā)者可以更容易理解和操作各種窗口對象;利用C++的派生性開發(fā)者可以減少開發(fā)自定義窗口的時(shí)間和創(chuàng)造出可重用的代碼;利用虛擬性可以在必要時(shí)更好的控制窗口的活動。而且C++本身所具備的超越C語言的特性都可以使開發(fā)者編寫出更易用,更靈活的代碼。在MFC中對消息的處理利用了消息映射的方法,該方法的基礎(chǔ)是宏定義實(shí)現(xiàn),通過宏定義將消息分派到不同的成員函數(shù)進(jìn)行處理。下面簡單講述一下這種方法的實(shí)現(xiàn)方法:代碼如下BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd) .){ switch(...) { .); break; .); } break; .);相當(dāng)于sprintf

Find查找指定字符,字符串

Compare比較

CompareNoCase不區(qū)分大小寫比較

MakeUpper改為小寫

MakeLower改為大寫CStringArray:用來表示可變長度的字符串?dāng)?shù)組。數(shù)組中每一個元素為CString對象的實(shí)例。下面介紹幾個成員函數(shù):Add增加CString

RemoveAt刪除指定位置CString對象

RemoveAll刪除數(shù)組中所有CString對象

GetAt得到指定位置的CString對象

SetAt修改指定位置的CString對象

InsertAt在某一位置插入CString對象常用宏RGBTRACEASSERTVERIFY

常用函數(shù)CWindApp*AfxGetApp();HINSTANCEAfxGetInstanceHandle();HINSTANCEAfxGetResourceHandle();intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);用于彈出一個消息框HYPERLINK返回首頁和GUI有關(guān)的各種對象

在Windows中有各種GUI對象(不要和C++對象混淆),當(dāng)你在進(jìn)行繪圖就需要利用這些對象。而各種對象都擁有各種屬性,下面分別講述各種GUI對象和擁有的屬性。字體對象CFont用于輸出文字時(shí)選用不同風(fēng)格和大小的字體。可選擇的風(fēng)格包括:是否為斜體,是否為粗體,字體名稱,是否有下劃線等。顏色和背景色不屬于字體的屬性。關(guān)于如何創(chuàng)建和使用字體在HYPERLINK在窗口中輸出文字中會詳細(xì)講解。刷子CBrush對象決定填充區(qū)域時(shí)所采用的顏色或模板。對于一個固定色的刷子來講它的屬性為顏色,是否采用網(wǎng)格和網(wǎng)格的類型如水平的,垂直的,交叉的等。你也可以利用8*8的位圖來創(chuàng)建一個自定義模板的刷子,在使用這種刷子填充時(shí)系統(tǒng)會利用位圖逐步填充區(qū)域。關(guān)于如何創(chuàng)建和使用刷子在HYPERLINK使用刷子,筆進(jìn)行繪圖中會詳細(xì)講解。畫筆CPen對象在畫點(diǎn)和畫線時(shí)有用。它的屬性包括顏色,寬度,線的風(fēng)格,如虛線,實(shí)線,點(diǎn)劃線等。關(guān)于如何創(chuàng)建和使用畫筆在HYPERLINK使用刷子,筆進(jìn)行繪圖中會詳細(xì)講解。位圖CBitmap對象可以包含一幅圖像,可以保存在資源中。關(guān)于如何使用位圖在HYPERLINK在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無關(guān)位圖中會詳細(xì)講解。還有一種特殊的GUI對象是多邊形,利用多邊形可以很好的限制作圖區(qū)域或是改變窗口外型。關(guān)于如何創(chuàng)建和使用多邊形在HYPERLINK多邊形和剪貼區(qū)域中會詳細(xì)講解。在Windows中使用GUI對象必須遵守一定的規(guī)則。首先需要創(chuàng)建一個合法的對象,不同的對象創(chuàng)建方法不同。然后需要將該GUI對象選入DC中,同時(shí)保存DC中原來的GUI對象。如果選入一個非法的對象將會引起異常。在使用完后應(yīng)該恢復(fù)原來的對象,這一點(diǎn)特別重要,如果保存一個臨時(shí)對象在DC中,而在臨時(shí)對象被銷毀后可能引起異常。有一點(diǎn)必須注意,每一個對象在重新創(chuàng)建前必須銷毀,下面的代碼演示了這一種安全的使用方法:OnDraw(CDC*pDC){ CPenpen1,pen2; (PS_SOLID,2,RGB(128,128,128));. (CPen*)pDC->SelectObject(&pen2);. ();. pDC->SelectObject(pOldPen);DKGRAY_BRUSH

Darkgraybrush.GRAY_BRUSH

Graybrush.HOLLOW_BRUSH

Hollowbrush.LTGRAY_BRUSH

Lightgraybrush.NULL_BRUSH

Nullbrush.WHITE_BRUSH

Whitebrush.BLACK_PEN

Blackpen.NULL_PEN

Nullpen.WHITE_PEN

Whitepen.ANSI_FIXED_FONT

ANSIfixedsystemfont.ANSI_VAR_FONT

ANSIvariablesystemfont.DEVICE_DEFAULT_FONT

Device-dependentfont.OEM_FIXED_FONT

OEM-dependentfixedfont.SYSTEM_FONT

Thesystemfont.Bydefault,Windowsusesthesystemfonttodrawmenus,dialog-boxcontrols,andothertext.InWindowsversionsandlater,thesystemfontisproportionalwidth;earlierversionsofWindowsuseafixed-widthsystemfont.SYSTEM_FIXED_FONT

Thefixed-widthsystemfontusedinWindowspriortoversion.ThisobjectisavailableforcompatibilitywithearlierversionsofWindows.DEFAULT_PALETTE

Defaultcolorpalette.Thispaletteconsistsofthe20staticcolorsinthesystempalette.這些對象留在DC中是安全的,所以你可以利用選入庫存對象來作為恢復(fù)DC中GUI對象。大家可能都注意到了繪圖時(shí)都需要一個DC對象,DC(DeviceContext設(shè)備環(huán)境)對象是一個抽象的作圖環(huán)境,可能是對應(yīng)屏幕,也可能是對應(yīng)打印機(jī)或其它。這個環(huán)境是設(shè)備無關(guān)的,所以你在對不同的設(shè)備輸出時(shí)只需要使用不同的設(shè)備環(huán)境就行了,而作圖方式可以完全不變。這也就是Windows耀眼的一點(diǎn)設(shè)備無關(guān)性。如同你將對一幅畫使用照相機(jī)或復(fù)印機(jī)將會產(chǎn)生不同的輸出,而不需要對畫進(jìn)行任何調(diào)整。DC的使用會穿插在本章中進(jìn)行介紹。HYPERLINK返回首頁在窗口中輸出文字

在這里我假定讀者已經(jīng)利用ApplicationWizard生成了一個SDI界面的程序代碼。接下來的你只需要在CView派生類的OnDraw成員函數(shù)中加入繪圖代碼就可以了。在這里我需要解釋一下OnDraw函數(shù)的作用,OnDraw函數(shù)會在窗口需要重繪時(shí)自動被調(diào)用,傳入的參數(shù)CDC*pDC對應(yīng)的就是DC環(huán)境。使用OnDraw的優(yōu)點(diǎn)就在于在你使用打印功能的時(shí)候傳入OnDraw的DC環(huán)境將會是打印機(jī)繪圖環(huán)境,使用打印預(yù)覽時(shí)傳入的是一個稱為CPreviewDC的繪圖環(huán)境,所以你只需要一份代碼就可以完成窗口/打印預(yù)覽/打印機(jī)繪圖三重功能。利用Windows的設(shè)備無關(guān)性和M$為打印預(yù)覽所編寫的上千行代碼你可以很容易的完成一個具有所見即所得的軟件。輸出文字一般使用CDC::BOOLTextOut(intx,inty,constCString&str)和CDC::intDrawText(constCString&str,LPRECTlpRect,UINTnFormat)兩個函數(shù),對TextOut來講只能輸出單行的文字,而DrawText可以指定在一個矩形中輸出單行或多行文字,并且可以規(guī)定對齊方式和使用何種風(fēng)格。nFormat可以是多種以下標(biāo)記的組合(利用位或操作)以達(dá)到選擇輸出風(fēng)格的目的。DT_BOTTOM底部對齊

Specifiesbottom-justifiedtext.ThisvaluemustbecombinedwithDT_SINGLELINE.DT_CALCRECT計(jì)算指定文字時(shí)所需要矩形尺寸

Determinesthewidthandheightoftherectangle.Iftherearemultiplelinesoftext,DrawTextwillusethewidthoftherectanglepointedtobylpRectandextendthebaseoftherectangletoboundthelastlineoftext.Ifthereisonlyonelineoftext,DrawTextwillmodifytherightsideoftherectanglesothatitboundsthelastcharacterintheline.Ineithercase,DrawTextreturnstheheightoftheformattedtext,butdoesnotdrawthetext.DT_CENTER中部對齊

Centerstexthorizontally.DT_END_ELLIPSISorDT_PATH_ELLIPSIS

Replacespartofthegivenstringwithellipses,ifnecessary,sothattheresultfitsinthespecifiedrectangle.ThegivenstringisnotmodifiedunlesstheDT_MODIFYSTRINGflagisspecified.YoucanspecifyDT_END_ELLIPSIStoreplacecharactersattheendofthestring,orDT_PATH_ELLIPSIStoreplacecharactersinthemiddleofthestring.Ifthestringcontainsbackslash(\)characters,DT_PATH_ELLIPSISpreservesasmuchaspossibleofthetextafterthelastbackslash.DT_EXPANDTABS

Expandstabcharacters.Thedefaultnumberofcharacterspertabiseight.DT_EXTERNALLEADING

Includesthefont抯externalleadinginthelineheight.Normally,externalleadingisnotincludedintheheightofalineoftext.DT_LEFT左對齊

Alignstextflush-left.DT_MODIFYSTRING

Modifiesthegivenstringtomatchthedisplayedtext.ThisflaghasnoeffectunlesstheDT_END_ELLIPSISorDT_PATH_ELLIPSISflagisspecified.NoteSomeuFormatflagcombinationscancausethepassedstringtobemodified.UsingDT_MODIFYSTRINGwitheitherDT_END_ELLIPSISorDT_PATH_ELLIPSISmaycausethestringtobemodified,causinganassertionintheCStringoverride.DT_NOCLIP

Drawswithoutclipping.DrawTextissomewhatfasterwhenDT_NOCLIPisused.DT_NOPREFIX禁止使用&前綴

Turnsoffprocessingofprefixcharacters.Normally,DrawTextinterpretstheampersand(&)mnemonic-prefixcharacterasadirectivetounderscorethecharacterthatfollows,andthetwo-ampersand(&&)mnemonic-prefixcharactersasadirectivetoprintasingleampersand.ByspecifyingDT_NOPREFIX,thisprocessingisturnedoff.DT_PATH_ELLIPSIS

DT_RIGHT右對齊

Alignstextflush-right.DT_SINGLELINE單行輸出

Specifiessinglelineonly.Carriagereturnsandlinefeedsdonotbreaktheline.DT_TABSTOP設(shè)置TAB字符所占寬度

Setstabstops.Thehigh-orderbyteofnFormatisthenumberofcharactersforeachtab.Thedefaultnumberofcharacterspertabiseight.DT_TOP定部對齊

Specifiestop-justifiedtext(singlelineonly).DT_VCENTER中部對齊

Specifiesverticallycenteredtext(singlelineonly).DT_WORDBREAK每行只在單詞間被折行

Specifiesword-breaking.LinesareautomaticallybrokenbetweenwordsifawordwouldextendpasttheedgeoftherectanglespecifiedbylpRect.Acarriagereturn杔inefeedsequencewillalsobreaktheline.在輸出文字時(shí)如果希望改變文字的顏色,你可以利用CDC::SetTextColor(COLORREFcrColor)進(jìn)行設(shè)置,如果你希望改變背景色就利用CDC::SetBkColor(COLORREFcrColor),很多時(shí)候你可能需要透明的背景色你可以利用CDC::SetBkMode(intnBkMode)設(shè)置,可接受的參數(shù)有OPAQUE

Backgroundisfilledwiththecurrentbackgroundcolorbeforethetext,hatchedbrush,orpenisdrawn.Thisisthedefaultbackgroundmode.TRANSPARENT

Backgroundisnotchangedbeforedrawing.接下來講講如何創(chuàng)建字體,你可以創(chuàng)建的字體有兩種:庫存字體CDC::CreateStockObject(intnIndex)和自定義字體。

在創(chuàng)建非庫存字體時(shí)需要填充一個LOGFONT結(jié)構(gòu)并使用CFont::CreateFontIndirect(constLOGFONT*lpLogFont),或使用CFont::CreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFacename)其中的參數(shù)和LOGFONT中的分量有一定的對應(yīng)關(guān)系。下面分別講解參數(shù)的意義:nHeight字體高度(邏輯單位)等于零為缺省高度,否則取絕對值并和可用的字體高度進(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_HEAVY900

bItalic是否為斜體

bUnderline是否有下劃線

cStrikeOut是否帶刪除線

nCharSet指定字符集合,可取以下值ConstantValueANSI_CHARSET0DEFAULT_CHARSET1SYMBOL_CHARSET2SHIFTJIS_CHARSET128OEM_CHARSET255

nOutPrecision輸出精度OUT_CHARACTER_PRECISOUT_STRING_PRECISOUT_DEFAULT_PRECISOUT_STROKE_PRECISOUT_DEVICE_PRECISOUT_TT_PRECISOUT_RASTER_PRECIS

nClipPrecision剪輯精度,可取以下值CLIP_CHARACTER_PRECISCLIP_MASKCLIP_DEFAULT_PRECISCLIP_STROKE_PRECISCLIP_ENCAPSULATECLIP_TT_ALWAYSCLIP_LH_ANGLES

nQuality輸出質(zhì)量,可取以下值DEFAULT_QUALITY

Appearanceofthefontdoesnotmatter.DRAFT_QUALITY

AppearanceofthefontislessimportantthanwhenPROOF_QUALITYisused.ForGDIrasterfonts,scalingisenabled.Bold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary.PROOF_QUALITY

Characterqualityofthefontismoreimportantthanexactmatchingofthelogical-fontattributes.ForGDIrasterfonts,scalingisdisabledandthefontclosestinsizeischosen.Bold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary.nPitchAndFamily字體間的間距

lpszFacename指定字體名稱,為了得到系統(tǒng)所擁有的字體可以利用EmunFontFamiliesEx。此外可以利用CFontDialog來得到用戶選擇的字體的LOGFONT數(shù)據(jù)。最后我講一下文本坐標(biāo)的計(jì)算,利用CDC::GetTextExtent(constCString&str)可以得到字符串的在輸出時(shí)所占用的寬度和高度,這樣就可以在手工輸出多行文字時(shí)使用正確的行距。另外如果需要更精確的對字體高度和寬度進(jìn)行計(jì)算就需要使用CDC::GetTextMetrics(LPTEXTMETRIClpMetrics)該函數(shù)將會填充TEXTMETRIC結(jié)構(gòu),該結(jié)構(gòu)中的分量可以非常精確的描述字體的各種屬性。HYPERLINK返回首頁使用點(diǎn),刷子,筆進(jìn)行繪圖

在Windows中畫點(diǎn)的方法很簡單,只需要調(diào)用COLORREFCDC::SetPixel(intx,inty,COLORREFcrColor)就可以在指定點(diǎn)畫上指定顏色,同時(shí)返回原來的顏色。COLORREFCDC::GetPixel(intx,inty)可以得到指定點(diǎn)的顏色。在Windows中應(yīng)該少使用畫點(diǎn)的函數(shù),因?yàn)檫@樣做的執(zhí)行效率比較低。刷子和畫筆在Windows作圖中是使用最多的GUI對象,本節(jié)在講解刷子和畫筆使用方法的同時(shí)也講述一寫基本作圖函數(shù)。在畫點(diǎn)或畫線時(shí)系統(tǒng)使用當(dāng)前DC中的畫筆,所以在創(chuàng)建畫筆后必須將其選入DC才會在繪圖時(shí)產(chǎn)生效果。畫筆可以通過CPen對象來產(chǎn)生,通過調(diào)用CPen::CreatePen(intnPenStyle,intnWidth,COLORREFcrColor)來創(chuàng)建。其中nPenStyle指名畫筆的風(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í)什么也不會產(chǎn)生

Createsanullpen.PS_ENDCAP_ROUND結(jié)束處為圓形

Endcapsareround.PS_ENDCAP_SQUARE結(jié)束處為方形

Endcapsaresquare.nWidth和crColor為線的寬度和顏色。刷子是在畫封閉曲線時(shí)用來填充的顏色,例如當(dāng)你畫圓形或方形時(shí)系統(tǒng)會用當(dāng)前的刷子對內(nèi)部進(jìn)行填充。刷子可利用CBrush對象產(chǎn)生。通過以下幾種函數(shù)創(chuàng)建刷子:BOOLCreateSolidBrush(COLORREFcrColor);創(chuàng)建一種固定顏色的刷子BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);創(chuàng)建指定顏色和網(wǎng)格的刷子,nIndex可取以下值:HS_BDIAGONAL

Downwardhatch(lefttoright)at45degreesHS_CROSS

HorizontalandverticalcrosshatchHS_DIAGCROSS

Crosshatchat45degreesHS_FDIAGONAL

Upwardhatch(lefttoright)at45degreesHS_HORIZONTAL

HorizontalhatchHS_VERTICAL

VerticalhatchBOOLCreatePatternBrush(CBitmap*pBitmap);創(chuàng)建以8*8位圖為模板的刷子在選擇了畫筆和刷子后就可以利用Windows的作圖函數(shù)進(jìn)行作圖了,基本的畫線函數(shù)有以下幾種CDC::MoveTo(intx,inty);改變當(dāng)前點(diǎn)的位置CDC::LineTo(intx,inty);畫一條由當(dāng)前點(diǎn)到參數(shù)指定點(diǎn)的線CDC::BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);畫弧線CDC::BOOLPolyline(LPPOINTlpPoints,intnCount);將多條線依次序連接基本的作圖函數(shù)有以下幾種:CDC::BOOLRectangle(LPCRECTlpRect);矩形CDC::RoundRect(LPCRECTlpRect,POINTpoint);圓角矩形CDC::Draw3dRect(intx,inty,intcx,intcy,COLORREFclrTopLeft,COLORREFclrBottomRight);3D邊框CDC::Chord(LPCRECTlpRect,POINTptStart,POINTptEnd);扇形CDC::Ellipse(LPCRECTlpRect);橢圓形CDC::Pie(LPCRECTlpRect,POINTptStart,POINTptEnd);CDC::Polygon(LPPOINTlpPoints,intnCount);多邊形對于矩形,圓形或類似的封閉曲線,系統(tǒng)會使用畫筆繪制邊緣,使用刷子填充內(nèi)部。如果你不希望填充或是畫出邊緣,你可以選入空刷子(NULL_PEN)或是(NULL_BRUSH)空筆。下面的代碼創(chuàng)建一條兩象素寬的實(shí)線并選入DC。并進(jìn)行簡單的作圖:{... CPenpen; (PS_SOLID,2,RGB(128,128,128)); CPen*pOldPen=(CPen*)(&pen); (NULL_BRUSH);.}HYPERLINK返回首頁

在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無關(guān)位圖

在Windows中可以將預(yù)先準(zhǔn)備好的圖像復(fù)制到顯示區(qū)域中,這種內(nèi)存拷貝執(zhí)行起來是非??斓摹T赪indows中提供了兩種使用圖形拷貝的方法:通過設(shè)備相關(guān)位圖(DDB)和設(shè)備無關(guān)位圖(DIB)。DDB可以用MFC中的CBitmap來表示,而DDB一般是存儲在資源文件中,在加載時(shí)只需要通過資源ID號就可以將圖形裝入。BOOLCBitmap::LoadBitmap(UINTnIDResource)可以裝入指定DDB,但是在繪制時(shí)必須借助另一個和當(dāng)前繪圖DC兼容的內(nèi)存DC來進(jìn)行。通過CDC::BitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop)繪制圖形,同時(shí)指定光柵操作的類型。BitBlt可以將源DC中位圖復(fù)制到目的DC中,其中前四個參數(shù)為目的區(qū)域的坐標(biāo),接下來是源DC指針,然后是源DC中的起始坐標(biāo),由于BitBlt為等比例復(fù)制,所以不需要再次指定長寬,(StretchBlt可以進(jìn)行縮放)最后一個參數(shù)為光柵操作的類型,可取以下值:BLACKNESS輸出區(qū)域?yàn)楹谏?/p>

Turnsalloutputblack.DSTINVERT反色輸出區(qū)域

Invertsthedestinationbitmap.MERGECOPY在源和目的間使用AND操作

CombinesthepatternandthesourcebitmapusingtheBooleanANDoperator.MERGEPAINT在反色后的目的和源間使用OR操作

CombinestheinvertedsourcebitmapwiththedestinationbitmapusingtheBooleanORoperator.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)榘咨?/p>

Turnsalloutputwhite.下面用代碼演示這種方法:CYourView::OnDraw(CDC*pDC){ CDCmemDC;Positivexistotheright;positiveyisup.MM_HIMETRIC每點(diǎn)對應(yīng)毫米

Eachlogicalunitisconvertedtomillimeter.Positivexistotheright;positiveyisup.MM_LOENGLISH每點(diǎn)對應(yīng)英寸

Eachlogicalunitisconvertedtoinch.Positivexistotheright;positiveyisup.MM_LOMETRIC每點(diǎn)對應(yīng)毫米

Eachlogicalunitisconvertedtomillimeter.Positivexistotheright;positiveyisup.MM_TEXT象素對應(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等比例的,即相同的長度在X,Y軸上顯示的長度都是相同的。

DownLoadSample另外的一種映射方式為MM_ANISOTROPIC,這種方式可以規(guī)定不同的長寬比例。在設(shè)置這中映射方式后必須調(diào)用CSizeCDC::SetWindowExt(SIZEsize)和CSizeCDC::SetViewportExt(SIZEsize)來設(shè)定長寬比例。系統(tǒng)會根據(jù)兩次設(shè)定的長寬的比值來確定長寬比例。下面給出一段代碼比較映射前后的長寬比例:OnDraw(CDC*pDC){ CRectrcC1(200,0,400,200); pDC->FillSolidRect(rcC1,RGB(0,0,255)); pDC->SetMapMode(MM_ANISOTROPIC); CSizesizeO; sizeO=pDC->SetWindowExt(5,5); TRACE("winExt%d%d\n",,; sizeO=pDC->SetViewportExt(5,10); TRACE("ViewExt%d%d\n",,; CRectrcC(0,0,200,200); pDC->FillSolidRect(rcC,RGB(0,128,0));}上面代碼在映射后畫出的圖形將是一個長方形。

DownLoadSample最后講講視原點(diǎn)(viewportorigin),你可以通過調(diào)用CPointCDC::SetViewportOrg(POINTpoint)重新設(shè)置原點(diǎn)的位置,這就相對于對坐標(biāo)進(jìn)行了位移。例如你將原點(diǎn)設(shè)置在(20,20)那么原來的(0,0)就變成了(-20,-20)。HYPERLINK返回首頁多邊形和剪貼區(qū)域

多邊形也是一個GDI對象,同樣遵守其他GDI對象的規(guī)則,只是通常都不將其選入DC中。在MFC中多邊形有CRgn表示。多邊形用來表示一個不同與矩形的區(qū)域,和矩形具有相似的操作。如:檢測某點(diǎn)是否在內(nèi)部,并操作等。此外還得到一個包含此多邊形的最小矩形。下面介紹一下多邊形類的成員函數(shù):CreateRectRgn由矩形創(chuàng)建一個多邊形CreateEllipticRgn由橢圓創(chuàng)建一個多邊形CreatePolygonRgn創(chuàng)建一個有多個點(diǎn)圍成的多邊形PtInRegion某點(diǎn)是否在內(nèi)部CombineRgn兩個多邊形相并EqualRgn兩個多邊形是否相等在本節(jié)中講演多邊形的意義在于重新在窗口中作圖時(shí)提高效率。因?yàn)橐l(fā)窗口重繪的原因是某個區(qū)域失效,而失效的區(qū)域用多邊形來表示。假設(shè)窗口大小為500*400當(dāng)上方的另一個窗口從(0,0,10,10)移動到(20,20,30,30)這時(shí)(0,0,10,10)區(qū)域就失效了,而你只需要重繪這部分區(qū)域而不是所有區(qū)域,這樣你程序的執(zhí)行效率就會提高。通過調(diào)用API函數(shù)intGetClipRgn(HDChdc,HRGNhrgn)就可以得到失效區(qū)域,但是一般用不著那么精確而只需得到包含該區(qū)域的最小矩形就可以了,所以可以利用intCDC::GetClipBox(LPRECTlpRect)完成這一功能。

HYPERLINK返回首頁文檔視圖框架窗口間的關(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開發(fā)時(shí)又得到更多的拓展)因此一個完整的應(yīng)用一般由四個類組成:CWinApp應(yīng)用類,CFrameWnd窗口框架類,CDocument文檔類,CView視類。(VC6中支持創(chuàng)建不帶文檔-視的應(yīng)用)在程序運(yùn)行時(shí)CWinApp將創(chuàng)建一個CFrameWnd框架窗口實(shí)例,而框架窗口將創(chuàng)建文檔模板,然后有文檔模板創(chuàng)建文檔實(shí)例和視實(shí)例,并將兩者關(guān)聯(lián)。一般來講我們只需對文檔和視進(jìn)行操作,框架的各種行為已經(jīng)被MFC安排好了而不需人為干預(yù),這也是M$設(shè)計(jì)文檔-視結(jié)構(gòu)的本意,讓我們將注意力放在完成任務(wù)上而從界面編寫中解放出來。在應(yīng)用中一個視對應(yīng)一個文檔,但一個文檔可以包含多個視。一個應(yīng)用中只用一個框架窗口,對多文檔界面來講可能有多個MDI子窗口。每一個視都是一個子窗口,在單文檔界面中父窗口即是框架窗口,在多文檔界面中父窗口為MDI子窗口。一個多文檔應(yīng)用中可以包含多個文檔模板,一個模板定義了一個文檔和一個或多個視之間的對應(yīng)關(guān)系。同一個文檔可以屬于多個模板,但一個模板中只允許定義一個文檔。同樣一個視也可以屬于多個文檔模板。(不知道我說清楚沒有)接下來看看如何在程序中得到各種對象的指針:全局函數(shù)AfxGetApp可以得到CWinApp應(yīng)用類指針AfxGetApp()->m_pMainWnd為框架窗口指針在框架窗口中:CFrameWnd::GetActiveDocument得到當(dāng)前活動文檔指針在框架窗口中:CFrameWnd::GetActiveView得到當(dāng)前活動視指針在視中:CView::GetDocument得到對應(yīng)的文檔指針在文檔中:CDocument::GetFirstViewPosition,CDocument::GetNextView用來遍歷所有和文檔關(guān)聯(lián)的視。在文檔中:CDocument::GetDocTemplate得到文檔模板指針在多文檔界面中:CMDIFrameWnd::MDIGetActive得到當(dāng)前活動的MDI子窗口一般來講用戶輸入消息(如菜單選擇,鼠標(biāo),鍵盤等)會先發(fā)往視,如果視未處理則會發(fā)往框架窗口。所以定義消息映射時(shí)定義在視中就可以了,如果一個應(yīng)用同時(shí)擁有多個視而當(dāng)前活動視沒有對消息進(jìn)行處理則消息會發(fā)往框架窗口。

HYPERLINK返回首頁接收用戶輸入

在視中接收鼠標(biāo)輸入:鼠標(biāo)消息是我們常需要處理的消息,消息分為:鼠標(biāo)移動,按鈕按下/松開,雙擊。利用ClassWizard可以輕松的添加這幾種消息映射,下面分別講解每種消息的處理。WM_MOUSEMOVE對應(yīng)的函數(shù)為OnMouseMove(UINTnFlags,CPointpoint),nFlags表明了當(dāng)前一些按鍵的消息,你可以通過“位與”操作進(jìn)行檢測。MK_CONTROLCtrl鍵是否被按下

SetiftheCTRLkeyisdown.MK_LBUTTON鼠標(biāo)左鍵是否被按下

Setiftheleftmousebuttonisdown.MK_MBUTTON鼠標(biāo)中間鍵是否被按下

Setifthemiddlemousebuttonisdown.MK_RBUTTON鼠標(biāo)右鍵是否被按下

Setiftherightmousebuttonisdown.MK_SHIFTShift鍵是否被按下

SetiftheSHIFTkeyisdown.point表示當(dāng)前鼠標(biāo)的設(shè)備坐標(biāo),坐標(biāo)原點(diǎn)對應(yīng)視左上角。WM_LBUTTONDOWN/WM_RBUTTONDOWN(鼠標(biāo)左/右鍵按下)對應(yīng)的函數(shù)為OnLButtonDown/OnRButtonDown(UINTnFlags,CPointpoint)參數(shù)意義和OnMouseMove相同。WM_LBUTTONUP/WM_RBUTTONUP(鼠標(biāo)左/右鍵松開)對應(yīng)的函數(shù)為OnLButtonUp/OnRButtonUp(UINTnFlags,CPointpoint)參數(shù)意義和OnMouseMove相同。WM_LBUTTONDBLCLK/WM_RBUTTONDBLCLK(鼠標(biāo)左/右鍵雙擊)對應(yīng)的函數(shù)為OnLButtonDblClk/OnRButtonDblClk(UINTnFlags,CPointpoint)參數(shù)意義和OnMouseMove相同。下面我用一段偽代碼來講解一下這些消息的用法:代碼的作用是用鼠標(biāo)拉出一個矩形globalBOOLfDowned;.}OnMouseMove(UINTnFlags,CPointpoint){ if(fDowned) { DrawRect();.) 8Extendedkey,suchasafunctionkeyorakeyonthenumerickeypad(1ifitisanextendedkey).90Notused.112UsedinternallybyWindows.13Contextcode(1iftheALTkeyishelddownwhilethekeyispressed;otherwise0).14Previouskeystate(1ifthekeyisdownbeforethecall,0ifthekeyisup).15Transitionstate(1ifthekeyisbeingreleased,0ifthekeyisbeingpressed).HYPERLINK返回首頁

使用菜單

利用菜單接受用戶命令是一中很簡單的交互方法,同時(shí)也是一種很有效的方法。通常菜單作為一中資源存儲在文件中,因此我們可以在設(shè)計(jì)時(shí)就利用資源編輯器設(shè)計(jì)好一個菜單。關(guān)于使用VC設(shè)計(jì)菜單我就不再多講了,但你在編寫菜單時(shí)應(yīng)該盡量在屬性對話框的底部提示(Prompt)處輸入文字,這雖然不是必要的,但MFC在有狀態(tài)欄和工具條的情況下會使用該文字,文字的格式為“狀態(tài)欄出說明\n工具條提示”。

圖33_g1我們要面臨的任務(wù)是如何知道用戶何時(shí)選擇了菜單,他選的是什么菜單項(xiàng)。當(dāng)用戶選擇了一個有效的菜單項(xiàng)時(shí)系統(tǒng)會向應(yīng)用發(fā)送一個WM_COMMAND消息,在消息的參數(shù)中表明來源。在MFC中我們只需要進(jìn)行一次映射,將某一菜單ID映射到一處理函數(shù),圖33_g2。在這里我們在CView的派生類中處理菜單消息,同時(shí)我對同一ID設(shè)置兩個消息映射,接下來將這兩種映射的作用。

圖33_g2ON_COMMAND映射的作用為在用戶選擇該菜單時(shí)調(diào)用指定的處理函數(shù)。如:ON_COMMAND(IDM_COMMAND1,OnCommand1)會使菜單被選擇時(shí)調(diào)用OnCommand1成員函數(shù)。ON_UPDATE_COMMAND_UI(IDM_COMMAND1,OnUpdateCommand1)映射的作用是在菜單被顯示時(shí)通過調(diào)用指定的函數(shù)來進(jìn)行確定其狀態(tài)。在這個處理函數(shù)中你可以設(shè)置菜單的允許/禁止?fàn)顟B(tài),其顯示字符串是什么,是否在前面打鉤。函數(shù)的參數(shù)為CCmdUI*pCmdUI,CCmdUI是MFC專門為更新命令提供的一個類,你可以調(diào)用Enable設(shè)置允許/禁止?fàn)顟B(tài)SetCheck設(shè)置是否在前面打鉤SetText設(shè)置文字下面我講解一個例子:我在CView派生類中有一個變量m_fSelected,并且在視中處理兩個菜單的消息,當(dāng)IDM_COMMAND1被選時(shí),對m_fSelected進(jìn)行邏輯非操作,當(dāng)IDM_COMMAND2被選中時(shí)出一提示;同時(shí)IDM_COMMAND1根據(jù)m_fSelected決定菜單顯示的文字和是否在前面打上檢查符號,IDM_COMMAND2根據(jù)m_fSelected的值決定菜單的允許/禁止?fàn)顟B(tài)。下面是代碼和說明:下載示例代碼17KvoidCMenuDView::OnCommand1(){ m_fSelected=!m_fSelected; TRACE("command1selected\n");}voidCMenuDView::OnUpdateCommand1(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_fSelected);.("stringdesc");(...)HYPERLINK返回首頁文檔,視,框架之間相互作用

一般來說用戶的輸入/輸出基本都是通過視進(jìn)行,但一些例外的情況下可能需要和框架直接發(fā)生作用,而在多視的情況下如何在視之間傳遞數(shù)據(jù)。在使用菜單時(shí)大家會發(fā)現(xiàn)當(dāng)一個菜單沒有進(jìn)行映射處理時(shí)為禁止?fàn)顟B(tài),在多視的情況下菜單的狀態(tài)和處理映射是和當(dāng)前活動視相聯(lián)系的,這樣MFC可以保證視能正確的接收到各種消息,但有時(shí)候也會產(chǎn)生不便。有一個解決辦法就是在框架中對消息進(jìn)行處理,這樣也可以保證當(dāng)前文檔可以通過框架得到當(dāng)前消息。在用戶進(jìn)行輸入后如何使視的狀態(tài)得到更新這個問題在一個文檔對應(yīng)一個視圖時(shí)是不存在的,但是現(xiàn)在有一個文檔對應(yīng)了兩個視圖,當(dāng)在一個視上進(jìn)行了輸入時(shí)如何保證另一個視也得到通知呢MFC的做法是利用文檔來處理的,因?yàn)槲臋n管理著當(dāng)前和它聯(lián)系的視,由它來通知各個視是最合適的。讓我們同時(shí)看兩個函數(shù):voidCView::OnUpdate(CView*pSender,LPARAMlHint,CObject*pHint)voidCDocument::UpdateAllViews(CView*pSender,LPARAMlHint=0L,CObject*pHint=NULL)當(dāng)文檔的UpdateAllViews被調(diào)用時(shí)和此文檔相關(guān)的所有視的OnUpdate都會被調(diào)用,而參數(shù)lHint和pHint都會被傳遞。這樣一來發(fā)生改變視就可以通知其他的兄弟了。那么還有一個問題:如何在OnUpdate中知道是那個視圖發(fā)生了改變呢,這就可以利用pHint參數(shù),只要調(diào)用者將this指針賦值給參數(shù)就可以了,當(dāng)然完全可以利用該參數(shù)傳遞更復(fù)雜的結(jié)構(gòu)。視的初始化,當(dāng)一個文檔被打開或是新建一個文檔時(shí)視圖的CView::OnInitialUpdate()會被調(diào)用,你可以通過重載該函數(shù)對視進(jìn)行初始化,并在結(jié)束前調(diào)用父類的OnInitialUpdate,因?yàn)檫@樣可以保證OnUpdate會被調(diào)用。文檔中內(nèi)容的清除,當(dāng)文檔被關(guān)閉時(shí)(比如退出或是新建前上一個文檔清除)voidCDocument::DeleteContents()會被調(diào)用,你可以通過重載該函數(shù)來進(jìn)行清理工作。在單文檔結(jié)構(gòu)中上面兩點(diǎn)尤其重要,因?yàn)檐浖\(yùn)行文檔對象和視對象只會被產(chǎn)生并刪除一次。所以應(yīng)該將上面兩點(diǎn)和C++對象構(gòu)造和構(gòu)析分清楚。最后將一下文檔模板(DocTemplate)的作用,文檔模板分為兩類單文檔模板和多文檔模板,分別由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于記錄文檔,視,框架之間的對應(yīng)關(guān)系。還有一點(diǎn)就是模板可以記錄應(yīng)用程序可以打開的文件的類型,當(dāng)打開文件時(shí)會根據(jù)文檔模板中的信息選擇正確的文檔和視。模板是一個比較抽想的概念,一般來說是不需要我們直接進(jìn)行操作的。當(dāng)使用者通過視修改了數(shù)據(jù)時(shí),應(yīng)該調(diào)用GetDocument()->SetModifiedFlag(TRUE)通知文檔數(shù)據(jù)已經(jīng)被更新,這樣在關(guān)閉文檔時(shí)會自動詢問用戶是否保存數(shù)據(jù)。好象這一節(jié)講的有些亂,大家看后有什么想法和問題請?jiān)赩CHelp論壇上留言,我會盡快回復(fù)并且會對本節(jié)內(nèi)容重新整理和修改。HYPERLINK返回首頁

利用序列化進(jìn)行文件讀寫

在很多應(yīng)用中我們需要對數(shù)據(jù)進(jìn)行保存,或是從介質(zhì)上讀取數(shù)據(jù),這就涉及到文件的操作。我們可以利用各種文件存取方法完成這些工作,但MFC中也提供了一種讀寫文件的簡單方法——“序列化”。序列化機(jī)制通過更高層次的接口功能向開發(fā)者提供了更利于使用和透明于字節(jié)流的文件操縱方法,舉一個例來講你可以將一個字串寫入文件而不需要理會具體長度,讀出時(shí)也是一樣。你甚至可以對字符串?dāng)?shù)組進(jìn)行操作。在MFC提供的可自動分配內(nèi)存的類的支持下你可以更輕松的讀/寫數(shù)據(jù)。你也可以根據(jù)需要編寫你自己的具有序列化功能的類。序列化在最低的層次上應(yīng)該被需要序列化的類支持,也就是說如果你需要對一個類進(jìn)行序列化,那么這個類必須支持序列化。當(dāng)通過序列化進(jìn)行文件讀寫時(shí)你只需要該類的序列化函數(shù)就可以了。怎樣使類具有序列化功能呢你需要以下的工作:該類從CObject派生。在類聲明中包括DECLARE_SERIAL宏定義。提供一個缺省的構(gòu)造函數(shù)。在類中實(shí)現(xiàn)Serialze函數(shù)使用IMPLEMENT_SERIAL指明類名和版本號下面的代碼建立了一個簡單身份證記錄的類,同時(shí)也能夠支持序列化。inHstructstrPID{ charszName[10]; charszID[16]; structstrPID*pNext;};classCAllPID:publicCObject{public: DECLARE_SERIAL(CAllPID) CAllPID(); ~CAllPID(); 序列化相關(guān) structstrPID*pHead; }voidCYourDoc::Serialize(CArchive&ar){ if()) {BS_AUTORADIOBUTTON圓形選擇按鈕,按鈕的狀態(tài)會自動改變

Sameasaradiobutton,exceptthatwhentheuserselectsit,thebuttonautomaticallyhighlightsitselfandremovestheselectionfromanyotherradiobuttonswiththesamestyleinthesamegroup.BS_AUTO3STATE允許按鈕有三種狀態(tài)即:選中,未選中,未定

Sameasathree-statecheckbox,exceptthattheboxchangesitsstatewhentheuserselectsit.BS_CHECKBOX檢查框

Createsasmallsquarethathastextdisplayedtoitsright(unlessthisstyleiscombinedwiththeBS_LEFTTEXTstyle).BS_DEFPUSHBUTTON默認(rèn)普通按鈕

Createsabuttonthathasaheavyblackborder.TheusercanselectthisbuttonbypressingtheENTERkey.Thisstyleenablestheusertoquicklyselectthemostlikelyoption(thedefaultoption).BS_LEFTTEXT左對齊文字

Whencombinedwitharadio-buttonorcheck-boxstyle,thetextappearsontheleftsideoftheradiobuttonorcheckbox.BS_OWNERDRAW自繪按鈕

Createsanowner-drawnbutton.TheframeworkcallstheDrawItemmemberfunctionwhenavisualaspectofthebuttonhaschanged.ThisstylemustbesetwhenusingtheCBitmapButtonclass.BS_PUSHBUTTON普通按鈕

CreatesapushbuttonthatpostsaWM_COMMANDmessagetotheownerwindowwhentheuserselectsthebutton.BS_RADIOBUTTON圓形選擇按鈕

Createsasmallcirclethathastextdisplayedtoitsright(unlessthisstyleiscombinedwiththeBS_LEFTTEXTstyle).Radiobuttonsareusuallyusedingroupsofrelatedbutmutuallyexclus

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論