對話框、常用消息菜單和工具欄_第1頁
對話框、常用消息菜單和工具欄_第2頁
對話框、常用消息菜單和工具欄_第3頁
對話框、常用消息菜單和工具欄_第4頁
對話框、常用消息菜單和工具欄_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

第10章對話框、常用消息、菜單和工具欄提綱10.3對話框13210.2常用消息10.1對話框10.4菜單和工具欄410.5視圖與文檔52023/3/30濟南大學自動化學院2對話框對話框可按其工作模式分為兩類:有模式對話框:在對話框被關閉之前,用戶無法再進行其他工作;無模式對話框:在對話框關閉之前,用戶可以在應用程序的其他窗口進行工作;2023/3/303濟南大學自動化學院對話框工具箱2023/3/30濟南大學自動化學院410.1常用控件常用控件按鈕控件2023/3/30濟南大學自動化學院510.1常用控件編輯框控件2023/3/30濟南大學自動化學院610.1常用控件列表控件列表控件功能強大,它不僅能顯示文本,還能顯示圖像。列表控件一共有4種形式,分別是大圖標(Icon)、小圖標(small)、列表(List)和報表(report)形式,最常用的類型是以網絡列表形式顯示報表2023/3/307濟南大學自動化學院10.2常用消息在鍵盤消息中,將按鍵分成兩類:(1)系統鍵:指輸入鍵與Alt鍵組合產生的,系統鍵操作一般由Windows內部處理,而應用程序不須處理。(2)非系統鍵:指輸入鍵不與Alt鍵組合按下的鍵。2023/3/30濟南大學自動化學院810.2常用消息按鍵消息處理:當鍵盤某鍵按下后又釋放,不論該鍵是否會產生可見字符,都會產生WM_KEYDOWN和WM_KEYUP兩個消息。當Widows系統將消息送往應用程序窗口時,通過MFC中的消息映象找到對應的消息處理函數,可在消息處理函數中加入相應的代碼,這樣便可執行相關的操作。2023/3/30濟南大學自動化學院910.2常用消息字符消息處理:字符消息WM_CHAR只針對那些產生可見字符的鍵而言的,輸入一個可見字符將產生WM_CHAR消息。2023/3/30濟南大學自動化學院1010.2常用消息鼠標消息及鼠標消息的處理用戶區域鼠標消息:鼠標指針通過應用程序窗口的用戶區域時,Windows系統將發送用戶區域鼠標消息到應用程序中。用戶區域鼠標消息是用戶可以在Windows應用程序中正常處理的信息。當鼠標移動到應用程序窗口的用戶區域外面時,應用程序將停止接收用戶區域的鼠標消息,而Windows將把鼠標消息發送給鼠標碰巧通過的元素當鼠標移回到窗口的用戶區域時,Windows會重新把鼠標消息發送方向指向應用程序(在應用程序已經捕獲了鼠標時例外)2023/3/30濟南大學自動化學院112023/3/3010.2常用消息非用戶區域鼠標消息:在Windows中,除了用戶區域以外的應用程序窗口部分都為非用戶區,Windows將會給應用程序發送非用戶區域鼠標消息。例如鼠標通過窗口的標題欄或控制按鈕時,應用程序會接收非用戶區域鼠標消息。一般應用程序不處理非用戶區域鼠標消息,它們可以被Windows系統本身默認地處理。濟南大學自動化學院122023/3/30濟南大學自動化學院1310.2常用消息鼠標消息的處理:鼠標消息處理與鍵盤消息處理的方式相同,一般都是用ClassWizard添加消息映象函數,并為函數加入代碼Windows編程需要捕捉所有鼠標消息,并將它們發送到應用程序中。這一行為稱為捕捉鼠標。這種編程方法經常被用在鼠標按鈕按下或按鈕釋放消息中。10.2常用消息鼠標捕捉如果鼠標右鍵在用戶區被按下,而鼠標右鍵在釋放時,鼠標的位置已經不在用戶區中了,這時鼠標右鍵的釋放的消息并沒有發送到應用程序中為了使鼠標右鍵釋放的消息也發送到應用程序中在鼠標右鍵在用戶區被按下的消息響函數OnRButtonDown()中加上SetCapture()進行鼠標捕捉在鼠標右鍵被釋放的消息響函數OnRButtonUp()中加上ReleaseCapture()釋放鼠標捕捉。2023/3/30濟南大學自動化學院1410.3對話框用資源編輯器建立對話框例例10-1,建立對話框,能夠輸入學生檔案,包括學生的姓名、性別、系等數據。設計思路:定義一個學生檔案數據的結構,在CS10_1View類中定義該結構的對象,用于保存學生檔案。然后建立一個對話框,通過對話框將學生檔案輸入到該學生對象中。實現步驟如下:2023/3/30濟南大學自動化學院1510.3對話框1.在Cs10_1View類的頭文件中定義學生檔案數據//Cs10_1View.hstructSTUDENT{CStringname;CStringdept;CStringsex;};classCs10_1View:publicCview{……protected:STUDENTs; //s用于保存學生檔案};2023/3/30濟南大學自動化學院1610.3對話框2.用資源編輯器建立輸入學生檔案的對話框1)打開項目文件,選擇資源編輯器向導“ResourceView”,展開“Myresources”,右鍵單擊“Dialog”列表項,從彈出的快捷菜單中選擇“InsertDialog”,在資源編輯器中插入一個對話框,如圖所示2023/3/30濟南大學自動化學院1710.3對話框2)調整對話框的大小,然后利用工具箱中的標簽和編輯框等控件設計出如圖所示的學生檔案輸入對話框為了能在程序中方便地操作各個對話框控件“姓名”后面的編輯框ID改為IDC_Name,單選項“男”的ID改為IDC_Man,單選項“女”的ID改為IDC_Female,“系”后面的編輯框ID改為IDC_Dept。2023/3/30濟南大學自動化學院1810.3對話框3)完成上述設置后,雙擊對話框的任一位置,MFC將彈出建立新類的向導對話框,按默認設置選擇“Createanewclass”,MFC將彈出指定新類名字和基類的對話框,如圖所示。在“name”中輸入對話框類的名字“Student”,在“BassClass”編輯框中指定其基類為CDialog。設置完成并單擊“確定”按鈕后,將出現MFC向導對話框,單擊其中的“確定”按鈕,MFC將在項目中添加對話框類Student。2023/3/30濟南大學自動化學院1910.3對話框4)上述向導過程將生成一個對話框類Student//Student.hclassStudent:publicCdialog{public:Student(CWnd*pParent=NULL);//{{AFX_DATA(Student)enum{IDD=IDD_DIALOG1}; //對話框的標識

