實驗4單文檔和多文檔窗口_第1頁
實驗4單文檔和多文檔窗口_第2頁
實驗4單文檔和多文檔窗口_第3頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、實驗 4 單文檔和多文檔窗口一 實驗目的掌握利用開發平臺創建單文檔和多文檔窗口方法掌握在窗口中輸出文字、圖形的方法及 MFC 中相關類的使用二 實驗要求1創建一個單文檔窗口,在文檔類定義一個整型變量,其取值范圍從01000循環,在視圖的中間顯示該數字,當用戶點擊窗口的不同區域時,變量值按不同的增量增加并顯示。提示:在修改數據后,使用 Invalidate() 函數引起 MFC 對 OnDraw() 的調用,這樣就可 以用修改后的數據進行畫圖了。關于對文檔類的訪問,見本實驗的技術支持。2 創建一個單文檔窗口, 鼠標在窗口上單擊后在鼠標的位置顯示一正方形, 點擊 20 次后清 窗口, 新的點擊將不

2、再增加新的正方形, 而是將已輸入的正方形在原位置顯示,當然, 在每 20 單擊后要重新清窗口。(要求用 MFC 的通用類保存單擊的信息,如 CList 類)知識點:畫線當單擊鼠標左鍵時, 就可以獲得一個點, 即線條的起點。 接著按住鼠標左鍵并拖 動一段距離后松開鼠標,此時也可以獲得一個點,即線條的終點。也就是說,我 們需要捕獲兩個消息,一個是鼠標左鍵按下消息( WM_LBUTTOND)VV在該消息 響應函數中可以獲得將要繪制的線條的起點;另一個是鼠標左鍵彈起來的消息(WM_LBUTTONUP在該消息響應函數中可以獲得將要繪制的線條的終點。有了這兩個點就可以繪制出一條線。利用 SDK 全局函數實

3、現畫線功能為了進行繪圖操作,必須獲得一個設備描述表(DC ),因此,首先定義一個 HDC 類型的變量:hdc,接著調用全局函數 GetDC獲得當前窗口的設備描述表。因為 CWnd類有一個成員變量( m_hWnd ),而 CView 類派生于 CWnd 類,因此該類也有這樣的一個成員變用于 保存窗口句柄,而 GetDC 函數可以直接把這個成員變量作為參數來使用。利用 MFC 的 CDC 類實現畫線功能該類提供一個數據成員 m_hDC 類用來保存與 CDC 相關的 DC 句柄。其道理與 CWnd 類提供成員變量 m_hWnd 保存與窗口相關的窗口句柄是一樣的。CDC* pDC = GetDC();

4、pDC->MoveTo(m_ptOriginal);pDC->LineTo(point);ReleaseDC(pDC);利用 MFC 的 CClientDC 類實現畫線功能利用 MFC 提供的 CClientDC 類來實現畫線的方法。這個類派生于 CDC 類,并且在構 造時調用 GetDC 函數,在析構時調用 ReleaseDC 函數。也就是說,當一個 CclientDC 對象 在構造時會調用 GetDC 函數,獲得一個設備描述表對象;對象析構時,會自動釋放這個設 備描述表資源。這樣的話,程序中只需要定義一個 CclientDC 對象,就是利用該對象提供的 函數進行繪圖操作了。當該

5、對象的生命周期結束時,會自動釋放其所占用的設備資源。CClientDC dc(this);dc.MoveTo(m_ptOriginal);dc.LineTo(point);為了在視圖之外的框架上畫圖,將第一句改為 CClientDC dc(GetParent(); ,結果發現線 條可以畫到工具欄上面了。繪制彩色線條CPen pen(PS_SOLID,1,RGB(255, 0, 0);/畫筆為實線、線寬為 1、紅色。點線設為 PS_DOT ,虛線為 PS_DASHCClientDC dc(this);Cpen* pOldPen = dc.SelectObject(&pen);/ Sele

6、ctObject 函數實現將 GDI 對象選入設備描述符中, 并且返回原先被選對象的指針 dc.MoveTo(m_ptOriginal);dc.LineTo(point);dc.SelectObject(pOldPen);/ 恢復原畫筆3 在一個單文檔窗口中,當鼠標在窗口中移動并按下左鍵時畫圖,左鍵彈起時停止4 創建一個 MDI 窗口,讀入一個數據文件,然后用不同的方式在不同的窗口上顯示。三 實驗過程4.1創建一個單文檔窗口,在文檔類定義一個整型變量,其取值范圍從01000循環,在視圖的中間顯示該數字, 當用戶點擊窗口的不同區域時, 變量值按不同的增量增加并顯示。提示:在修改數據后,使用 In

7、validate() 函數引起 MFC 對 OnDraw() 的調用,這樣就可 以用修改后的數據進行畫圖了。目標:掌握運用 Appwizard 創建一個應用程序, 熟悉 CApp1Doc 文檔類和 CApp1View 視圖 類,掌握視圖類的 OnDraw() 的調用和文檔類中的數據處理步驟:1 使用 AppWizard 創建一個應用程序創建一個 MFC 單文檔應用程序1) 單擊 Developer Studio 的 File (文件)菜單中的 New (新建)命令,以顯示 New 對話框,選 擇 MFC( AppWizard (exe) ,然后輸入需要創建工程的名稱和目錄(見圖 4-1)。注意

8、,幾乎在所有的工程文件的內部和外部都使用該名字,因此,此處的任何錯誤在以后都是很 難改正的。選擇MFCAppWizardfexe)nn輸入項目的名字和日錄圖4-1指定應用程序的文件名和位置2)AppWizard的第一步是選擇應用程序的類型(見圖4-2 ),選擇單文檔選項。選擇悶用 程序類型圖4-2選擇應用程序類型3) AppWizard的第二步要求指定應用程序所需要的數據庫支持種類。選擇Header FilesOnly (只有頭文件)使AppWizard只添加支持數據庫訪問的MFC類。因此,訪問一個 ODBC或DAO數據庫,選擇 Database View without File Suppo

