版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
(適合初學(xué)者)MFC基礎(chǔ)教程(適合初學(xué)者)MFC基礎(chǔ)教程(適合初學(xué)者)MFC基礎(chǔ)教程xxx公司(適合初學(xué)者)MFC基礎(chǔ)教程文件編號(hào):文件日期:修訂次數(shù):第1.0次更改批準(zhǔn)審核制定方案設(shè)計(jì),管理制度VisualC++/MFC初學(xué)教程
目錄
+--第一章VC入門(mén)
|HYPERLINK如何學(xué)好VC
|HYPERLINK理解Windows消息機(jī)制
|HYPERLINK利用VisualC++/MFC開(kāi)發(fā)Windows程序的優(yōu)勢(shì)
|HYPERLINK利用MFC進(jìn)行開(kāi)發(fā)的通用方法介紹
|HYPERLINKMFC中常用類(lèi),宏,函數(shù)介紹
+--第二章圖形輸出
|HYPERLINK和GUI有關(guān)的各種對(duì)象
|HYPERLINK在窗口中輸出文字
|HYPERLINK使用點(diǎn),刷子,筆進(jìn)行繪圖
|HYPERLINK在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無(wú)關(guān)位圖
|HYPERLINK使用各種映射方式
|HYPERLINK多邊形和剪貼區(qū)域
+--第三章文檔視結(jié)構(gòu)
|HYPERLINK文檔視圖框架窗口間的關(guān)系和消息傳送規(guī)律
|HYPERLINK接收用戶(hù)輸入
|HYPERLINK使用菜單
|HYPERLINK文檔,視,框架之間相互作用
|HYPERLINK利用序列化進(jìn)行文件讀寫(xiě)
|HYPERLINKMFC中所提供的各種視類(lèi)介紹
+--第四章窗口控件
|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的使用方法
+--第五章對(duì)話(huà)框
|HYPERLINK使用資源編輯器編輯對(duì)話(huà)框
|HYPERLINK創(chuàng)建有模式對(duì)話(huà)框
|HYPERLINK創(chuàng)建無(wú)模式對(duì)話(huà)框
|HYPERLINK在對(duì)話(huà)框中進(jìn)行消息映射
|HYPERLINK在對(duì)話(huà)框中進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)檢查
|HYPERLINK使用屬性對(duì)話(huà)框
|HYPERLINK使用通用對(duì)話(huà)框
|HYPERLINK建立以對(duì)話(huà)框?yàn)榛A(chǔ)的應(yīng)用
|HYPERLINK使用對(duì)話(huà)框作為子窗口
+--第六章網(wǎng)絡(luò)通信開(kāi)發(fā)
|HYPERLINKWinSock介紹
|HYPERLINK利用WinSock進(jìn)行無(wú)連接的通信
+HYPERLINK利用WinSock建立有連接的通信
如何學(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)行一些字符界面程序的編寫(xiě)。這樣做的目的主要是增加對(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è)類(lèi)功能相近的API函數(shù)。3、一定要理解MFC中消息映射的作用。4、訓(xùn)練自己在編寫(xiě)代碼時(shí)不使用參考書(shū)而是使用HelpOnline。5、記住一些常用的消息名稱(chēng)和參數(shù)的意義。6、學(xué)會(huì)看別人的代碼。7、多看書(shū),少買(mǎi)書(shū),買(mǎi)書(shū)前一定要慎重。8、閑下來(lái)的時(shí)候就看參考書(shū)。后面幾條是我個(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ì)的講解。盡量買(mǎi)翻譯的書(shū),因?yàn)檫@些書(shū)一般都比較易懂,而且語(yǔ)言比較輕松。買(mǎi)書(shū)前一定要慎重如果買(mǎi)到不好用的書(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ū)籍。
HYPERLINK返回首頁(yè)理解Windows消息機(jī)制
Windows系統(tǒng)是一個(gè)消息驅(qū)動(dòng)的OS,什么是消息呢我很難說(shuō)得清楚,也很難下一個(gè)定義(誰(shuí)在噓我),我下面從不同的幾個(gè)方面講解一下,希望大家看了后有一點(diǎn)了解。1、消息的組成:一個(gè)消息由一個(gè)消息名稱(chēng)(UINT),和兩個(gè)參數(shù)(WPARAM,LPARAM)。當(dāng)用戶(hù)進(jìn)行了輸入或是窗口的狀態(tài)發(fā)生改變時(shí)系統(tǒng)都會(huì)發(fā)送消息到某一個(gè)窗口。例如當(dāng)菜單轉(zhuǎn)中之后會(huì)有WM_COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam))是命令的ID號(hào),對(duì)菜單來(lái)講就是菜單ID。當(dāng)然用戶(hù)也可以定義自己的消息名稱(chē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、未處理的消息到那里去了:M$為窗口編寫(xiě)了默認(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ò)程,所以用戶(hù)的輸入就會(huì)被正確的處理。例如有兩個(gè)窗口共用一個(gè)窗口過(guò)程代碼,你在窗口一上按下鼠標(biāo)時(shí)消息就會(huì)通過(guò)窗口一的句柄被發(fā)送到窗口一而不是窗口二。5、示例:下面有一段偽代碼演示如何在窗口過(guò)程中處理消息LONGyourWndProc(HWNDhWnd,UINTuMessageType,WPARAMwP,LPARAM){ switch(uMessageType) {.);.);.);.); 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)也就稱(chēng)為協(xié)同式的多任務(wù)系統(tǒng)。就是這種系統(tǒng)。而32位的系統(tǒng)中每一運(yùn)行的程序都會(huì)有一個(gè)消息隊(duì)列,所以系統(tǒng)可以在多個(gè)消息隊(duì)列中轉(zhuǎn)換而不必等待當(dāng)前程序完成消息處理就可以得到控制權(quán)。這種多任務(wù)系統(tǒng)就稱(chēng)為搶先式的多任務(wù)系統(tǒng)。Windows95/NT就是這種系統(tǒng)。HYPERLINK返回首頁(yè)利用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ā)者擺脫離了那些每次都必寫(xiě)基本代碼,借助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ā)者編寫(xiě)出更易用,更靈活的代碼。在MFC中對(duì)消息的處理利用了消息映射的方法,該方法的基礎(chǔ)是宏定義實(shí)現(xiàn),通過(guò)宏定義將消息分派到不同的成員函數(shù)進(jìn)行處理。下面簡(jiǎn)單講述一下這種方法的實(shí)現(xiàn)方法:代碼如下BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd) .){ switch(...) { .); break; .); } break; .);相當(dāng)于sprintf
Find查找指定字符,字符串
Compare比較
CompareNoCase不區(qū)分大小寫(xiě)比較
MakeUpper改為小寫(xiě)
MakeLower改為大寫(xiě)CStringArray:用來(lái)表示可變長(zhǎng)度的字符串?dāng)?shù)組。數(shù)組中每一個(gè)元素為CString對(duì)象的實(shí)例。下面介紹幾個(gè)成員函數(shù):Add增加CString
RemoveAt刪除指定位置CString對(duì)象
RemoveAll刪除數(shù)組中所有CString對(duì)象
GetAt得到指定位置的CString對(duì)象
SetAt修改指定位置的CString對(duì)象
InsertAt在某一位置插入CString對(duì)象常用宏RGBTRACEASSERTVERIFY
常用函數(shù)CWindApp*AfxGetApp();HINSTANCEAfxGetInstanceHandle();HINSTANCEAfxGetResourceHandle();intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);用于彈出一個(gè)消息框HYPERLINK返回首頁(yè)和GUI有關(guān)的各種對(duì)象
在Windows中有各種GUI對(duì)象(不要和C++對(duì)象混淆),當(dāng)你在進(jìn)行繪圖就需要利用這些對(duì)象。而各種對(duì)象都擁有各種屬性,下面分別講述各種GUI對(duì)象和擁有的屬性。字體對(duì)象CFont用于輸出文字時(shí)選用不同風(fēng)格和大小的字體??蛇x擇的風(fēng)格包括:是否為斜體,是否為粗體,字體名稱(chēng),是否有下劃線(xiàn)等。顏色和背景色不屬于字體的屬性。關(guān)于如何創(chuàng)建和使用字體在HYPERLINK在窗口中輸出文字中會(huì)詳細(xì)講解。刷子CBrush對(duì)象決定填充區(qū)域時(shí)所采用的顏色或模板。對(duì)于一個(gè)固定色的刷子來(lái)講它的屬性為顏色,是否采用網(wǎng)格和網(wǎng)格的類(lèi)型如水平的,垂直的,交叉的等。你也可以利用8*8的位圖來(lái)創(chuàng)建一個(gè)自定義模板的刷子,在使用這種刷子填充時(shí)系統(tǒng)會(huì)利用位圖逐步填充區(qū)域。關(guān)于如何創(chuàng)建和使用刷子在HYPERLINK使用刷子,筆進(jìn)行繪圖中會(huì)詳細(xì)講解。畫(huà)筆CPen對(duì)象在畫(huà)點(diǎn)和畫(huà)線(xiàn)時(shí)有用。它的屬性包括顏色,寬度,線(xiàn)的風(fēng)格,如虛線(xiàn),實(shí)線(xiàn),點(diǎn)劃線(xiàn)等。關(guān)于如何創(chuàng)建和使用畫(huà)筆在HYPERLINK使用刷子,筆進(jìn)行繪圖中會(huì)詳細(xì)講解。位圖CBitmap對(duì)象可以包含一幅圖像,可以保存在資源中。關(guān)于如何使用位圖在HYPERLINK在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無(wú)關(guān)位圖中會(huì)詳細(xì)講解。還有一種特殊的GUI對(duì)象是多邊形,利用多邊形可以很好的限制作圖區(qū)域或是改變窗口外型。關(guān)于如何創(chuàng)建和使用多邊形在HYPERLINK多邊形和剪貼區(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ì)象被銷(xiāo)毀后可能引起異常。有一點(diǎn)必須注意,每一個(gè)對(duì)象在重新創(chuàng)建前必須銷(xiāo)毀,下面的代碼演示了這一種安全的使用方法: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.這些對(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)行介紹。HYPERLINK返回首頁(yè)在窗口中輸出文字
在這里我假定讀者已經(jīng)利用ApplicationWizard生成了一個(gè)SDI界面的程序代碼。接下來(lái)的你只需要在CView派生類(lèi)的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è)稱(chēng)為CPreviewDC的繪圖環(huán)境,所以你只需要一份代碼就可以完成窗口/打印預(yù)覽/打印機(jī)繪圖三重功能。利用Windows的設(shè)備無(wú)關(guān)性和M$為打印預(yù)覽所編寫(xiě)的上千行代碼你可以很容易的完成一個(gè)具有所見(jiàn)即所得的軟件。輸出文字一般使用CDC::BOOLTextOut(intx,inty,constCString&str)和CDC::intDrawText(constCString&str,LPRECTlpRect,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,DrawTextwillusethewidthoftherectanglepointedtobylpRectandextendthebaseoftherectangletoboundthelastlineoftext.Ifthereisonlyonelineoftext,DrawTextwillmodifytherightsideoftherectanglesothatitboundsthelastcharacterintheline.Ineithercase,DrawTextreturnstheheightoftheformattedtext,butdoesnotdrawthetext.DT_CENTER中部對(duì)齊
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左對(duì)齊
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右對(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.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.接下來(lái)講講如何創(chuàng)建字體,你可以創(chuàng)建的字體有兩種:庫(kù)存字體CDC::CreateStockObject(intnIndex)和自定義字體。
在創(chuàng)建非庫(kù)存字體時(shí)需要填充一個(gè)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中的分量有一定的對(duì)應(yīng)關(guān)系。下面分別講解參數(shù)的意義:nHeight字體高度(邏輯單位)等于零為缺省高度,否則取絕對(duì)值并和可用的字體高度進(jìn)行匹配。
nWidth寬度(邏輯單位)如果為零則使用可用的橫縱比進(jìn)行匹配。
nEscapement出口矢量與X軸間的角度
nOrientation字體基線(xiàn)與X軸間的角度
nWeight字體粗細(xì),可取以下值ConstantValueFW_DONTCARE0FW_THIN100FW_EXTRALIGHT200FW_ULTRALIGHT200FW_LIGHT300FW_NORMAL400FW_REGULAR400FW_MEDIUM500FW_SEMIBOLD600FW_DEMIBOLD600FW_BOLD700FW_EXTRABOLD800FW_ULTRABOLD800FW_BLACK900FW_HEAVY900
bItalic是否為斜體
bUnderline是否有下劃線(xiàn)
cStrikeOut是否帶刪除線(xiàn)
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指定字體名稱(chēng),為了得到系統(tǒng)所擁有的字體可以利用EmunFontFamiliesEx。此外可以利用CFontDialog來(lái)得到用戶(hù)選擇的字體的LOGFONT數(shù)據(jù)。最后我講一下文本坐標(biāo)的計(jì)算,利用CDC::GetTextExtent(constCString&str)可以得到字符串的在輸出時(shí)所占用的寬度和高度,這樣就可以在手工輸出多行文字時(shí)使用正確的行距。另外如果需要更精確的對(duì)字體高度和寬度進(jìn)行計(jì)算就需要使用CDC::GetTextMetrics(LPTEXTMETRIClpMetrics)該函數(shù)將會(huì)填充TEXTMETRIC結(jié)構(gòu),該結(jié)構(gòu)中的分量可以非常精確的描述字體的各種屬性。HYPERLINK返回首頁(yè)使用點(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í)也講述一寫(xiě)基本作圖函數(shù)。在畫(huà)點(diǎn)或畫(huà)線(xiàn)時(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í)線(xiàn)
Createsasolidpen.PS_DASH虛線(xiàn),寬度必須為一
Createsadashedpen.Validonlywhenthepenwidthis1orless,indeviceunits.PS_DOT點(diǎn)線(xiàn),寬度必須為一
Createsadottedpen.Validonlywhenthepenwidthis1orless,indeviceunits.PS_DASHDOT點(diǎn)劃線(xiàn),寬度必須為一
Createsapenwithalternatingdashesanddots.Validonlywhenthepenwidthis1orless,indeviceunits.PS_DASHDOTDOT雙點(diǎn)劃線(xiàn),寬度必須為一
Createsapenwithalternatingdashesanddoubledots.Validonlywhenthepenwidthis1orless,indeviceunits.PS_NULL空線(xiàn),使用時(shí)什么也不會(huì)產(chǎn)生
Createsanullpen.PS_ENDCAP_ROUND結(jié)束處為圓形
Endcapsareround.PS_ENDCAP_SQUARE結(jié)束處為方形
Endcapsaresquare.nWidth和crColor為線(xiàn)的寬度和顏色。刷子是在畫(huà)封閉曲線(xiàn)時(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);創(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位圖為模板的刷子在選擇了畫(huà)筆和刷子后就可以利用Windows的作圖函數(shù)進(jìn)行作圖了,基本的畫(huà)線(xiàn)函數(shù)有以下幾種CDC::MoveTo(intx,inty);改變當(dāng)前點(diǎn)的位置CDC::LineTo(intx,inty);畫(huà)一條由當(dāng)前點(diǎn)到參數(shù)指定點(diǎn)的線(xiàn)CDC::BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);畫(huà)弧線(xiàn)CDC::BOOLPolyline(LPPOINTlpPoints,intnCount);將多條線(xiàn)依次序連接基本的作圖函數(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);多邊形對(duì)于矩形,圓形或類(lèi)似的封閉曲線(xiàn),系統(tǒng)會(huì)使用畫(huà)筆繪制邊緣,使用刷子填充內(nèi)部。如果你不希望填充或是畫(huà)出邊緣,你可以選入空刷子(NULL_PEN)或是(NULL_BRUSH)空筆。下面的代碼創(chuàng)建一條兩象素寬的實(shí)線(xiàn)并選入DC。并進(jìn)行簡(jiǎn)單的作圖:{... CPenpen; (PS_SOLID,2,RGB(128,128,128)); CPen*pOldPen=(CPen*)(&pen); (NULL_BRUSH);.}HYPERLINK返回首頁(yè)
在窗口中繪制設(shè)備相關(guān)位圖,圖標(biāo),設(shè)備無(wú)關(guān)位圖
在Windows中可以將預(yù)先準(zhǔn)備好的圖像復(fù)制到顯示區(qū)域中,這種內(nèi)存拷貝執(zhí)行起來(lái)是非??斓摹T赪indows中提供了兩種使用圖形拷貝的方法:通過(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í)指定光柵操作的類(lèi)型。BitBlt可以將源DC中位圖復(fù)制到目的DC中,其中前四個(gè)參數(shù)為目的區(qū)域的坐標(biāo),接下來(lái)是源DC指針,然后是源DC中的起始坐標(biāo),由于BitBlt為等比例復(fù)制,所以不需要再次指定長(zhǎng)寬,(StretchBlt可以進(jìn)行縮放)最后一個(gè)參數(shù)為光柵操作的類(lèi)型,可取以下值: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)對(duì)應(yīng)毫米
Eachlogicalunitisconvertedtomillimeter.Positivexistotheright;positiveyisup.MM_LOENGLISH每點(diǎn)對(duì)應(yīng)英寸
Eachlogicalunitisconvertedtoinch.Positivexistotheright;positiveyisup.MM_LOMETRIC每點(diǎn)對(duì)應(yīng)毫米
Eachlogicalunitisconvertedtomillimeter.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)度都是相同的。
DownLoadSample另外的一種映射方式為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(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));}上面代碼在映射后畫(huà)出的圖形將是一個(gè)長(zhǎng)方形。
DownLoadSample最后講講視原點(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)。HYPERLINK返回首頁(yè)多邊形和剪貼區(qū)域
多邊形也是一個(gè)GDI對(duì)象,同樣遵守其他GDI對(duì)象的規(guī)則,只是通常都不將其選入DC中。在MFC中多邊形有CRgn表示。多邊形用來(lái)表示一個(gè)不同與矩形的區(qū)域,和矩形具有相似的操作。如:檢測(cè)某點(diǎn)是否在內(nèi)部,并操作等。此外還得到一個(gè)包含此多邊形的最小矩形。下面介紹一下多邊形類(lèi)的成員函數(shù):CreateRectRgn由矩形創(chuàng)建一個(gè)多邊形CreateEllipticRgn由橢圓創(chuàng)建一個(gè)多邊形CreatePolygonRgn創(chuàng)建一個(gè)有多個(gè)點(diǎn)圍成的多邊形PtInRegion某點(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(LPRECTlpRect)完成這一功能。
HYPERLINK返回首頁(yè)文檔視圖框架窗口間的關(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è)類(lèi)組成:CWinApp應(yīng)用類(lèi),CFrameWnd窗口框架類(lèi),CDocument文檔類(lèi),CView視類(lèi)。(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ù),這也是M$設(shè)計(jì)文檔-視結(jié)構(gòu)的本意,讓我們將注意力放在完成任務(wù)上而從界面編寫(xiě)中解放出來(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)用類(lèi)指針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::GetDocTemplate得到文檔模板指針在多文檔界面中:CMDIFrameWnd::MDIGetActive得到當(dāng)前活動(dòng)的MDI子窗口一般來(lái)講用戶(hù)輸入消息(如菜單選擇,鼠標(biāo),鍵盤(pán)等)會(huì)先發(fā)往視,如果視未處理則會(huì)發(fā)往框架窗口。所以定義消息映射時(shí)定義在視中就可以了,如果一個(gè)應(yīng)用同時(shí)擁有多個(gè)視而當(dāng)前活動(dòng)視沒(méi)有對(duì)消息進(jìn)行處理則消息會(huì)發(fā)往框架窗口。
HYPERLINK返回首頁(yè)接收用戶(hù)輸入
在視中接收鼠標(biāo)輸入:鼠標(biāo)消息是我們常需要處理的消息,消息分為:鼠標(biāo)移動(dòng),按鈕按下/松開(kāi),雙擊。利用ClassWizard可以輕松的添加這幾種消息映射,下面分別講解每種消息的處理。WM_MOUSEMOVE對(duì)應(yīng)的函數(shù)為OnMouseMove(UINTnFlags,CPointpoint),nFlags表明了當(dāng)前一些按鍵的消息,你可以通過(guò)“位與”操作進(jìn)行檢測(cè)。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)對(duì)應(yīng)視左上角。WM_LBUTTONDOWN/WM_RBUTTONDOWN(鼠標(biāo)左/右鍵按下)對(duì)應(yīng)的函數(shù)為OnLButtonDown/OnRButtonDown(UINTnFlags,CPointpoint)參數(shù)意義和OnMouseMove相同。WM_LBUTTONUP/WM_RBUTTONUP(鼠標(biāo)左/右鍵松開(kāi))對(duì)應(yīng)的函數(shù)為OnLButtonUp/OnRButtonUp(UINTnFlags,CPointpoint)參數(shù)意義和OnMouseMove相同。WM_LBUTTONDBLCLK/WM_RBUTTONDBLCLK(鼠標(biāo)左/右鍵雙擊)對(duì)應(yīng)的函數(shù)為OnLButtonDblClk/OnRButtonDblClk(UINTnFlags,CPointpoint)參數(shù)意義和OnMouseMove相同。下面我用一段偽代碼來(lái)講解一下這些消息的用法:代碼的作用是用鼠標(biāo)拉出一個(gè)矩形globalBOOLfDowned;.}OnMouseMove(UINTnFlags,CPointpoint){ if(fDowned) { DrawRect();.) 8Extendedkey,suchasafunctionkeyorakeyonthenumerickeypad(1ifitisanextendedkey).90Notused.112UsedinternallybyWindows.13Contextcode(1iftheALTkeyishelddownwhilethekeyispressed;otherwise0).14Previouskeystate(1ifthekeyisdownbeforethecall,0ifthekeyisup).15Transitionstate(1ifthekeyisbeingreleased,0ifthekeyisbeingpressed).HYPERLINK返回首頁(yè)
使用菜單
利用菜單接受用戶(hù)命令是一中很簡(jiǎn)單的交互方法,同時(shí)也是一種很有效的方法。通常菜單作為一中資源存儲(chǔ)在文件中,因此我們可以在設(shè)計(jì)時(shí)就利用資源編輯器設(shè)計(jì)好一個(gè)菜單。關(guān)于使用VC設(shè)計(jì)菜單我就不再多講了,但你在編寫(xiě)菜單時(shí)應(yīng)該盡量在屬性對(duì)話(huà)框的底部提示(Prompt)處輸入文字,這雖然不是必要的,但MFC在有狀態(tài)欄和工具條的情況下會(huì)使用該文字,文字的格式為“狀態(tài)欄出說(shuō)明\n工具條提示”。
圖33_g1我們要面臨的任務(wù)是如何知道用戶(hù)何時(shí)選擇了菜單,他選的是什么菜單項(xiàng)。當(dāng)用戶(hù)選擇了一個(gè)有效的菜單項(xiàng)時(shí)系統(tǒng)會(huì)向應(yīng)用發(fā)送一個(gè)WM_COMMAND消息,在消息的參數(shù)中表明來(lái)源。在MFC中我們只需要進(jìn)行一次映射,將某一菜單ID映射到一處理函數(shù),圖33_g2。在這里我們?cè)贑View的派生類(lèi)中處理菜單消息,同時(shí)我對(duì)同一ID設(shè)置兩個(gè)消息映射,接下來(lái)將這兩種映射的作用。
圖33_g2ON_COMMAND映射的作用為在用戶(hù)選擇該菜單時(shí)調(diào)用指定的處理函數(shù)。如:ON_COMMAND(IDM_COMMAND1,OnCommand1)會(huì)使菜單被選擇時(shí)調(diào)用OnCommand1成員函數(shù)。ON_UPDATE_COMMAND_UI(IDM_COMMAND1,OnUpdateCommand1)映射的作用是在菜單被顯示時(shí)通過(guò)調(diào)用指定的函數(shù)來(lái)進(jìn)行確定其狀態(tài)。在這個(gè)處理函數(shù)中你可以設(shè)置菜單的允許/禁止?fàn)顟B(tài),其顯示字符串是什么,是否在前面打鉤。函數(shù)的參數(shù)為CCmdUI*pCmdUI,CCmdUI是MFC專(zhuān)門(mén)為更新命令提供的一個(gè)類(lèi),你可以調(diào)用Enable設(shè)置允許/禁止?fàn)顟B(tài)SetCheck設(shè)置是否在前面打鉤SetText設(shè)置文字下面我講解一個(gè)例子:我在CView派生類(lèi)中有一個(gè)變量m_fSelected,并且在視中處理兩個(gè)菜單的消息,當(dāng)IDM_COMMAND1被選時(shí),對(duì)m_fSelected進(jìn)行邏輯非操作,當(dāng)IDM_COMMAND2被選中時(shí)出一提示;同時(shí)IDM_COMMAND1根據(jù)m_fSelected決定菜單顯示的文字和是否在前面打上檢查符號(hào),IDM_COMMAND2根據(jù)m_fSelected的值決定菜單的允許/禁止?fàn)顟B(tài)。下面是代碼和說(shuō)明:下載示例代碼17KvoidCMenuDView::OnCommand1(){ m_fSelected=!m_fSelected; TRACE("command1selected\n");}voidCMenuDView::OnUpdateCommand1(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_fSelected);.("stringdesc");(...)HYPERLINK返回首頁(yè)文檔,視,框架之間相互作用
一般來(lái)說(shuō)用戶(hù)的輸入/輸出基本都是通過(guò)視進(jìn)行,但一些例外的情況下可能需要和框架直接發(fā)生作用,而在多視的情況下如何在視之間傳遞數(shù)據(jù)。在使用菜單時(shí)大家會(huì)發(fā)現(xiàn)當(dāng)一個(gè)菜單沒(méi)有進(jìn)行映射處理時(shí)為禁止?fàn)顟B(tài),在多視的情況下菜單的狀態(tài)和處理映射是和當(dāng)前活動(dòng)視相聯(lián)系的,這樣MFC可以保證視能正確的接收到各種消息,但有時(shí)候也會(huì)產(chǎn)生不便。有一個(gè)解決辦法就是在框架中對(duì)消息進(jìn)行處理,這樣也可以保證當(dāng)前文檔可以通過(guò)框架得到當(dāng)前消息。在用戶(hù)進(jìn)行輸入后如何使視的狀態(tài)得到更新這個(gè)問(wèn)題在一個(gè)文檔對(duì)應(yīng)一個(gè)視圖時(shí)是不存在的,但是現(xiàn)在有一個(gè)文檔對(duì)應(yīng)了兩個(gè)視圖,當(dāng)在一個(gè)視上進(jìn)行了輸入時(shí)如何保證另一個(gè)視也得到通知呢MFC的做法是利用文檔來(lái)處理的,因?yàn)槲臋n管理著當(dāng)前和它聯(lián)系的視,由它來(lái)通知各個(gè)視是最合適的。讓我們同時(shí)看兩個(gè)函數(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都會(huì)被調(diào)用,而參數(shù)lHint和pHint都會(huì)被傳遞。這樣一來(lái)發(fā)生改變視就可以通知其他的兄弟了。那么還有一個(gè)問(wèn)題:如何在OnUpdate中知道是那個(gè)視圖發(fā)生了改變呢,這就可以利用pHint參數(shù),只要調(diào)用者將this指針賦值給參數(shù)就可以了,當(dāng)然完全可以利用該參數(shù)傳遞更復(fù)雜的結(jié)構(gòu)。視的初始化,當(dāng)一個(gè)文檔被打開(kāi)或是新建一個(gè)文檔時(shí)視圖的CView::OnInitialUpdate()會(huì)被調(diào)用,你可以通過(guò)重載該函數(shù)對(duì)視進(jìn)行初始化,并在結(jié)束前調(diào)用父類(lèi)的OnInitialUpdate,因?yàn)檫@樣可以保證OnUpdate會(huì)被調(diào)用。文檔中內(nèi)容的清除,當(dāng)文檔被關(guān)閉時(shí)(比如退出或是新建前上一個(gè)文檔清除)voidCDocument::DeleteContents()會(huì)被調(diào)用,你可以通過(guò)重載該函數(shù)來(lái)進(jìn)行清理工作。在單文檔結(jié)構(gòu)中上面兩點(diǎn)尤其重要,因?yàn)檐浖\(yùn)行文檔對(duì)象和視對(duì)象只會(huì)被產(chǎn)生并刪除一次。所以應(yīng)該將上面兩點(diǎn)和C++對(duì)象構(gòu)造和構(gòu)析分清楚。最后將一下文檔模板(DocTemplate)的作用,文檔模板分為兩類(lèi)單文檔模板和多文檔模板,分別由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于記錄文檔,視,框架之間的對(duì)應(yīng)關(guān)系。還有一點(diǎn)就是模板可以記錄應(yīng)用程序可以打開(kāi)的文件的類(lèi)型,當(dāng)打開(kāi)文件時(shí)會(huì)根據(jù)文檔模板中的信息選擇正確的文檔和視。模板是一個(gè)比較抽想的概念,一般來(lái)說(shuō)是不需要我們直接進(jìn)行操作的。當(dāng)使用者通過(guò)視修改了數(shù)據(jù)時(shí),應(yīng)該調(diào)用GetDocument()->SetModifiedFlag(TRUE)通知文檔數(shù)據(jù)已經(jīng)被更新,這樣在關(guān)閉文檔時(shí)會(huì)自動(dòng)詢(xún)問(wèn)用戶(hù)是否保存數(shù)據(jù)。好象這一節(jié)講的有些亂,大家看后有什么想法和問(wèn)題請(qǐng)?jiān)赩CHelp論壇上留言,我會(huì)盡快回復(fù)并且會(huì)對(duì)本節(jié)內(nèi)容重新整理和修改。HYPERLINK返回首頁(yè)
利用序列化進(jìn)行文件讀寫(xiě)
在很多應(yīng)用中我們需要對(duì)數(shù)據(jù)進(jìn)行保存,或是從介質(zhì)上讀取數(shù)據(jù),這就涉及到文件的操作。我們可以利用各種文件存取方法完成這些工作,但MFC中也提供了一種讀寫(xiě)文件的簡(jiǎn)單方法——“序列化”。序列化機(jī)制通過(guò)更高層次的接口功能向開(kāi)發(fā)者提供了更利于使用和透明于字節(jié)流的文件操縱方法,舉一個(gè)例來(lái)講你可以將一個(gè)字串寫(xiě)入文件而不需要理會(huì)具體長(zhǎng)度,讀出時(shí)也是一樣。你甚至可以對(duì)字符串?dāng)?shù)組進(jìn)行操作。在MFC提供的可自動(dòng)分配內(nèi)存的類(lèi)的支持下你可以更輕松的讀/寫(xiě)數(shù)據(jù)。你也可以根據(jù)需要編寫(xiě)你自己的具有序列化功能的類(lèi)。序列化在最低的層次上應(yīng)該被需要序列化的類(lèi)支持,也就是說(shuō)如果你需要對(duì)一個(gè)類(lèi)進(jìn)行序列化,那么這個(gè)類(lèi)必須支持序列化。當(dāng)通過(guò)序列化進(jìn)行文件讀寫(xiě)時(shí)你只需要該類(lèi)的序列化函數(shù)就可以了。怎樣使類(lèi)具有序列化功能呢你需要以下的工作:該類(lèi)從CObject派生。在類(lèi)聲明中包括DECLARE_SERIAL宏定義。提供一個(gè)缺省的構(gòu)造函數(shù)。在類(lèi)中實(shí)現(xiàn)Serialze函數(shù)使用IMPLEMENT_SERIAL指明類(lèi)名和版本號(hào)下面的代碼建立了一個(gè)簡(jiǎn)單身份證記錄的類(lèi),同時(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)會(huì)自動(dòng)改變
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左對(duì)齊文字
Whencombinedwitharadio-buttonorcheck-boxstyle,thetextappearsontheleftsideoftheradiobuttonorcheckbox.BS_OWNERDRAW自繪按鈕
Createsanowner-drawnbutton.TheframeworkcallstheDrawItemmemberfunctionwhenavisualaspectofthebuttonhaschanged.ThisstylemustbesetwhenusingtheCBitmapButtonclass.BS_PUSHBUTTON普通按鈕
CreatesapushbuttonthatpostsaWM_COMMANDmessagetotheownerwindowwhentheuserselectsthebutton.BS_RADIOBUTTON圓形選擇按鈕
Createsasmallcirclethathastextdisplayedtoitsright(unlessthisstyleiscombinedwiththeBS_LEFTTEXTstyle).Radiobuttonsareusuallyusedingroupsofrelatedbutmutuallyexclus
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度電動(dòng)車(chē)電瓶租賃與節(jié)能減排服務(wù)合同
- 施工現(xiàn)場(chǎng)施工防化學(xué)泄漏威脅制度
- 情緒管理在校園心理輔導(dǎo)中的實(shí)踐
- DB35T 2233-2024桂花無(wú)性繁殖技術(shù)規(guī)程
- 專(zhuān)業(yè)墊資抵押合同范本
- 中外合資企業(yè)合同
- 個(gè)人大額度借款合同細(xì)則
- 買(mǎi)賣(mài)合同爭(zhēng)議仲裁協(xié)議書(shū)模板
- 人事檔案委托保管合同
- 上海市某餐飲管理有限公司勞動(dòng)合同
- 湖北省武漢市2024-2025學(xué)年度高三元月調(diào)考英語(yǔ)試題(含答案無(wú)聽(tīng)力音頻有聽(tīng)力原文)
- 商務(wù)星球版地理八年級(jí)下冊(cè)全冊(cè)教案
- 天津市河西區(qū)2024-2025學(xué)年四年級(jí)(上)期末語(yǔ)文試卷(含答案)
- 北京市北京四中2025屆高三第四次模擬考試英語(yǔ)試卷含解析
- 2024年快遞行業(yè)無(wú)人機(jī)物流運(yùn)輸合同范本及法規(guī)遵循3篇
- 地下商業(yè)街的規(guī)劃設(shè)計(jì)
- 傷殘撫恤管理辦法實(shí)施細(xì)則
- 中國(guó)慢性冠脈綜合征患者診斷及管理指南2024版解讀
- 提升模組良率-六西格瑪
- DL-T+5196-2016火力發(fā)電廠(chǎng)石灰石-石膏濕法煙氣脫硫系統(tǒng)設(shè)計(jì)規(guī)程
- 2024-2030年中國(guó)產(chǎn)教融合行業(yè)市場(chǎng)運(yùn)營(yíng)態(tài)勢(shì)及發(fā)展前景研判報(bào)告
評(píng)論
0/150
提交評(píng)論