//}}AFX_DATA//{{AFX_VIRTUAL(Student)protected:virtualvoidDoDataExchange(CDataExchange*pDX); //數據交換函數

//}}AFX_VIRTUALDECLARE_MESSAGE_MAP()};對話框標識數據交換函數,它將被自動調用,實現對話框與類的數據交換成2023/3/30濟南大學自動化學院2010.3對話框3.利用類向導添加對話框類的數據交換成員1)按快捷鍵Ctrl+W顯示類向導對話框,選中“MemberVariables”,在“Classname”列表中選中Student。在ControlIDs中列出了對話框中需要定義對應數據成員的控件ID。2)選中“IDC_Dept”,然后單擊“AddVariable”按鈕,彈出定義類成員的對話框。設置Student對話框中各控件標識對應的類成員。2023/3/30濟南大學自動化學院2110.3對話框完成上述定義,向導在該類的聲明中添加了下面的數據成員定義:classStudent:publicCDialog{public://{{AFX_DATA(Student)enum{IDD=IDD_DIALOG1};CStringm_Dept;

CStringm_Name;intm_Sex;//}}AFX_DATA……};向導添加了3個數據成員的定義2023/3/30濟南大學自動化學院2210.3對話框向導還在對話框的數據交換成員函數Student::DoDataExchange中添加了如下代碼voidStudent::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Student)DDX_Text(pDX,IDC_Dept,m_Dept);

