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

下載本文檔

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

文檔簡介

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

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

//}}AFX_VIRTUALDECLARE_MESSAGE_MAP()};對話框標(biāo)識數(shù)據(jù)交換函數(shù),它將被自動調(diào)用,實現(xiàn)對話框與類的數(shù)據(jù)交換成2023/3/30濟(jì)南大學(xué)自動化學(xué)院2010.3對話框3.利用類向?qū)砑訉υ捒蝾惖臄?shù)據(jù)交換成員1)按快捷鍵Ctrl+W顯示類向?qū)υ捒?,選中“MemberVariables”,在“Classname”列表中選中Student。在ControlIDs中列出了對話框中需要定義對應(yīng)數(shù)據(jù)成員的控件ID。2)選中“IDC_Dept”,然后單擊“AddVariable”按鈕,彈出定義類成員的對話框。設(shè)置Student對話框中各控件標(biāo)識對應(yīng)的類成員。2023/3/30濟(jì)南大學(xué)自動化學(xué)院2110.3對話框完成上述定義,向?qū)г谠擃惖穆暶髦刑砑恿讼旅娴臄?shù)據(jù)成員定義:classStudent:publicCDialog{public://{{AFX_DATA(Student)enum{IDD=IDD_DIALOG1};CStringm_Dept;

CStringm_Name;intm_Sex;//}}AFX_DATA……};向?qū)砑恿?個數(shù)據(jù)成員的定義2023/3/30濟(jì)南大學(xué)自動化學(xué)院2210.3對話框向?qū)н€在對話框的數(shù)據(jù)交換成員函數(shù)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向?qū)砑恿?個數(shù)據(jù)交換的代碼2023/3/30濟(jì)南大學(xué)自動化學(xué)院2310.3對話框4.用對話框輸入數(shù)據(jù)對話框類建立后,可以像普通類一樣使用先在要操作對話框的函數(shù)中定義對話框類的對象,并調(diào)用對話框?qū)ο蟮腄oModal成員函數(shù)運行對話框,然后通過對話框類的數(shù)據(jù)成員就能夠獲取對話框控件中的數(shù)據(jù)。2023/3/30濟(jì)南大學(xué)自動化學(xué)院2410.3對話框本例將通過Cs10_1View類的右鍵雙擊事件打開一個Student對話框并通過該對話框輸入一個學(xué)生的檔案信息到Cs10_1View類的成員s中,然后在OnPaint成員函數(shù)中輸出從對話框輸入的學(xué)生信息。過程如下: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濟(jì)南大學(xué)自動化學(xué)院2510.3對話框2)添加鼠標(biāo)右鍵雙擊的成員函數(shù)通過MFC的類向?qū)?,為類Cs10_1View添加鼠標(biāo)右鍵雙擊事件的消息處理函數(shù)OnRButtonDblClk,并在該消息處理函數(shù)中添加如下程序代碼:voidCMyView::OnRButtonDblClk(UINTnFlags,CPointpoint){StudentstuDlg; /定義對話框?qū)ο?/p>

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