9、rt(數據庫視圖,沒有文件支持)或者Database View With File Support(數據庫支持,具有文件支持)使AppWizard創建一個具有特殊的視圖和文檔類的簡單的數據庫編輯器。如果選擇 Database View without FileSupport ,AppWizard將不添加標準文件打開命令到應用程序菜單(即:File /New, File/Open等)。從理論上講,如果只訪問一個數據庫,無論如何也不需這些命令,當應用程序開始運行時,合適的數據庫將被自動打開。然而,如果應用程序既要訪問平面文件,又要訪問數據庫文件,則應該選擇 Database View with F

10、ile Support 。4) AppWizard的第三步要求指定應用程序所需要的C O M支持。本實驗只采用了默 認選項。5)AppWizard的第四步要求選擇一些基本的應用程序選項(見圖4- 3 ),可以選擇應用程序是否有一個工具欄或狀態,是否添加打印命令到菜單,以及是否包括支持e-mail或網絡通信。Recent File list(當前文件列表)是應用程序打開的最近幾個文件的一個列表,它由應用程序自動維護,用戶必須決定這里的n是多少。單擊 Advaneed (高級)按鈕進行更高級的選項設置(本實驗采用默認選項)。隴擇簡單的血用理序選項然后編輯將在 文件對話中顯 示的過濾名了圖4-3選擇

11、應用程序選項6)高級選項的第一頁要選擇將在應用程序標題欄中顯示的標題。如果創建一個串行化它 的文檔到磁盤的應用程序,則可以選擇應用程序追加給那些文件的文件擴展名,然后就可以在打開或保存文檔時顯示的文件對話框的過濾域中編輯文本(見圖4 -4 )(本實驗采用默認選項)。輸入應用程 序創建的文 檔的三個字 母擴展名圖4-4指定應用程序標題、缺省文件擴展名和文件對話文本7)高級選項的第二頁要求在應用程序中添加視圖分割(Splitting )能力,它將提供允許動態分割他們的視圖的一個菜單命令。也可以決定是否要求應用程序主窗口或子窗口初始最大化或初始最小化,以及用戶是否能夠重調它們的大小(見圖4- 5)(

12、本實驗采用默認選項)cAdvarttsd Qp-l*ontm-BW- »*- M 8»» i!S -廠I曲SfilU : . iJ = iia* * BL._MI: . K J.'輸入高級應 用程序選頊17 Mr i nut: Liisi戸加說m m*r:u f* Mm nutd 廠 M j»itudMD <Wd Pbh'fr 腳應時 F liJi JhiE舟bowM n r»Ed療 Ma- riie tow Mreed圖4-5:指定應用程序的框架窗口選項8)在AppWizard的第五步,必須決定是用MFC庫靜態鏈接,還是