DDX_Text(pDX,IDC_Name,m_Name);DDX_Radio(pDX,IDC_Man,m_Sex);//}}A向導添加了3個數據交換的代碼2023/3/30濟南大學自動化學院2310.3對話框4.用對話框輸入數據對話框類建立后,可以像普通類一樣使用先在要操作對話框的函數中定義對話框類的對象,并調用對話框對象的DoModal成員函數運行對話框,然后通過對話框類的數據成員就能夠獲取對話框控件中的數據。2023/3/30濟南大學自動化學院2410.3對話框本例將通過Cs10_1View類的右鍵雙擊事件打開一個Student對話框并通過該對話框輸入一個學生的檔案信息到Cs10_1View類的成員s中,然后在OnPaint成員函數中輸出從對話框輸入的學生信息。過程如下:1)在CMyView.cpp中包含對話框類的頭文件Student.h://MyView.cpp#include"stdafx.h"#include"My.h"#include"MyDoc.h"#include"MyView.h"#include"Student.h"增加對話框類的頭文件包含2023/3/30濟南大學自動化學院2510.3對話框2)添加鼠標右鍵雙擊的成員函數通過MFC的類向導,為類Cs10_1View添加鼠標右鍵雙擊事件的消息處理函數OnRButtonDblClk,并在該消息處理函數中添加如下程序代碼:voidCMyView::OnRButtonDblClk(UINTnFlags,CPointpoint){StudentstuDlg; /定義對話框對象

if(stuDlg.DoModal()==IDOK) //執行對話框

{

=stuDlg.m_Name;//獲取對話框的姓名到CMyView類中

s.dept=stuDlg.m_Dept;if(stuDlg.m_Sex==0)//分組框中值是0,表示男

s.sex="男";elses.sex="女";}InvalidateRect(FALSE);//產生WM_PAINT消息

CView::OnRButtonDblClk(nFlags,point);}2023/3/30濟南大學自動化學院2610.3對話框3)在OnPaint成員中輸出學生對象s的值,這些值是從對話框中獲取的。voidCMyView::OnPaint(){CPaintDCdc(this);LOGFONTfont;font.lfHeight=100;font.lfItalic=0;font.lfEscapement=0;font.lfCharSet=GB2312_CHARSET;font.lfUnderline=0;font.lfStrikeOut=0;CFontnFont,*oFont;nFont.CreateFontIndirect(&font);oFont=dc.SelectObject(&nFont);dc.TextOut(0,150,+""+s.dept+""+s.sex);//輸出s的各個域的值

dc.SelectObject(&oFont);}2023/3/30濟南大學自動化學院2710.4菜單和工具欄菜單:通過選擇菜單選項,可使應用程序完成與菜單項相關的命令。工具欄:工具欄為用戶提供了快捷的命令選擇方式,一般情況下工具欄的每個按鈕對應一個菜單項。用戶點擊某個按鈕,其作用與選取相應菜單選項是相同的。2023/3/30濟南大學自動化學院2810.4菜單和工具欄在VC++程序設計中,菜單和工具欄的設計過程相同,需要通過以下3個步驟實現:1)通過資源編輯器修改或建立菜單與工具欄。2)通過MFC向導建立各菜單項或工具命令按鈕的消息響應函數。3)通過應用程序框架提供的菜單或工具欄加載命令,將菜單或工具欄加載到應用程序框架中2023/3/30濟南大學自動化學院2910.4.1應用程序框架菜單例10-10,設計菜單,并通過菜單完成畫線、畫橢圓、畫矩形等功能1用菜單編輯器添加菜單欄及菜單項1)啟動VC++并打開項目文件,選擇工程管理窗口中的ResourceView標簽,展開Menu菜單資源列表項,在其中可以見到IDR_MAINFRAME,它就是應用程序菜單的標識,雙擊該標識將在右邊編輯窗口中見到它所代表的菜單內容,如圖所示2023/3/30濟南大學自動化學院3010.4.1應用程序框架菜單2)右鍵單擊圖中“幫助”菜單后面的虛線框,將彈出屬性對話框,在編輯框中輸入“繪圖”。由于“繪圖”是主菜單,選擇它時并不需要執行任何程序功能,所以其屬性對話框中的“ID”是禁用的3)完成上面的步驟后,在“繪圖”菜單欄的下面將會出現虛線框,右鍵單擊它并將其“標題”設置為“直線”,將其“ID”設置為“ID_LINE”2023/3/30濟南大學自動化學院3110.4.1應用程序框架菜單4)用同樣的方法在“直線”下面添加“矩形”,“橢圓”菜單項,并將矩形的ID設置為“ID_RECT”,將橢圓的ID設置為“ID_ELLIPSE”。5)在“繪圖”后面增加一個“學生管理”菜單,在該菜單下面添加“輸入學生檔案”菜單項,將該菜單項的ID設置為“ID_STUDENT”。6)修改或刪除菜單欄中不需要的菜單,如刪除其中的“幫助”菜單,方法是選中該菜單,然后按Delete鍵或選擇VC++“編輯”菜單中的“刪除”命令。2023/3/30濟南大學自動化學院3210.4.1應用程序框架菜單2.利用向導生成菜單消息響應函數1)按快捷鍵Ctrl+W鍵啟動MFC的類向導。2)選擇類向導中的“MessageMaps”標簽,在“Classname”下拉列表中選擇“CS10_10View”類,在“ObjectIDs”列表中具有所有的菜單標識,找到并選中“ID_LINE”菜單標識,并選中“Messages”列表中的“COMMAND”,然后單擊命令按鈕“AddFunction…”。該操作會為CS10_10View類添加消息響應函數OnLine。3)用同樣的方法為CMyView類增加ID_RECT、ID_ELLIPSE和ID_STUDENT菜單標識的消息響應函數:OnRect、OnEllipse、OnStudent。2023/3/30濟南大學自動化學院3310.4.1應用程序框架菜單經過上述操作,MFC向導會在CMyView類中完成下面的3件事。①向導將在CMyView類中添加消息響應函數的聲明,如下所示:classCMyView:publicCView{……protected:……afx_msgvoidOnLine();afx_msgvoidOnEllipse();afx_msgvoidOnRect();afx_msgvoidOnStudent();};向導添加的菜單消息處理函數2023/3/30濟南大學自動化學院3410.4.1應用程序框架菜單②向導將在程序實現文件Cs10_10View.cpp的消息映射宏中,添加菜單項與消息處理函數之間的映射,如下所示:BEGIN_MESSAGE_MAP(CMyView,CView)//{{AFX_MSG_MAP(CMyView)……