{

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

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

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

CView::OnRButtonDblClk(nFlags,point);}2023/3/30濟(jì)南大學(xué)自動化學(xué)院2610.3對話框3)在OnPaint成員中輸出學(xué)生對象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濟(jì)南大學(xué)自動化學(xué)院2710.4菜單和工具欄菜單:通過選擇菜單選項,可使應(yīng)用程序完成與菜單項相關(guān)的命令。工具欄:工具欄為用戶提供了快捷的命令選擇方式,一般情況下工具欄的每個按鈕對應(yīng)一個菜單項。用戶點擊某個按鈕,其作用與選取相應(yīng)菜單選項是相同的。2023/3/30濟(jì)南大學(xué)自動化學(xué)院2810.4菜單和工具欄在VC++程序設(shè)計中,菜單和工具欄的設(shè)計過程相同,需要通過以下3個步驟實現(xiàn):1)通過資源編輯器修改或建立菜單與工具欄。2)通過MFC向?qū)Ы⒏鞑藛雾椈蚬ぞ呙畎粹o的消息響應(yīng)函數(shù)。3)通過應(yīng)用程序框架提供的菜單或工具欄加載命令,將菜單或工具欄加載到應(yīng)用程序框架中2023/3/30濟(jì)南大學(xué)自動化學(xué)院2910.4.1應(yīng)用程序框架菜單例10-10,設(shè)計菜單,并通過菜單完成畫線、畫橢圓、畫矩形等功能1用菜單編輯器添加菜單欄及菜單項1)啟動VC++并打開項目文件,選擇工程管理窗口中的ResourceView標(biāo)簽,展開Menu菜單資源列表項,在其中可以見到IDR_MAINFRAME,它就是應(yīng)用程序菜單的標(biāo)識,雙擊該標(biāo)識將在右邊編輯窗口中見到它所代表的菜單內(nèi)容,如圖所示2023/3/30濟(jì)南大學(xué)自動化學(xué)院3010.4.1應(yīng)用程序框架菜單2)右鍵單擊圖中“幫助”菜單后面的虛線框,將彈出屬性對話框,在編輯框中輸入“繪圖”。由于“繪圖”是主菜單,選擇它時并不需要執(zhí)行任何程序功能,所以其屬性對話框中的“ID”是禁用的3)完成上面的步驟后,在“繪圖”菜單欄的下面將會出現(xiàn)虛線框,右鍵單擊它并將其“標(biāo)題”設(shè)置為“直線”,將其“ID”設(shè)置為“ID_LINE”2023/3/30濟(jì)南大學(xué)自動化學(xué)院3110.4.1應(yīng)用程序框架菜單4)用同樣的方法在“直線”下面添加“矩形”,“橢圓”菜單項,并將矩形的ID設(shè)置為“ID_RECT”,將橢圓的ID設(shè)置為“ID_ELLIPSE”。5)在“繪圖”后面增加一個“學(xué)生管理”菜單,在該菜單下面添加“輸入學(xué)生檔案”菜單項,將該菜單項的ID設(shè)置為“ID_STUDENT”。6)修改或刪除菜單欄中不需要的菜單,如刪除其中的“幫助”菜單,方法是選中該菜單,然后按Delete鍵或選擇VC++“編輯”菜單中的“刪除”命令。2023/3/30濟(jì)南大學(xué)自動化學(xué)院3210.4.1應(yīng)用程序框架菜單2.利用向?qū)刹藛蜗㈨憫?yīng)函數(shù)1)按快捷鍵Ctrl+W鍵啟動MFC的類向?qū)А?)選擇類向?qū)е械摹癕essageMaps”標(biāo)簽,在“Classname”下拉列表中選擇“CS10_10View”類,在“ObjectIDs”列表中具有所有的菜單標(biāo)識,找到并選中“ID_LINE”菜單標(biāo)識,并選中“Messages”列表中的“COMMAND”,然后單擊命令按鈕“AddFunction…”。該操作會為CS10_10View類添加消息響應(yīng)函數(shù)OnLine。3)用同樣的方法為CMyView類增加ID_RECT、ID_ELLIPSE和ID_STUDENT菜單標(biāo)識的消息響應(yīng)函數(shù):OnRect、OnEllipse、OnStudent。2023/3/30濟(jì)南大學(xué)自動化學(xué)院3310.4.1應(yīng)用程序框架菜單經(jīng)過上述操作,MFC向?qū)贑MyView類中完成下面的3件事。①向?qū)⒃贑MyView類中添加消息響應(yīng)函數(shù)的聲明,如下所示:classCMyView:publicCView{……protected:……afx_msgvoidOnLine();afx_msgvoidOnEllipse();afx_msgvoidOnRect();afx_msgvoidOnStudent();};向?qū)砑拥牟藛蜗⑻幚砗瘮?shù)2023/3/30濟(jì)南大學(xué)自動化學(xué)院3410.4.1應(yīng)用程序框架菜單②向?qū)⒃诔绦驅(qū)崿F(xiàn)文件Cs10_10View.cpp的消息映射宏中,添加菜單項與消息處理函數(shù)之間的映射,如下所示: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()紅字是向?qū)砑拥牟藛蜗⒂成浜?023/3/30濟(jì)南大學(xué)自動化學(xué)院3510.4.1應(yīng)用程序框架菜單③向?qū)⒃陬惖某绦蛭募﨏MyView.cpp中添加消息處理函數(shù)的雛形,如下所示。voidCMyView::OnLine(){//TODO:Addyourcommandhandlercodehere}向?qū)砑拥牟藛蜗⑻幚砗瘮?shù)雛形2023/3/30濟(jì)南大學(xué)自動化學(xué)院3610.4.1應(yīng)用程序框架菜單3在向?qū)傻南⑻幚砗瘮?shù)中添加函數(shù)功能代碼voidCMyView::OnLine() //選擇“繪圖|直線”菜單執(zhí)行該函數(shù){

CClientDCdc(this); //獲取設(shè)備環(huán)境

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

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

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

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

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濟(jì)南大學(xué)自動化學(xué)院3810.4.2建立新菜單欄例10-11為例10-10重新建立一新菜單,實現(xiàn)同樣的功能。實現(xiàn)過程簡述如下1)在VC++中打開例10-10建立的項目文件,在工程管理窗口“ResourceView”中展開“Myresources”資源,右鍵單擊“Menu”,并從彈出的快捷菜單中選擇“InsertMenu”,將插入一個標(biāo)識為“IDR_MENU1”的菜單。用前面的方法添加“畫圖”和“學(xué)生”菜單,如圖所示。2023/3/30濟(jì)南大學(xué)自動化學(xué)院3910.4.2建立新菜單欄新菜單IDR_MENU1,設(shè)置其中菜單項“直線”的ID為“IDR_LINE1”,“矩形”的ID為“IDR_RECT1”、“橢圓”的ID為“IDR_ELLIPSE1”,“輸入學(xué)生檔案”的ID為“ID_STUDENT1”。2023/3/30濟(jì)南大學(xué)自動化學(xué)院4010.4.2建立新菜單欄2)按快捷鍵Ctrl+W,彈出如圖a所示的對話框,選擇“Selectanexistingclass”,然后單擊“OK”按鈕,彈出如圖b所示對話框,選擇“CMyView”,然后單擊“Select”按鈕。2023/3/30濟(jì)南大學(xué)自動化學(xué)院4110.4.2建立新菜單欄3)通過消息映射向?qū)А癕essageMaps”建立菜單項IDR_LINE1、IDR_RECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函數(shù)和函數(shù)代碼。4)加載新菜單。打開CMyApp::InitInstance函數(shù),將其中建立單文檔模板時指定的菜單標(biāo)識IDR_MAINFRAME修改為新菜單的標(biāo)識IDR_MENU1,如下所示。BOOLCMyApp::InitInstance(){……CSingleDocTemplate*pDocTemplate;pDocTemplate=newCSingleDocTemplate(IDR_MENU1,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CMyView));……}以前這里是IDR_MAINFRAME2023/3/30濟(jì)南大學(xué)自動化學(xué)院4210.4.3工具欄操作工具欄的建立方法與菜單完全相同,但須注意兩點1)工具欄的修改或新建需要通過C++工程項目窗口“ResourceView”中的“Toolbar”選項進(jìn)行2)加載新建工具欄的方法是通過CMainFrame::OnCreate成員函數(shù)實現(xiàn)的,如下所示。將IDR_MAINFRAME改為新工具欄的標(biāo)識就行了!2023/3/30濟(jì)南大學(xué)自動化學(xué)院4310.4.3工具欄操作將其中LoadToolBar函數(shù)的參數(shù)IDR_MAINFRAME修改為新工具欄的標(biāo)識就行了。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改為新工具欄的標(biāo)識就行了!2023/3/30濟(jì)南大學(xué)自動化學(xué)院4410.4.3工具欄操作例10-12建立一個工具欄,工具欄實現(xiàn)與菜單同樣的功能。建立過程如下:1)用與新建菜單相同的的方法插入一個工具欄Toolbar,它的默認(rèn)標(biāo)識為IDR_TOOLBAR1。2)通過VC++的工具編輯器在IDR_TOOLBAR1上繪制并添加4個圖形按鈕,如圖所示。2023/3/30濟(jì)南大學(xué)自動化學(xué)院4510.4.3工具欄操作3)修改命令按鈕的ID,方法是雙擊對應(yīng)的按鈕圖標(biāo),在彈出的屬性對話框中修改ID。直線按鈕的ID改為“ID_TLine”,矩形按鈕的ID改為“ID_TRect”,橢圓按鈕的ID改為“ID_TEllise”,學(xué)生按鈕的ID改為“ID_TStudent”。4)通過向?qū)е付↖DR_TOOLBAR1所屬類為CS10_12View。2023/3/30濟(jì)南大學(xué)自動化學(xué)院4610.4.3工具欄操作5)通過類向?qū)У摹癕essageMaps”建立各命令按鈕在CMyView類中的消息響應(yīng)函數(shù),方法與菜單消息響應(yīng)函數(shù)的建立過程相同。然后在各消息響應(yīng)函數(shù)中添加程序代碼,如下所示:voidCMyView::OnTEllise(){OnEllipse();}//橢圓按鈕voidCMyView::OnTLine(){nLine();}//直線按鈕voidCMyView::OnTRect(){OnRect();}//矩形按鈕voidCMyView::OnTStudent(){OnStudent();}//學(xué)生6)加載工具欄各工具按鈕的消息響應(yīng)函數(shù)2023/3/30濟(jì)南大學(xué)自動化學(xué)院472023/3/30濟(jì)南大學(xué)自動化學(xué)院4810.5視圖與文檔原CFrameWnd派生類的任務(wù)分配給文檔類(CDocument)和視圖類(CView)。文檔類主要負(fù)責(zé)管理數(shù)據(jù)通過文檔類能夠方便地實現(xiàn)磁盤文件的存取操作。視圖類主要負(fù)責(zé)顯示文檔內(nèi)容,接收用戶的輸入視圖是框架窗口中的客戶區(qū)域,是程序與用戶的接口,MFC程序常在視圖中設(shè)計數(shù)據(jù)的輸入輸出功能使用文檔/視窗結(jié)構(gòu)的意義將數(shù)據(jù)操作與數(shù)據(jù)顯示分開,可以簡化工作量;一組數(shù)據(jù)可以同時以不同的形式顯示在多個視圖中10.5視圖與文檔MFC在文檔/視圖結(jié)構(gòu)中提供了許多標(biāo)準(zhǔn)的操作界面包括新建文件、打開文件、保存文件、文檔打印等,大大減輕了程序員的工作量,支持打印、打印預(yù)覽和電子郵件發(fā)送功能使用AppWizard可生成基于文檔/視結(jié)構(gòu)的SDI或MDI框架程序,程序員只需在其中添加與特定應(yīng)用有關(guān)的部分代碼,就可完成應(yīng)用程序的開發(fā)工作。2023/3/30濟(jì)南大學(xué)自動化學(xué)院4910.5視圖與文檔應(yīng)用程序類(CWinApp)控制應(yīng)用程序的開始運行、初始化和結(jié)束生成應(yīng)用程序類對象后,這個對象自動與Widnows系統(tǒng)建立聯(lián)系,接收WINDOWS傳送的消息,并交給程序中相應(yīng)的對象去處理。這個類中有一個重要的成員函數(shù):INITINSTANCE,在Windows環(huán)境下,可以運行同一程序的多個實例,函數(shù)INITINSTANCE的作用是在生成的一個新的實例的時候,完成一些初始化的工作。2023/3/30濟(jì)南大學(xué)自動化學(xué)院5010.5視圖與文檔框架窗口類(CFrameWnd)CFrameWnd類是應(yīng)用程序的框架窗口。所謂框架窗口是指包括菜單、工具欄、狀態(tài)欄和窗口客戶區(qū)的整個應(yīng)用程序的主窗口,相當(dāng)于簡單應(yīng)用程序框架中所提到的主窗口。在MFC程序中,一般并不需要經(jīng)常對CFrameWnd類進(jìn)行操作,更多的是對視窗類進(jìn)行操作,達(dá)到對程序中的數(shù)據(jù)進(jìn)行編輯的修改的目的。2023/3/30濟(jì)南大學(xué)自動化學(xué)院5110.5視圖與文檔視圖類(CView)顯示數(shù)據(jù)并接收用戶的輸入和編輯信息CView類派生于Cwnd類,用于管理文檔/視圖結(jié)構(gòu)中的窗口客戶區(qū),在文檔/視圖結(jié)構(gòu)中稱視圖。視圖類專門用于對應(yīng)用程序的數(shù)據(jù)進(jìn)行顯示,在視圖類中有一個很重要的函數(shù)OnDraw(),OnDraw()函數(shù)是用于進(jìn)行應(yīng)用程序數(shù)據(jù)顯示的函數(shù),一般在派生類中要重寫這一個函數(shù)。在文檔/視圖結(jié)構(gòu)中,重寫的OnDraw()函數(shù)首先清空客戶區(qū)窗口,然后再在窗口上繪制客戶需要的內(nèi)容,也就是說,OnDraw()函數(shù)將集中管理所有的數(shù)據(jù)顯示工作。2023/3/30濟(jì)南大學(xué)自動化學(xué)院5210.5視圖與文檔文檔類(CDocument)管理程序操作的數(shù)據(jù)視圖類用OnDraw()函數(shù)顯示數(shù)據(jù),但應(yīng)用程序的數(shù)據(jù)一般不直接由視圖類管理,而是作為文檔類(CDocument)的數(shù)據(jù)成員,由文檔類來進(jìn)行集中管理而且文檔類將直接與磁盤相聯(lián)系,把文檔類中的數(shù)據(jù)存盤,或從磁盤中取出存盤的數(shù)據(jù)。視圖類的函數(shù)GetDocument()的返回值就是指向文檔類的指針,通過這個指針就可以訪問到文檔類中的公有數(shù)據(jù)成員。

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

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

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

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論