13、用一個共享的MFC DLL進行鏈接(見圖4 - 6 )。靜態鏈接MFC庫使應用程序相當龐大,但用戶從來不必考慮正確版 本的MFC DLL當前是否已經安裝在系統上。如果計劃用MFC庫創建自己的 DLL,則必須鏈接MFC DLL 。(本實驗采用默認選項)選擇是慨態鏈 接MFC還是與 其他應用程序 共亨它的DLL圖4-6選擇怎樣鏈接MFC9)AppWizard的最后一步,允許改變應用程序的視圖類。關于選項的描述。對于沒有列出的任何視圖類,選擇缺省視圖類一可以在以后編輯名字(見圖4-7 )。(本實驗采用默認選項)選定視圖類文件wFC AwWiriiri- Slct Gof SC.-/a*ppCMarF

14、iSTji: 任hfcFi長 i 口吩57 gmIddUMS CFa林g iL_rtl'Xe.«j L-t IT'Hli.hf iJhpWT 毋 cr<JVuwAppVikfld ce«*53 hebhing 云鄒:?$ 才卅匚選樣件地 選擇一個 不同的視 関類圖4-7選擇一個視圖類.10) 編譯連接后,產生的默認的單文檔應用程序(圖4-8)圖4-8 個單文檔應用程序2.在文檔類定義一個變量 m_value,在視圖類里面給添加命令響應函數 On LButto nDow n(UINT nFlags, CPoi nt poi nt),用于捕捉鼠標點擊位置,

15、作為變量值。具體代 碼添加如下:在文檔類頭文件中/ Impleme ntati onpublic:int m_value; /添加整形變量名virtual CSy41Doc();在構造函數初始化 m_valueCSy41Doc:CSy41Doc()/ TODO: add one-time construction code herem_value=0; 在視圖類添加的整形變量x, y,布爾變量 m_bCaptured在視圖類頭文件中/ Implementationpublic:int y;int x;bool m_bCaptured;virtual CSy41View(); 在構造函數中初始化