ON_COMMAND(ID_LINE,OnLine)ON_COMMAND(ID_ELLIPSE,OnEllipse)ON_COMMAND(ID_RECT,OnRect)ON_COMMAND(ID_STUDENT,OnStudent)//}}AFX_MSG_MAPEND_MESSAGE_MAP()紅字是向導添加的菜單消息映射宏2023/3/30濟南大學自動化學院3510.4.1應用程序框架菜單③向導將在類的程序文件CMyView.cpp中添加消息處理函數的雛形,如下所示。voidCMyView::OnLine(){//TODO:Addyourcommandhandlercodehere}向導添加的菜單消息處理函數雛形2023/3/30濟南大學自動化學院3610.4.1應用程序框架菜單3在向導生成的消息處理函數中添加函數功能代碼voidCMyView::OnLine() //選擇“繪圖|直線”菜單執行該函數{

CClientDCdc(this); //獲取設備環境

dc.MoveTo(50,100);//將光標移到(50,100)位置

dc.LineTo(100,300);//從光標位置即(50,100)畫直線到(100,300)}voidCMyView::OnEllipse()//選擇“繪圖|橢圓”菜單執行該函數{

CClientDCdc(this);dc.Ellipse(100,100,200,300);}2023/3/30濟南大學自動化學院3710.4.1應用程序框架菜單voidCMyView::OnRect()//選擇“繪圖|矩形”菜單執行該函數{

