MFC編程講座.ppt_第1頁
MFC編程講座.ppt_第2頁
MFC編程講座.ppt_第3頁
MFC編程講座.ppt_第4頁
MFC編程講座.ppt_第5頁
已閱讀5頁,還剩86頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、MFC程序設(shè)計,一個優(yōu)秀的編程工具往往匹配一個功能強大的類庫,類庫封裝了大量Windows編程需要使用的函數(shù)和數(shù)據(jù)結(jié)構(gòu)。與Visual C+捆綁在一起的MFC(Microsoft Foundation Class)微軟基礎(chǔ)類就是這樣一個由Microsoft公司設(shè)計的類庫。,MFC概述,類庫是一個可以在應(yīng)用程序中使用的相互關(guān)聯(lián)的C+類的集合。 MFC作為一個Windows編程類庫,它包含了200多個類,封裝了Windows的大部分編程對象以及與它們有關(guān)的操作。,雖然程序在功能上千差萬別,但從本質(zhì)上看,都可以分為用戶界面設(shè)計、文件操作、數(shù)據(jù)庫訪問及多媒體使用等幾部分,這些都可以通過一些類來實現(xiàn)。M

2、FC提供了一個標準化的程序結(jié)構(gòu),使開發(fā)人員不必從頭設(shè)計一個Windows應(yīng)用程序。 MFC實際上是一個龐大的文件庫,它由幾百個執(zhí)行文件和源代碼文件(如H文件)組成。,MFC微軟基礎(chǔ)類,利用Windows API開發(fā)程序的用戶有這樣的體會,即使開發(fā)一個簡單的Windows應(yīng)用程序也需要對Windows的編程原理有很深刻的認識,需要手工編寫冗長的代碼。由于程序的出錯率是隨著代碼長度的增加呈幾何級數(shù)增長的,而且當程序長度逐漸膨脹時,調(diào)試程序會變得越來越困難。因此,傳統(tǒng)的Windows應(yīng)用程序設(shè)計需要程序員有極大的耐心和豐富的編程經(jīng)驗。,因為Visual C+捆綁了微軟的基礎(chǔ)類MFC,所以編程時我們就

3、可以利用類的可重用性和可擴充性,大大降低Windows應(yīng)用程序設(shè)計的難度和工作量。,采用MFC編程的優(yōu)點:,使用標準化的程序代碼結(jié)構(gòu),有利于程序員之間的交流。 Visual C+為MFC提供了大量的工具支持,提高了編程效率。如利用MFC AppWizard創(chuàng)建MFC應(yīng)用程序框架,利用ClassWizard方便地對Windows消息進行管理。,MFC應(yīng)用程序的效率較高,只比傳統(tǒng)的Windows C程序低5%左右。并且,在MFC應(yīng)用程序中還允許混合使用傳統(tǒng)的Windows API函數(shù)。 其它優(yōu)勢:完全支持Windows所有的函數(shù)、控件、消息、菜單及對話框;具有良好的穩(wěn)定性和可移植性,更符合微軟的風

4、格等。,采用MFC方式編程提高了Windows應(yīng)用程序的開發(fā)效率,但由于MFC應(yīng)用程序結(jié)構(gòu)的復(fù)雜性和透明性,要想完全掌握MFC應(yīng)用程序的內(nèi)部機制需要付出很大的努力。 認識MFC只是一個過程、一個手段,最終目的是為了良好并熟練地運用MFC。,Windows編程機制,Windows是一個多進程的圖形窗口操作系統(tǒng),Windows應(yīng)用程序與DOS應(yīng)用程序有很大的區(qū)別。DOS應(yīng)用程序采用順序執(zhí)行過程,而Windows是一個基于事件的消息(Message)驅(qū)動系統(tǒng)。,Windows應(yīng)用程序是按照“事件消息處理”非順序的機制運行。當有某個事件(如單擊鼠標、鍵盤輸入和執(zhí)行菜單命令等)發(fā)生時,Windows會根