16、變量 CSy41View:CSy41View() / TODO: add construction code herex=0;y=0;m_bCaptured=false;在鼠標響應函數 OnLButtonDown(UINT nFlags, CPoint point) 中添加 void CSy41View:OnLButtonDown(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default/SetCapture(); m_bCaptured=true;x=point.x;y=

17、point.y;Invalidate(m_bCaptured); / 進行操作的更新CView:OnLButtonDown(nFlags, point); 在 OnDraw(CDC* pDC )中添加void CSy41View:OnDraw(CDC* pDC)CSy41Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/pDoc->m_value=(x+pDoc->m_value)%1000;CString m_str;m_str.Format("

18、%4d", pDoc->m_value);pDC->TextOut(x,y,m_str);4.2 創建一個單文檔窗口, 鼠標在窗口上單擊后在鼠標的位置顯示正方形, 點擊 20 次后清窗 口,新的點擊將不再增加新的正方形, 而是將已輸入的正方形在原位置顯示, 當然, 在每 20 單擊后要重新清窗口。 (要求用 MFC 的通用類保存單擊的信息,如 CList 類) 目標:熟悉視圖類文件的 OnDraw ()函數,掌握鼠標消息映射函數實現人機界面功能。 步驟:1 如實驗 4.1 創建一個單文檔窗口,在視圖類里面添加兩個成員變量,整形變量count 用于記錄鼠標點擊次數, 布爾變

19、量 m_bCaptured 用于判斷鼠標的點擊, 添加一個 CRect 類的對 象 m_boxShape 。添加成員函數鼠標消息映射函數OnLButtonDown(UINT nFlags, CPointpoint) 。具體的程序清單如下。在視圖類頭文件中添加成員變量/ Implementationpublic:int m_count;CRect m_boxShape;bool m_bCaptured;初始化成員變量在 CSy42View:CSy42View()CSy42View:CSy42View()/ TODO: add construction code herem_bCaptured=f

20、alse;m_count=0;在鼠標消息映射函數 OnLButtonDown(UINT nFlags, CPoint point) 添加: void CSy42View:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default/SetCapture(); m_bCaptured=true;if(m_bCaptured)m_count+=1; if(m_count%20 != NULL)m_boxShape.left=point.x; m_boxSh

21、ape.right=point.x+100;m_boxShape.top=point.y; m_boxShape.bottom=point.y+100;else m_boxShape.left=0; m_boxShape.right=0; m_boxShape.top=0; m_boxShape.bottom=0; m_count=0;Invalidate(true);m_bCaptured=false;CView:OnLButtonDown(nFlags, point);在 OnDraw(CDC* pDC) 函數中添加void CSy42View:OnDraw(CDC* pDC)CSy42D

22、oc* pDoc = GetDocument(); ASSERT_VALID(pDoc);/ TODO: add draw code for native data here pDC->Rectangle(m_boxShape);4.3 在一個單文檔窗口中,當鼠標在窗口中移動并按下左鍵時畫圖,左鍵彈起時停止目標:熟悉使用鼠標進行畫圖,并且選擇不同的畫筆。步驟:1按照實驗 4.1 創建一個單文檔窗口,然后在視圖類頭文件中 sy43View.h 添加 ShpType 集合類型和結構體 Shape 結構以及常量 SHPS_MAX=1000;enum ShpType / 可以添加其他圖形shpR

23、ectangle;struct ShapeCRect m_boxShape;ShpType m_typeshape;const int SHPS_MAX=1000;2在視圖類頭文件 sy43View.h 中添加數據成員到公共屬性區, 并且在文件 sy43View.cpp 的 視圖類構造器 CSy43View:CSy43View() 初始化成員變量public:ShpType m_TypeNext;Shape m_shpTemp;Shape m_arShpsSHPS_MAX;int m_countShapes;bool m_bCapture;CBrush * m_pBrush01d;ShpTyp

24、e m_typeshape;/ CSy43View:CSy43View()/ TODO: add construction code here srand(unsigned) time(NULL); m_TypeNext=shpRectangle;m_bCapture=false;m_pBrush01d=NULL;m_countShapes=0;3在視圖的 OnDraw 函數添加如下代碼,采用一個 for 循環砸在數組 m_arShps 繪出所有圖 形。void CSy43View:OnDraw(CDC* pDC)CSy43Doc* pDoc = GetDocument();ASSERT_VA

25、LID(pDoc);/ TODO: add draw code for native data hereSetPenBrush(pDC);for (int nShp=0; nShp<m_countShapes; nShp+)ASSERT(m_arShpsnShp.m_typeshape=shpRectangle); pDC->Rectangle(m_arShpsnShp.m_boxShape);ResetPenBrush (pDC);函數說明,首先調一個 SetPenBrush 函數改變 OnDraw 函數的設備描述表,在程序結束后, 調用一個對應 ResetPenBrush 函數

26、回復以前的設備描述表屬性。4給鼠標消息添加消息函數,首先是OnLButtonDown 消息處理函數中,添加如下代碼void CSy43View:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call default /SetCapture();m_bCapture=true;ASSERT(m_TypeNext=shpRectangle);CView:OnLButtonDown(nFlags, point);接著在 OnMouseMove 消息處理函數中添加voi

27、d CSy43View:OnMouseMove(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call default if(m_bCapture)CView:OnMouseMove(nFlags, point);最后在 OnLButtonUp 消息處理函數中,添加void CSy43View:OnLButtonUp(UINT nFlags, CPoint point) / TODO: Add your message handler code here and/or call defa

28、ult if(m_bCapture):ReleaseCapture(); m_bCapture=false; CClientDC dc(this);InvertShape(&dc,m_shpTemp,false); m_arShpsm_countShapes=m_shpTemp; m_countShapes+;CView:OnLButtonUp(nFlags, point);5.添加繪圖輔助函數,在 sy43View.cpp文件中添加函數 SetPenBrush,添加如下代碼 void CSy43View:SetPenBrush(CDC *pDC)ASSERT(pDC !=NULL);

29、 m_pBrush01d=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);接著添加 ResetPenBrush 函數,添加如下代碼void CSy43View:ResetPenBrush(CDC *pDC)ASSERT(pDC !=NULL);ASSERT( m_pBrush01d !=NULL); m_pBrush01d=(CBrush*)pDC->SelectStockObject(NULL_BRUSH); m_pBrush01d=NULL;最后添加 InvertShape 函數,添加代碼如下:void CSy43View:InvertS

30、hape(CDC *pDC, Shape &s, bool bInvert)ASSERT(pDC !=NULL);int nMode01d;if(bInvert) nMode01d=pDC->SetROP2(R2_NOT);SetPenBrush(pDC);shpRectangle: pDC->Rectangle(s.m_boxShape); if(bInvert) pDC->SetROP2(nMode01d);ResetPenBrush(pDC);其中, InvertShape 函數是將繪圖和擦除動作合成在一起。4.4 創建一個 MDI 窗口,讀入一個數據文件,然后

31、用不同的方式在不同的窗口上顯示。 目標:熟悉多文檔窗口的創建,掌握在不同的窗口中用不同的方式顯示數據文件。步驟:1 按照實驗 4.1 的創建一個多文檔窗口,如圖4-2,選擇多文檔選項。2在 CChildFrame 添加一個基于 CSplitterWnd 類成員變量 m_wndSplitter ,同時添加一個成 員函數 OnCreateClient( LPCREATESTRUCT lpcs ,CCreateContext* pContext) ,添加代碼如下: BOOL CChildFrame:OnCreateClient( LPCREATESTRUCT lpcs,CCreateContext*

32、 pContext) if(!m_wndSplitter.CreateStatic(this,1,2)|!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CStatView1),CSize(165,0),pContext)|!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CStatView2),CSize(0,0),pContext) return false;return true;我們調用 3 個函數:一個 m_wndSplitter.CreateStatic ,兩個 m_wndSplitter.CreateVi