CClientDCdc(this);dc.Rectangle(300,100,500,200);}voidCMyView::OnStudent(){//選擇“學生管理|輸入學生檔案”執行該函數

StudentstuDlg;if(stuDlg.DoModal()==IDOK){=stuDlg.m_Name;s.dept=stuDlg.m_Dept;if(stuDlg.m_Sex==0)s.sex="男";elses.sex="女";}InvalidateRect(FALSE);}2023/3/30濟南大學自動化學院3810.4.2建立新菜單欄例10-11為例10-10重新建立一新菜單,實現同樣的功能。實現過程簡述如下1)在VC++中打開例10-10建立的項目文件,在工程管理窗口“ResourceView”中展開“Myresources”資源,右鍵單擊“Menu”,并從彈出的快捷菜單中選擇“InsertMenu”,將插入一個標識為“IDR_MENU1”的菜單。用前面的方法添加“畫圖”和“學生”菜單,如圖所示。2023/3/30濟南大學自動化學院3910.4.2建立新菜單欄新菜單IDR_MENU1,設置其中菜單項“直線”的ID為“IDR_LINE1”,“矩形”的ID為“IDR_RECT1”、“橢圓”的ID為“IDR_ELLIPSE1”,“輸入學生檔案”的ID為“ID_STUDENT1”。2023/3/30濟南大學自動化學院4010.4.2建立新菜單欄2)按快捷鍵Ctrl+W,彈出如圖a所示的對話框,選擇“Selectanexistingclass”,然后單擊“OK”按鈕,彈出如圖b所示對話框,選擇“CMyView”,然后單擊“Select”按鈕。2023/3/30濟南大學自動化學院4110.4.2建立新菜單欄3)通過消息映射向導“MessageMaps”建立菜單項IDR_LINE1、IDR_RECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函數和函數代碼。4)加載新菜單。打開CMyApp::InitInstance函數,將其中建立單文檔模板時指定的菜單標識IDR_MAINFRAME修改為新菜單的標識IDR_MENU1,如下所示。BOOLCMyApp::InitInstance(){……CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MENU1,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CMyView));……}以前這里是IDR_MAINFRAME2023/3/30濟南大學自動化學院4210.4.3工具欄操作工具欄的建立方法與菜單完全相同,但須注意兩點1)工具欄的修改或新建需要通過C++工程項目窗口“ResourceView”中的“Toolbar”選項進行2)加載新建工具欄的方法是通過CMainFrame::OnCreate成員函數實現的,如下所示。將IDR_MAINFRAME改為新工具欄的標識就行了!2023/3/30濟南大學自動化學院4310.4.3工具欄操作將其中LoadToolBar函數的參數IDR_MAINFRAME修改為新工具欄的標識就行了。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){……if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME

))//加載工具欄