5、據(jù)具體的事件產(chǎn)生對應(yīng)的消息,并發(fā)送到指定應(yīng)用程序的消息隊列;應(yīng)用程序從消息隊列中取出消息,并根據(jù)不同的消息進行不同的處理。,事件和消息,所謂消息就是用于描述某個事件發(fā)生的信息,而事件是對于Windows的某種操作。 事件和消息密切相關(guān),事件是因,消息是果,事件產(chǎn)生消息,消息對應(yīng)事件。所謂消息的響應(yīng),其實質(zhì)就是事件的響應(yīng)。,消息驅(qū)動是Windows應(yīng)用程序的核心,所有的外部響應(yīng)(如鍵盤、鼠標和計時器等)都被Windows先攔截,轉(zhuǎn)換成消息后再發(fā)送到應(yīng)用程序中的目標對象,應(yīng)用程序根據(jù)消息的具體內(nèi)容進行處理。 消息不僅可由Windows發(fā)出,它也可由應(yīng)用程序本身或其它程序產(chǎn)生。Windows為每一個

6、應(yīng)用程序都維護一個或多個消息隊列,發(fā)送到每個程序窗口的消息都排成一個隊列。,幾種常見的系統(tǒng)消息,鼠標輸入 WM_MOUSEMOVE鼠標移動 WM_LBUTTONDOWN鼠標左鍵按下 WM_LBUTTONUP鼠標左鍵釋放 鍵盤輸入 WM_KEYDOWN 鍵按下 WM_KEYUP鍵釋放 WM_CHAR 字符鍵入 重畫消息 WM_PAINT 重畫窗口用戶區(qū),鼠標消息處理,CWnd 的鼠標消息響應(yīng)函數(shù) afx_msg void OnLButtonDown( UINT flg, CPoint pt ); afx_msg void OnMouseMove( UINT flg, CPoint pt ); f

7、lg 虛擬鍵標志;pt 鼠標的屏幕坐標 鼠標的消息入口 ON_WM_LBUTTONDOWN( ) ON_WM_MOUSEMOVE( ) 鼠標消息以外其他消息的處理也類似。,鍵盤輸入處理,CWnd 的鍵盤輸入消息響應(yīng)函數(shù) afx_msg OnKeyDown( UINT ch, UINT rep, UINT flg ); afx_msg OnChar( . ); afx_msg OnKeyUp( . ); ch 字符的ASCII值,rep 重復(fù)次數(shù),flg 虛擬鍵 鍵盤輸入消息入口 ON_WM_KEYDOWN( ) ON_WM_CHAR( ) ON_WM_KEYUP( ),MFC 對象的使用,定義

8、方法: 1. 定義 MFC 派生類、定義其屬性和成員函數(shù) 構(gòu)造方法: 1. 構(gòu)造 MFC 類對象或其派生類對象 2. 或調(diào)用其 Create 函數(shù),創(chuàng)建 Windows 對象 通信方法: 1. 調(diào)用 MFC 對象的成員函數(shù) 2. 響應(yīng)來自其他對象的消息傳遞 3. 向其他對象發(fā)送消息發(fā)送,資源編輯,資源文件(就是以應(yīng)用程序名和擴展名是.rc的文件)很大程度上決定了應(yīng)用程序的用戶界面。在VC+中資源文件包括以下內(nèi)容:,資源種類 對話框模板DIALOG 菜單模板MENU 圖標ICON 光標CURSOR 位圖BITMAP 加速鍵表ACCELERATORS 字符串表STRINGTABLE 工具條模板TO

9、OLBAR,以上信息都在.rc文件中包含,同時.rc文件還包含了以下語句: #include afxres.h #include afxres.rc 它們的作用是把適合于所有應(yīng)用程序的一些通用MFC庫資源包含進來。,VC 的資源編輯器,新建 Insert - Resouce - 選擇資源 修改 直接雙點指定資源的圖標 編輯 不同資源采用不同編輯器 程序識別方法 資源標識符(整數(shù)),菜單模板的編輯,結(jié)構(gòu)描述 菜單菜單標識符 MENU 子菜單項POPUP “字體( /創(chuàng)建對話框?qū)ο?CAboutdlog.DoModal( ); /啟動對話 ,對話框的消息響應(yīng),定義 CDialog 派生類 CMyD