33、ew 。如 果其中一個調用失敗,講返回false,應用程序中止運行。函數CreateStatic采用一個參數來標識它的父窗口,2個參數用來設置行數和列數(在實例中是 1 行 2 列),創建初始化靜態分割窗口。對于靜態分割窗口,我們用 CreateView 函數 設置窗口的視圖類,前兩個參數用于設置窗口的行數和列數,采用0、 0 使窗口具有 1 行 2列(兩個窗口左右并列) ;在第二個 CreateView 函數調用中, 采用參數 0、1。每一個 CreatView 函數調用傳遞一個 CRuntimeClass 對象,可由 RUNTIME_CLASS 宏獲得,傳遞該對象,用 于標識 MFC 創建

34、視圖對像所需的視圖類。在上面的列子中,我們為左右兩個窗口分別設置為C View的派生類CStatViewl和CStatView2。 CSize變量用于設置兩個窗口的寬度。在本 實例中調用 CSize( 165, 0),采用 CSize( 0, 0)用來設置右邊窗口占用左邊窗口所剩余的 水平空間。3. 在文檔類定義兩個成員變量,整型變量m_value,字符串變量 m_stri ng,初始化為: CSy44Doc:CSy44Doc()/ TODO: add one-time construction code herem_String="Hello World!"m_Value

35、=582;4. 創建兩個 CView 的派生類 CStatView1 和 CStatView2 。采用 insert 中 new class 命令添加。 在新創建的兩個類的 OnDraw(CDC* pDC) 函數里面添加如下代碼:void CStatView1:OnDraw(CDC* pDC)CSy44Doc* pDoc =(CSy44Doc*) GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code here pDC->TextOut(10,10,pDoc->m_String);void CStatView2:OnDraw(C

36、DC* pDC)CSy44Doc* pDoc = (CSy44Doc*)GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code hereCString x;x.Format("%4d",pDoc->m_Value); pDC->TextOut(10,10,x); 數據文件分別顯示在不同的窗口里面。四 技術支持. Single DocumentInterface(SDI ,單文檔界面 ) 這種類型的應用程序一次 只允許打開個文檔。 文檔自動充滿應用程序的主窗口, 不為其他的文檔留下空 間。 Windows 的