……}將IDR_MAINFRAME改為新工具欄的標識就行了!2023/3/30濟南大學自動化學院4410.4.3工具欄操作例10-12建立一個工具欄,工具欄實現與菜單同樣的功能。建立過程如下:1)用與新建菜單相同的的方法插入一個工具欄Toolbar,它的默認標識為IDR_TOOLBAR1。2)通過VC++的工具編輯器在IDR_TOOLBAR1上繪制并添加4個圖形按鈕,如圖所示。2023/3/30濟南大學自動化學院4510.4.3工具欄操作3)修改命令按鈕的ID,方法是雙擊對應的按鈕圖標,在彈出的屬性對話框中修改ID。直線按鈕的ID改為“ID_TLine”,矩形按鈕的ID改為“ID_TRect”,橢圓按鈕的ID改為“ID_TEllise”,學生按鈕的ID改為“ID_TStudent”。4)通過向導指定IDR_TOOLBAR1所屬類為CS10_12View。2023/3/30濟南大學自動化學院4610.4.3工具欄操作5)通過類向導的“MessageMaps”建立各命令按鈕在CMyView類中的消息響應函數,方法與菜單消息響應函數的建立過程相同。然后在各消息響應函數中添加程序代碼,如下所示:voidCMyView::OnTEllise(){OnEllipse();}//橢圓按鈕voidCMyView::OnTLine(){nLine();}//直線按鈕voidCMyView::OnTRect(){OnRect();}//矩形按鈕voidCMyView::OnTStudent(){OnStudent();}//學生6)加載工具欄各工具按鈕的消息響應函數2023/3/30濟南大學自動化學院472023/3/30濟南大學自動化學院4810.5視圖與文檔原CFrameWnd派生類的任務分配給文檔類(CDocument)和視圖類(CView)。文檔類主要負責管理數據通過文檔類能夠方便地實現磁盤文件的存取操作。視圖類主要負責顯示文檔內容,接收用戶的輸入視圖是框架窗口中的客戶區域,是程序與用戶的接口,MFC程序常在視圖中設計數據的輸入輸出功能使用文檔/視窗結構的意義將數據操作與數據顯示分開,可以簡化工作量;一組數據可以同時以不同的形式顯示在多個視圖中10.5視圖與文檔MFC在文檔/視圖結構中提供了許多標準的操作界面包括新建文件、打開文件、保存文件、文檔打印等,大大減輕了程序員的工作量,支持打印、打印預覽和電子郵件發送功能使用AppWizard可生成基于文檔/視結構的SDI或MDI框架程序,程序員只需在其中添加與特定應用有關的部分代碼,就可完成應用程序的開發工作。2023/3/30濟南大學自動化學院4910.5視圖與文檔應用程序類(CWinApp)控制應用程序的開始運行、初始化和結束生成應用程序類對象后,這個對象自動與Widnows系統建立聯系,接收WINDOWS傳送的消息,并交給程序中相應的對象去處理。這個類中有一個重要的成員函數:INITINSTANCE,在Windows環境下,可以運行同一程序的多個實例,函數INITINSTANCE的作用是在生成的一個新的實例的時候,完成一些初始化的工作。2023/3/30濟南大學自動化學院5010.5視圖與文檔框架窗口類(CFrameWnd)CFrameWnd類是應用程序的框架窗口。所謂框架窗口是指包括菜單、工具欄、狀態欄和窗口客戶區的整個應用程序的主窗口,相當于簡單應用程序框架中所提到的主窗口。在MFC程序中,一般并不需要經常對CFrameWnd類進行操作,更多的是對視窗類進行操作,達到對程序中的數據進行編輯的修改的目的。2023/3/30濟南大學自動化學院5110.5視圖與文檔視圖類(CView)顯示數據并接收用戶的輸入和編輯信息CView類派生于Cwnd類,用于管理文檔/視圖結構中的窗口客戶區,在文檔/視圖結構中稱視圖。視圖類專門用于對應用程序的數據進行顯示,在視圖類中有一個很重要的函數OnDraw(),OnDraw()函數是用于進行應用程序數據顯示的函數,一般在派生類中要重寫這一個函數。在文檔/視圖結構中,重寫的OnDraw()函數首先清空客戶區窗口,然后再在窗口上繪制客戶需要的內容,也就是說,OnDraw()函數將集中管理所有的數據顯示工作。2023/3/30濟南大學自動化學院5210.5視圖與文檔文檔類(CDocument)管理程序操作的數據視圖類用OnDraw()函數顯示數據,但應用程序的數據一般不直接由視圖類管理,而是作為文檔類(CDocument)的數據成員,由文檔類來進行集中管理而且文檔類將直接與磁盤相聯系,把文檔類中的數據存盤,或從磁盤中取出存盤的數據。視圖類的函數GetDocument()的返回值就是指向文檔類的指針,通過這個指針就可以訪問到文檔類中的公有數據成員。