10、ialog 各種消息響應(yīng)函數(shù) OnInitDialog對話框初始化 OnOK確認按鈕 OnCancel取消按鈕 獲得控制框?qū)ο螅ń缑嬖兀?CDialog:GetDlgItem(控制框標識符) 在 ClassWizard 中設(shè)定,窗口的分類,用戶界面元素的容器 各種對話框(CDialog 派生類) 各種視窗(CView 派生類) 產(chǎn)生窗口狀態(tài)變化消息 用戶界面的基本元素 各種控制框(CControl 的派生類) 向上級窗口發(fā)送通知消息,控制框的使用,六種主要的控制框 按鈕框(包括單選鈕、復(fù)選鈕、分組框) 靜態(tài)框(文本顯示) 編輯框(單行、多行編輯) 列表框(單選、復(fù)選) 滾動條框(水平、垂直)

11、 組合框(可編輯、不可編輯),MFC 支持 CButton CStatic CEdit CListBox CScrollBar CComboBox,兩種使用方法,作為子窗口 控制框?qū)ο笞鳛樯霞壌翱陬惖某蓡T變量 動態(tài)生成 在 OnCreate 中調(diào)用該對象的 Create、指定風格與屬性,作為對話框元素 在對話框模板中定義控制框、描述其風格與屬性 自動生成 隨對話框生成,數(shù)據(jù)傳輸?shù)目刂疲―ialog類),DoModal,OnInitDialog,OnOK,UpdateData,DoDataExchage,自動調(diào)用,程序中直接調(diào)用,CDialog類與對話過程函數(shù)調(diào)用,CDialog類是CWnd類的

12、繼承類,所以他繼承了CWnd的基本功能,如移動窗口、改變窗口大小、關(guān)閉窗口。CDialog類通過對話框的一些特定的特性擴展了基本功能。這些特性包括生成和現(xiàn)實對話框的功能、遍歷對話框的控件、設(shè)置和恢復(fù)默認按鈕等。,CDialog類的四個基本函數(shù),()OnInitDialog函數(shù) 是虛函數(shù),響應(yīng)WM_INITDIALOG消息(在Create()函數(shù)或DoModal函數(shù)調(diào)用期間系統(tǒng)發(fā)送此消息)。 原型:Dvirtual BOOL CDialog:OnInitDialog() ()DoModal()函數(shù) 用于激活模式對話框,完成后返回對話框結(jié)果。 Virtual int CDialog:DoModal

13、(),()OnOK()函數(shù) 也是虛函數(shù),用戶單擊按鈕時調(diào)用,如果對話框存在數(shù)據(jù)交換和驗證,將默認實現(xiàn)驗證對話框數(shù)據(jù),并更新相應(yīng)變量。(無模式對話框只有重載該函數(shù)并調(diào)用DestroyWindows()函數(shù)才能實現(xiàn)按鈕功呢。) (4) OnCancel函數(shù) 用戶調(diào)用Cancel按鈕或鍵時調(diào)用。,模式對話框?qū)⒆詣咏K止。DoModal()函數(shù)返回IDCANCEL。同理無模式對話框也要重載。,文檔視圖設(shè)計,文檔視圖結(jié)構(gòu) 文檔視圖結(jié)構(gòu)是在VC中使用MFC開發(fā)基于文檔的應(yīng)用程序的基本框架。在這個框架中,數(shù)據(jù)的維護及顯示分別由兩個不同但又彼此緊密相關(guān)的類文檔類和視圖類負責。,MFC文檔/視圖結(jié)構(gòu)數(shù)據(jù)處理工作分