37、NotePad 程序是一個 SDl 應用程序。 Multiple Document Interface (MDI,多文檔界面 ) 這種類型的應用程序允許同時打開多個文檔。我們非常熟悉的 Word 就屬于 MDI 應用程序。究竟何時選擇 SDI 和 MDI ?如果在運行期間應用程序只與一個文檔有關連, 那 么就使用 SDI 方法。但是,如果應用程序能產生多個文檔,并對多個文檔進行 處理( 即使這不是一次性完成的 ) ,這時應該采取 MDI 的方法,即使在開始時并 沒有看到在同一時間修改多個文檔的可能。一個 MDI 應用程序并不比一個 SDI 應用程序復雜多少,卻可以帶給用戶在同一時間看閱多個文檔

38、的方便。如果不特別說明,MFC應用程序使用編程的模板將數據和數據顯示分離開,將數 據與用戶對數據的交互分離開。在這種模型下,MFC文檔對象讀寫數據,提供與 數據的接口。 個獨立的視圖對象管理數據的顯示, 為窗口提供數據公用及用戶 對數據的選擇、編輯。視圖對象從文檔獲取數據,將數據的變化傳回文檔。盡管用戶可以忽略文檔和視圖的分離,但是,遵循這種模型是有原因的。第一, 當用戶需要同一個文檔的多個視時 ( 如表格和圖表視圖 ),由于對所有視圖的公用 代碼存在文檔中, 文檔視圖結構使一個單獨的視圖對象代表了數據的每一個視 圖。當數據變化時,文檔將更新所有的視圖對象。MFC的文檔/視圖結構支持多視圖,多

39、文檔類型,切分窗口和其他用戶接口特性。 文檔視圖結構的核心是以下四個類: CDocument或COIeDocument)用于存儲和控制程序數據的對象; CView ( 或派生類) 用于顯示文檔數據和管理用戶與數據的交互; CFrameWnd提供文檔的一個或多個視圖的框架; CDocTempIate ( 或 CSingIeDocTemptate 、CMuItiDocTempIate) 協調給定類 型的一個或幾個文檔,并管理創建文檔、視圖和框架窗口對象。文檔和視圖在一個典型的 MFC 應用程序中是成對出現的。數據存放在文檔中, 而視圖對這些數據有訪問優先權。 文檔與視圖的分離將數據的存儲和維護與它

40、的 顯示分離開來:從視圖中訪問文檔數據從視圖中訪問文檔數據有兩種方式,一種是使用 GetDocumemt函數,返回一個指向文檔的指針,另一種就是使視圖類成為文檔類 的友元。用戶輸入到視圖現將鼠標單擊解釋為選擇或編輯數據, 同樣,將鍵盤輸入認為是 數據的輸入或編輯。 假設用戶在視圖中輸入一個字符串,視圖將獲得到文檔的 指針并使用指針將新的數據化送到文檔中,以某種數據結構存儲起來。更新同一文檔的多個視圖在一個帶有多個視圖的應用中, 如文本編輯器的切分窗 口,視圖首先將新數據傳到文檔中, 然后調用文檔的 UpdateAllViews 成員函數, 通知文檔所有的視圖進行更新。視圖的其他成員函數處理和解

41、釋所有用戶的輸入, 用戶通常在視圖類中定義消息 處理函數,以便處理以下內容: Windows 消息,由鼠標和鍵盤操作產生; 來自菜單、工具條按鈕和加速鍵產生的命令。視圖所處理的消息依賴于應用 程序。在前面的消息處理和映射一節中已解釋了怎樣將菜單項和其他用戶界面控 制與命令相連。經常使用的有 7 個重要的 CDocument 函數。這些函數分為三類: 訪問視圖的函 數、與文檔信息相關的函數、與修改狀態有關的函數。?對視圖的訪問一一CDocument類提供了三個函數使得對附屬在文檔上的 視圖更容易使用 由于一個文檔可以有多個視圖,但每個視圖只能有一個 文檔。所以可以通過調用 GetFirstVie