文檔類的數據要存盤或取盤要與磁盤進行數據傳遞,可以用CFile類結合CFileDialog類實現。在文檔/視圖結構中,通過文檔類中的序列化函數Serialize()就可以很簡單的完成數據存取任務。2023/3/30濟南大學自動化學院5310.5視圖與文檔文檔模板(CSingleDocTemplate、CMultiDocTemplate)文檔模板類(CDocTemplate)的作用是協調文檔/視圖結構中文檔類、視圖類和框架窗口類之間的關系;同時文檔模板類還加載了菜單以及與菜單資源使用一個ID的快捷鍵等資源;具體來說,在CWinApp派生類的InitInstance()函數中建立了文檔模板類CDocTemplate,并用文檔模板類連接資源、框架窗口、文檔和視圖。通常,一種特定的文檔模板創建并管理已打開的同種類型的所有文檔2023/3/30濟南大學自動化學院542023/3/30濟南大學自動化學院5510.5視圖與文檔應用程序對象、文檔模板、文檔及視圖的關系應用程序對象發送到視圖對象的消息發送到框架窗口的消息視圖對象框架窗口對象文檔模板對象文檔對象(保存程序數據)文檔與視圖之間雙向數據交換2023/3/30濟南大學自動化學院5610.5視圖與文檔每個視圖對象與一個唯一的文檔對象關聯視圖類有一個成員函數GetDocument可以獲取它對應的文檔對象,文檔類則有一個成員函數Serialize,它能夠實現文檔序列化。10.5視圖與文檔視圖類視圖類對象完全覆蓋框架窗口的用戶區,沒有自己的邊框。視圖規定了用戶查看文檔數據以及同數據交互的方式。CObjectCCmdTargetCWndCViewCScrollViewCFormViewCEditViewCRecordView2023/3/30濟南大學自動化學院572023/3/30濟南大學自動化學院5810.5視圖與文檔視圖類有幾個重要的成員函數GetDocument()成員函數GetDocument()的函數返回值就是指向文檔類的指針;通過這個指針就可以訪問到文檔類中的公有數據成員。OnDraw()成員函數更新視圖,其用法類似窗口類的OnPaint()函數OnInitialUpdate()虛成員函數在應用程序啟動,或用戶從File菜單中選擇了New或者Open選項時被調用這是添加某些與文檔顯示有關的初始化工作的有關代碼的地方。重載該虛函數時要注意確保調用了基類CView的OnInitialUpdate()成員函數2023/3/30濟南大學自動化學院5910.5視圖與文檔視窗類中的OnDraw成員函數每當視窗需要被重新繪制時,應用程序框架就要調用OnDraw函數。驅使程序調用OnDraw的兩個途徑:用戶改變窗口的尺寸;窗口恢復先前被遮蓋的部分;應用程序改變了窗口數據;程序中調用Invalidate(或者InvalidateRect),通知Windows調用OnDraw函數2023/3/30濟南大學自動化學院6010.5視圖與文檔文檔類成員函數OnNewDocument()成員函數來初始化文檔對象的數據成員DeleteContents()成員函數的調用有兩個作用刪除文檔的數據確信一個文檔在使用前為空SetModifiedFlag()的作用是設置數據修改標志2023/3/30濟南大學自動化學院6110.5視圖與文檔文檔序列化是指將程序數據保存在磁盤文件中,或從磁盤文件中讀取數據到程序中。文檔類的數據要存盤或取盤要與磁盤進行數據傳遞,可以用CFile類結合CFileDialog類實現。在文檔/視圖結構中,通過文檔類中的序列化函數Serialize()就可以很簡單的完成數據存取任務。10.5視圖與文檔例10-13建立應用程序,使程序能夠通過學生檔案對話框輸入學生檔案,并在屏幕上顯示輸入的學生數據,而且能夠實現學生檔案數據的磁盤存取操作。設計思路:在Cs10_13Doc類中定義學生對象,并通過Cs10_13Doc的文檔序列化函數Serialize實現學生數據的磁盤存取操作,然后在視圖類Cs10_13View中通過GetDocument獲取文檔類的指針,并通過它從磁盤文件讀取和顯示學生檔案,或將對話框中輸入的學生檔案數據存入磁盤文件中。實現過程如下。2023/3/30濟南大學自動化學院6210.5視圖與文檔1.在文檔類Cs10_13Doc中進行的程序修改1)在文檔類的頭文件Cs10_13Doc.h中定義學生數據結構STUDENT,并在文檔類的任一public區域定義一個學生對象,如下://Cs10_13Doc.hstructSTUDENT{CStringname; //CString是MFC中的字符串類

CStringdept;CStringsex;};classCs10_13Doc:publicCdocument{……public:STUDENTs;……virtualvoidSerialize(CArchive&ar);}2023/3/30濟南大學自動化學院6310.5視圖與文檔2)在文檔類的構造函數中初始化s成員,代碼如下Cs10_13Doc::Cs10_13Doc(){.Empty(); //Empty將CString的成員函數的字符串設置為空串

s.dept.Empty();s.dept.Empty();}2023/3/30

溫馨提示

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

評論

0/150

提交評論