14、工:,分為數(shù)據(jù)的管理和顯示 文檔用于管理和維護數(shù)據(jù) 視圖用來顯示和編輯數(shù)據(jù) MFC通過其文檔類和視圖類提供了大量有關(guān)數(shù)據(jù)處理的方法。,什么是文檔?,文檔的概念在MFC應(yīng)用程序中的適用范圍很廣,一般說來,文檔是能夠被邏輯地組合的一系列數(shù)據(jù),包括文本、圖形、圖象和表格數(shù)據(jù)。 一個文檔代表了用戶存儲或打開的一個文件單位。文檔的主要作用是把對數(shù)據(jù)的處理從對用戶界面的處理中分離出來,集中處理數(shù)據(jù),同時提供了一個與其它類交互的接口。,什么是視圖?,視圖是文檔在屏幕上的一個映像,它就像一個觀景器,用戶通過視圖看到文檔,也是通過視圖來改變文檔,視圖充當了文檔與用戶之間的媒介物。 應(yīng)用程序通過視圖向用戶顯示文檔

15、中的數(shù)據(jù),并把用戶的輸入解釋為對文檔的操作。 一個視圖總是與一個文檔對象相關(guān)聯(lián),用戶通過與文檔相關(guān)聯(lián)的視圖與文檔進行交互。當用戶打開一個文檔時,應(yīng)用程序就會創(chuàng)建一個與之相關(guān)聯(lián)的視圖。,視圖和文檔的功能:,視圖負責顯示和編輯文檔數(shù)據(jù),但不負責存儲。用戶對數(shù)據(jù)的編輯需要依靠窗口上的鼠標與鍵盤操作才得以完成,這些消息都是由視圖類接收后進行處理或通知文檔類,如收到窗口刷新消息時調(diào)用視圖類的成員函數(shù)OnDraw()顯示文檔內(nèi)容。 視圖還可在打印機上輸出。,文檔負責數(shù)據(jù)的讀寫操作,數(shù)據(jù)通常被保存在文檔類的成員變量中,文檔類通過一個稱為序列化的成員函數(shù)將成員變量的數(shù)據(jù)保存到磁盤文件中。MFC應(yīng)用程序為數(shù)據(jù)的

16、序列化提供了默認支持。,文檔、視圖、框架窗口之間的關(guān)系,一個視圖是一個沒有邊框的窗口,它位于主框架窗口中的客戶區(qū)。視圖是文檔對外顯示的窗口,但它并不能完全獨立,它必須依存在一個框架窗口內(nèi)。 一個視圖只能擁有一個文檔,但一個文檔可以同時擁有多個視圖。,視圖是文檔在屏幕上的一個映像,它就像一個觀景器,文檔/視圖結(jié)構(gòu)的優(yōu)點:,把數(shù)據(jù)處理類從用戶界面處理類中分離出來,使得每一個類都能集中地執(zhí)行一項工作。 把Windows程序通常要做的工作分成若干定義好的類,這樣有助于應(yīng)用程序的模塊化,程序也易于擴展,編程時只需修改所涉及的類。 雖然文檔/視圖結(jié)構(gòu)牽涉到許多類,其中的也關(guān)系比較復(fù)雜,但MFC AppWi

17、zard向?qū)Ы⒌腗FC應(yīng)用程序框架已經(jīng)把程序的主要結(jié)構(gòu)完成了,模塊間的消息傳遞以及各函數(shù)的功能都已確定。 MFC應(yīng)用程序框架起到了穿針引線的作用,按照消息處理函數(shù)功能的不同,將不同消息的響應(yīng)分別分布在文檔類和視圖類中。,文檔和視圖類常用的成員函數(shù),1視圖類的成員函數(shù)GetDocument() 一個視圖對象只有一個與之相關(guān)聯(lián)的文檔對象。在MFC應(yīng)用程序中,視圖對象通過調(diào)用成員函數(shù)函數(shù)GetDocument()得到當前文檔。GetDocument()是視圖類的成員函數(shù),調(diào)用它可以返回與視圖相關(guān)聯(lián)的文檔對象的指針,利用這個指針可以訪問文檔類及其派生類的公有成員。,2CDocument類的成員函數(shù)U