42、w() 函數來獲取一個附屬在文檔上 的視圖。如果有多個視圖存在的話, 則可以調用 GetNextView() 直到返回 值為NULL=文檔不時地改變某些數據并需要通知其所有的視圖進行更新, UpdateAllViews(NULL) 函數便是為此目的而設計的。? 文檔信息 GetPathName() 和 GetTitle() 這兩個函數可以使文檔找 到其所連接的文件。 GetPathName() 返回的是文檔的完全路徑,而 GetTitle() 返回的是文檔的標題,通常與其文件名有關。如果一個新的 文檔還從沒有被保存過,那么該函數的返回值使是NULL。? 修改狀態 CDocument 類有兩個函

43、數使你可以監視自文檔上次被保存 以來文檔是否被修改過。 如果數據被改變了, 那么 IsModified() 函數返 回非零值, 但是,要使之發揮作用, 每個改變文檔數據的函數必須在它改 變數據時調用 SetModifiedFlag() 函數。創建窗口類型的選擇使用開發平臺中的 AppWizard 可以自動創建三種類型的 MFC 應用程序窗口:對 話框、單文檔界面或多文檔界面。對窗口類型的選擇可基于以下幾點考慮:如果創建一個用戶界面需求有限的應用程序, 或如果想界面完全單一, 那么就 創建一個對話框應用程序。典型的對話框應用程序包括配置硬件設備的應用程 序、屏幕保護程序和游戲程序等。如果應用程序

44、要編輯一個文檔, 應該選擇另外兩種應用程序類型。 這里的“編 輯一個文檔”是廣義上的意思, 所指的文檔可以是一個文本文件、 電子數據表文 件、第三方數據庫的一個或多個表、 或者是自己的二進制文件, 甚至可以是大量 硬件設備的儲存設置。 編輯僅僅表示對其中任何一個類型的文檔進行添加、 刪除 或修改操作。單文檔界面應用程序一次只允許處理一個文檔。 如果應用程序實際上一次只需 處理一個文檔,諸如監視一組硬件設備的應用程序,那么應該選擇單文檔界面; 否則應該創建一個多文檔界面應用程序, 即使在開始時一次編輯多個文檔并未顯 出有任何好處。一個多文檔界面應用程序允許一次編輯多個文檔, 它并不比一個單文檔界

45、面應 用程序復雜,但卻帶來了一次至少查看多個文檔的方便。選擇視圖的類型單文檔或多文檔界面應用程序, 在退出 AppWizard 之前必須選擇所需的視圖類, 在 AppWizard 的最后一步,可以選擇下面視圖類:對于一個簡單的文本編輯器應用程序,選擇 CEditView 。 對于一個能編輯多信息文本格式 ( RTF) 文件的應用程序,選擇 CRichEditView( 這一選擇將導致應用程序為文檔類選擇 CRichEditDoc 類) 。 對于一個圖形應用程序,選擇 CScrollView 。對于一個簡單的監控或帳目管理應用程序,選擇 CListView 。 要著手創建一個資源管理器類型的應用

46、程序, 請選擇 CTreeView ( 在以后的步 驟中, 可以手工添加一個 CListView ) 。在對話框模板外創建一個視圖, 選擇 CFormView ( 一個對話框是一個被幾個控 件窗口占據的窗口,諸如按鈕和編輯框 ) 。對于一些特殊用途,也可以在 AppWizard 的早期階段為視圖類間接地選擇 CRecordView 或 CDaoRecordView ,同時在該階段還得決定為應用程序添加什么 樣的數據庫支持。如果在第二步中選擇任何一項“ DataBase View ”選項,則該視圖被添加,并允許輕松地訪問一個 ODBC或DAO數據庫中的記錄。選擇文檔類型 應用程序可以與三種基本文檔類型進行交互:平面文件 (flat file) 、串行文件或數據庫。通常,文檔類型的選擇取決于用戶打算編寫的應用 程序類型,讓我們討論怎樣選擇:一個平面二進制或文本文件是應用程序可以支持的最簡單的文檔, 并且

溫馨提示

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

評論

0/150

提交評論