18、pdateAllViews(),一個文檔對象可以有多個與之相關(guān)聯(lián)的視圖對象,當一個文檔的數(shù)據(jù)通過某個視圖被修改后,與它關(guān)聯(lián)的每一個視圖都必須反映出這些修改。因此,視圖在需要時必須進行重繪,即當文檔數(shù)據(jù)發(fā)生改變時,必須通知到所有相關(guān)聯(lián)的視圖對象,以便更新所顯示的數(shù)據(jù)。,3視圖類的成員函數(shù)OnUpdate(),當程序調(diào)用CDocument:UpdateAllViews()函數(shù)時,實際上是調(diào)用了所有相關(guān)視圖的OnUpdate()函數(shù),以更新相關(guān)的視圖。需要時,可以直接在視圖派生類的成員函數(shù)中調(diào)用該函數(shù)刷新當前視圖。 在OnUpdate()中通過調(diào)用函數(shù)CWnd:Invalidate()刷新整個客戶區(qū)

19、,我們也可以在自己的CWnd派生類中直接調(diào)用函數(shù)Invalidate()。,:刷新視圖時默認的函數(shù)調(diào)用過程: CDocument:UpdateAllViews() CView:OnUpdate() CWnd:Invalidate() OnPaint() OnDraw(),多文檔,MFC基于文檔/視圖結(jié)構(gòu)的應(yīng)用程序分為單文檔和多文檔兩種類型,一個多文檔應(yīng)用程序有一個主窗口,但在主窗口中可以同時打開多個子窗口,每一個子窗口對應(yīng)一個不同的文檔。 利用MFC AppWizardexe向?qū)Э梢院芊奖愕亟⒁粋€多文檔應(yīng)用程序,只需在MFC AppWizard向?qū)У?步選擇Multiple document

20、s程序類型。,SDI和MDI使用不同框架窗口。SDI的框架窗口是唯一的主框架窗口,窗口類是CMainFrame,由CFrameWnd派生而來。,MDI的框架窗口分為主框架窗口和子框架窗口,區(qū)別于SDI,MDI的主框架窗口不包含視圖,分別由每個子框架窗口包含一個視圖。MDI的主框架窗口類不與某個打開的文檔相關(guān)聯(lián),而只與子框架窗口相關(guān)聯(lián)。 MDI主框架窗口類CMainFrame由CMDIFrameWnd派生而來,而MDI子框架窗口類CChildFrame由CMDIChildWnd派生而來。,圖形,圖形設(shè)備接口(GDI),設(shè)備環(huán)境類CDC: CDC是設(shè)備環(huán)境類的基類直接由CObject派生。是GDI

21、的關(guān)鍵元素,它代表了物理設(shè)備。每一個C+設(shè)備環(huán)境對象都有相對應(yīng)Windows設(shè)備環(huán)境,并通過一個32位類型的HDC句柄來標識。CDC類的虛擬性使我們可以很容易的做到編寫同時適用于多種設(shè)備的代碼。例如OnDraw函數(shù)的pDC-TextOut(0,0,Hello);既可以適用于顯示器、還可以適用于打印預(yù)覽和打印,只需要在CView:OnDraw函數(shù)的pDC參數(shù)指向不同的對象類。,CpaintDC是在窗口的OnPaint成員函數(shù)中使用的一種顯示上下文。在構(gòu)造函數(shù)中自動調(diào)用BeginPaint,析構(gòu)過程自動調(diào)用EndPaint CClientDC和CWindowDC是顯示設(shè)備環(huán)境類,都是由CDC派生而

22、來,區(qū)別在于CClientDC是窗口的客戶區(qū)不包括邊框、標題欄和菜單欄,(0,0)指客戶區(qū)域的左上角。CWindowDC的(0,0)指整個屏幕的左上角,這意味著我們可以在顯示器的任意地方繪圖,包括窗口邊框、標題欄和菜單欄等等。CWindowDC一般應(yīng)用在框架窗口,而不是視圖窗口。,CMetaFileDC代表Windows圖元文件的設(shè)備上下文。一個windows圖元文件包括一系列的圖形設(shè)備接口命令,可以通過重放這些命令創(chuàng)建圖形。向CMetaFileDC對象進行的各種繪制操作可以被記錄到一個圖元文件。 CDC對象被創(chuàng)建后一定要在合適的時候?qū)⑺鼊h除掉,如果忘記了刪除設(shè)備環(huán)境對象則會造成內(nèi)存丟失。如何

23、做才能避免出現(xiàn)這個問題呢,我們應(yīng)該在堆棧中構(gòu)造對象。,看例子 /* / void CMyView:OnLButtonDown(UINT nFlags,CPoint point) CRect rect; CClientDC dc(this); /在堆棧中構(gòu)造設(shè)備環(huán)境對象,用一個窗口指針this作參數(shù)。 dc.GetClipBox(rect); /GetClipBox函數(shù)是一個虛函數(shù),作用是可以獲得選定區(qū)域的尺寸 /析構(gòu)函數(shù)在函數(shù)返回時自動調(diào)用,也就完成對設(shè)備環(huán)境對象的刪除。,另一種寫法: void CMyView:OnLButtonDown(UINT nFlags,CPoint point) C

24、Rect rect; CDC * pDC=GetDC(); /通過調(diào)用CWnd的GetDC()函數(shù)獲得設(shè)備環(huán)境指針 pDC-GetClipBox(rect); /可以獲得選定區(qū)域的尺寸 ReleaseDC(pDC); /一定不能忘記,釋放設(shè)備環(huán)境。,GDI對象是通過CGdiObject派生類的C+對象來表示的,CBrush是一個GDI的派生類,它在MFC中的層次結(jié)構(gòu)是這樣的:CObject派生CGdiObject派生CBrush,明白了吧。CGdiObject是所有GDI對象的抽象基類。下面列出的是GDI派生類的列表: CBitmap:位圖是一種位矩陣,每一個顯示象素都對應(yīng)于其中的一個或多個位

25、,可以用來表示圖象,也可以用來創(chuàng)建刷子 CBrush:刷子定義了一種位圖形式的象素,可以用來對區(qū)域內(nèi)部填充顏色。,CFont:字體是一種具有某種風格和尺寸的所有字符的完整集合,常常被作為資源,其中一些依賴某種設(shè)備。 CPalette:調(diào)色板是一種顏色映射接口,它允許應(yīng)用程序在不影響其他應(yīng)用程序的前提下,可以充分利用輸出設(shè)備的顏色描繪能力。 CPen:筆是一種用來畫線及繪制有形邊框的工具,可以指定它的顏色及寬度,并可以指定畫虛線、點線還是實線。 CRgn:區(qū)域是由多邊形、橢圓二者組合形成的一種范圍,可以用來進行填充、裁剪、鼠標點中測試等等。,CGdiObject類很眼生,看過很多代碼就沒有看到過

26、它,原因是由于CGdiObject類是所有GDI對象類的虛擬基類,所以我們不必創(chuàng)建CGdiObject類的對象,可以直接構(gòu)造它的派生類的對象,例如這樣 CPen newPen(PS_DASHDOTDOT,2,(COLORREF) 0); /黑色的筆寬度為2 但需要注意的是CFont和CRgn的對象建立需要先調(diào)用默認的構(gòu)造函數(shù)來構(gòu)造C+對象,然后再調(diào)用相應(yīng)的創(chuàng)建函數(shù)如: CreateFont或CreatePolygonRgn等。,CGdiObject類有一個虛擬的析構(gòu)函數(shù),它派生類的析構(gòu)函數(shù)需要將與C+對象相關(guān)聯(lián)的GDI對象刪除掉,一定要在退出程序之前把構(gòu)造的CGdiObject派生類對象干掉。

27、因為一個沒有釋放的GDI對象會占用很多的內(nèi)存。,讓我們用一個例子跟蹤一下GDI對象 /* void CMy10View:OnDraw(CDC* pDC) pDC-MoveTo (10,10); pDC-LineTo (110,10); CPen newPen(PS_DASHDOTDOT,10,(COLORREF) 192); /紅色的筆寬度為10 CPen * pOldPen=pDC-SelectObject (,pDC-SelectObject (pOldPen);/把原來的對象恢復(fù) pDC-MoveTo (10,30); pDC-LineTo (110,30); 屏幕上應(yīng)該顯示三條線,第一

28、條和第三條一樣顏色和粗細因為他們都是用的設(shè)備環(huán)境默認的CPen對象,第二條是一條用我們自己設(shè)定的CPen對象。我們可以看出在將新對象選進設(shè)備環(huán)境的同時返回指向前一次被選對象的指針。作用保存原來的對象,以便完成任務(wù)時恢復(fù)它。,Windows還包含有一些可以利用的庫存對象。我們可以用SelectStockObject函數(shù)將它們選進設(shè)備環(huán)境。 如有關(guān)刷子、筆、字體的庫存對象: BLACK_BRUSH /Black brush. WHITE_PEN /White pen. ANSI_FIXED_FONT /ANSI fixed system font.,映射模式,在windows的GDI編程中,很多時

29、候需要與映射模式(Mapping Mode)打交道。映射模式簡單來說就是坐標系的設(shè)置以及刻度單位的設(shè)置的結(jié)合。常用的默認映射模式為MM_TEXT,其坐標系設(shè)置如圖:,X軸,Y軸,在這樣的坐標系統(tǒng)中,向右的方向為軸的正方向。無論是方向還是方向,每一個單位長度都代表設(shè)備的一個像素。這種映射模式對于很多繪制操作是合理的,由于它以像素為單位,所以很直觀地控制圖形在屏幕上輸出的大小。但缺陷也是很明顯的,因為不同設(shè)備對應(yīng)像素是不一樣的,所以不同設(shè)備輸出的圖形實際大小可能有很大的差異。 例如: pDC-Rectangle(CRect(0,0,200,200); 畫一個高和寬均為200個象素的方塊,因為采用的

30、是默認的MM_TEXT映射模式,在1024*768的顯示器上看到的方塊會比640*480的顯示器上的小,如何做才能保證在不同設(shè)備上得到大小一致的方塊或者圖形、文字呢?就需要我們進行選擇模式映射,來轉(zhuǎn)換設(shè)備坐標和邏輯坐標。,Windows提供了以下幾種映射模式: MM_TEXT MM_LOENGLISH MM_HIENGLISH MM_LOMETRIC MM_HIMETRIC MM_TWIPS MM_ISOTROPIC MM_ANISOTROPIC,下面分別講講這幾種映射模式: MM_TEXT: 默認的映射模式,把設(shè)備坐標被映射到象素。x值向右方向遞增;y值向下方向遞增。坐標原點是屏幕左上角(0

31、,0) (上面已經(jīng)講過)。但我們可以通過調(diào)用CDC的SetViewprotOrg和SetWindowOrg函數(shù)來改變坐標原點的位置看下面兩個例子:,/*例一* void CMyView:OnDraw(CDC * pDC) pDC-Rectangle(CRect(0,0,200,200);/全部采用默認畫一個寬和高為200象素的方塊 ,/*例二* void CMyView:OnDraw(CDC * pDC) pDC-SetMapMode(MM_TEXT);/設(shè)定映射模式為MM_TEXT pDC-SetWindowOrg(CPoint(100,100);/設(shè)定邏輯坐標原點為(100,100) pD

32、C-Rectangle(CRect(100,100,300,300);/畫一個寬和高為200象素的方塊 ,這兩個例子顯示出來的圖形是一樣的,都是從屏幕左上角開始的寬和高為200象素的方塊,可以看出例子2將邏輯坐標(100,100)映射到了設(shè)備坐標(0,0)處,這種變換應(yīng)用于滾動窗口。,固定比例映射模式: MM_LOENGLISH 0.01英寸 MM_HIENGLISH 0.001英寸 MM_LOMETRIC 0.1mm MM_HIMETRIC 0.01mm MM_TWIPS 1/1440英寸 /應(yīng)用于打印機,一個twip相當于1/20磅,一磅又相當于1/72英寸。,這一組是Windows提供的

33、重要的固定比例映射模式。 它們都是x值向右方向遞增,y值向下遞減,并且無法改變。(它們之間的區(qū)別在于比例因子見上) /*例3* void CMyView:OnDraw(CDC * pDC) pDC-SetMapMode(MM_HIMETRIC);/設(shè)定映射模式為MM_HIMETRIC pDC-Rectangle(CRect(0,0,4000,-4000);/畫一個寬和高為4厘米的方塊 ,還有一種是可變比例映射模式,MM_ISOTROPIC、MM_ANISOTROPIC。用這種映射模式可以做到當窗口大小發(fā)生變化時圖形的大小也會相應(yīng)的發(fā)生改變,同樣當翻轉(zhuǎn)某個軸的伸展方向時圖象也會以另外一個軸為軸心

34、進行翻轉(zhuǎn),并且我們還可以定義任意的比例因子。 MM_ISOTROPIC、MM_ANISOTROPIC兩種映射模式的區(qū)別在于MM_ISOTROPIC模式下無論比例因子如何變化縱橫比是1:1而M_ANISOTROPIC模式則可以縱橫比獨立變化。,void CMy002View:OnDraw(CDC* pDC) CRect rectClient; / GetClientRect(rectClient);/返回客戶區(qū)矩形的大小 pDC-SetMapMode(MM_ANISOTROPIC);/設(shè)定映射模式為MM_ANISOTROPIC pDC-SetWindowExt(1000,1000); pDC-S

35、etViewportExt (rectClient.right ,-rectClient.bottom ); /用SetWindowExt和SetViewportExt函數(shù)設(shè)定窗口為1000邏輯單位高和1000邏輯單位寬 pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2 );/設(shè)定邏輯坐標原點為窗口中心 pDC-Ellipse(CRect(-500,-500,500,500);/畫一個撐滿窗口的橢圓。 / TODO: add draw code for native data here ,如果將上述的pDC-SetMapMode

36、(MM_ANISOTROPIC) 替換為pDC-SetMapMode(MM_ISOTROPIC) 會怎樣? 橢圓會變成一個圓,因為它們比例因子縱橫比始終為:(不管你怎么拉縮窗口),很多MFC庫函數(shù)尤其是CRect的成員函數(shù)只能工作在設(shè)備坐標下。 還有我們有時需要利用物理坐標,物理坐標的概念就是現(xiàn)實世界的實際尺寸。 設(shè)備坐標-邏輯坐標-物理坐標之間如何進行轉(zhuǎn)換便成為我們要考慮的一個問題,物理坐標和邏輯坐標是完全要我們自己來做的,但WINDOWS提供了函數(shù)來幫助我們轉(zhuǎn)換邏輯坐標和設(shè)備坐標。,CDC的LPtoDP函數(shù)可以將邏輯坐標轉(zhuǎn)換成設(shè)備坐標 CDC的DPtoLP函數(shù)可以將設(shè)備坐標轉(zhuǎn)換成邏輯坐標,下面列出我們應(yīng)該在什么時候使用什么樣的坐標系: CDC的所有成員函數(shù)都以邏輯坐標為參數(shù) CWnd的所有成員函數(shù)都以設(shè)備坐標為參數(shù) 區(qū)域的定義采用設(shè)備坐標 所有的選中測試操作應(yīng)考慮使用設(shè)備坐標。 需要長時間使用的值用邏輯坐標或物理坐標來保存。因設(shè)備坐標會因窗口的滾動變化而改變。,編譯,編譯在VC+中有兩種模式,一種是Release Build另一種是Debug Build。它們之間的區(qū)別在于,Release Build不對源代碼進行調(diào)試,不考慮MFC的診斷宏,使用的是MFC Release庫,編譯時對應(yīng)用程序的速度進行優(yōu)化,而Debug Build則正好相反,它允許對源代碼進行調(diào)試,可以定義和

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論