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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

{

=stuDlg.m_Name;//獲取對(duì)話框的姓名到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é)自動(dòng)化學(xué)院2610.3對(duì)話框3)在OnPaint成員中輸出學(xué)生對(duì)象s的值,這些值是從對(duì)話框中獲取的。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的各個(gè)域的值

dc.SelectObject(&oFont);}2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院2710.4菜單和工具欄菜單:通過(guò)選擇菜單選項(xiàng),可使應(yīng)用程序完成與菜單項(xiàng)相關(guān)的命令。工具欄:工具欄為用戶提供了快捷的命令選擇方式,一般情況下工具欄的每個(gè)按鈕對(duì)應(yīng)一個(gè)菜單項(xiàng)。用戶點(diǎn)擊某個(gè)按鈕,其作用與選取相應(yīng)菜單選項(xiàng)是相同的。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院2810.4菜單和工具欄在VC++程序設(shè)計(jì)中,菜單和工具欄的設(shè)計(jì)過(guò)程相同,需要通過(guò)以下3個(gè)步驟實(shí)現(xiàn):1)通過(guò)資源編輯器修改或建立菜單與工具欄。2)通過(guò)MFC向?qū)Ы⒏鞑藛雾?xiàng)或工具命令按鈕的消息響應(yīng)函數(shù)。3)通過(guò)應(yīng)用程序框架提供的菜單或工具欄加載命令,將菜單或工具欄加載到應(yīng)用程序框架中2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院2910.4.1應(yīng)用程序框架菜單例10-10,設(shè)計(jì)菜單,并通過(guò)菜單完成畫線、畫橢圓、畫矩形等功能1用菜單編輯器添加菜單欄及菜單項(xiàng)1)啟動(dòng)VC++并打開項(xiàng)目文件,選擇工程管理窗口中的ResourceView標(biāo)簽,展開Menu菜單資源列表項(xiàng),在其中可以見到IDR_MAINFRAME,它就是應(yīng)用程序菜單的標(biāo)識(shí),雙擊該標(biāo)識(shí)將在右邊編輯窗口中見到它所代表的菜單內(nèi)容,如圖所示2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院3010.4.1應(yīng)用程序框架菜單2)右鍵單擊圖中“幫助”菜單后面的虛線框,將彈出屬性對(duì)話框,在編輯框中輸入“繪圖”。由于“繪圖”是主菜單,選擇它時(shí)并不需要執(zhí)行任何程序功能,所以其屬性對(duì)話框中的“ID”是禁用的3)完成上面的步驟后,在“繪圖”菜單欄的下面將會(huì)出現(xiàn)虛線框,右鍵單擊它并將其“標(biāo)題”設(shè)置為“直線”,將其“ID”設(shè)置為“ID_LINE”2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院3110.4.1應(yīng)用程序框架菜單4)用同樣的方法在“直線”下面添加“矩形”,“橢圓”菜單項(xiàng),并將矩形的ID設(shè)置為“ID_RECT”,將橢圓的ID設(shè)置為“ID_ELLIPSE”。5)在“繪圖”后面增加一個(gè)“學(xué)生管理”菜單,在該菜單下面添加“輸入學(xué)生檔案”菜單項(xiàng),將該菜單項(xiàng)的ID設(shè)置為“ID_STUDENT”。6)修改或刪除菜單欄中不需要的菜單,如刪除其中的“幫助”菜單,方法是選中該菜單,然后按Delete鍵或選擇VC++“編輯”菜單中的“刪除”命令。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院3210.4.1應(yīng)用程序框架菜單2.利用向?qū)刹藛蜗㈨憫?yīng)函數(shù)1)按快捷鍵Ctrl+W鍵啟動(dòng)MFC的類向?qū)А?)選擇類向?qū)е械摹癕essageMaps”標(biāo)簽,在“Classname”下拉列表中選擇“CS10_10View”類,在“ObjectIDs”列表中具有所有的菜單標(biāo)識(shí),找到并選中“ID_LINE”菜單標(biāo)識(shí),并選中“Messages”列表中的“COMMAND”,然后單擊命令按鈕“AddFunction…”。該操作會(huì)為CS10_10View類添加消息響應(yīng)函數(shù)OnLine。3)用同樣的方法為CMyView類增加ID_RECT、ID_ELLIPSE和ID_STUDENT菜單標(biāo)識(shí)的消息響應(yīng)函數(shù):OnRect、OnEllipse、OnStudent。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院3310.4.1應(yīng)用程序框架菜單經(jīng)過(guò)上述操作,MFC向?qū)?huì)在CMyView類中完成下面的3件事。①向?qū)⒃贑MyView類中添加消息響應(yīng)函數(shù)的聲明,如下所示:classCMyView:publicCView{……protected:……afx_msgvoidOnLine();afx_msgvoidOnEllipse();afx_msgvoidOnRect();afx_msgvoidOnStudent();};向?qū)砑拥牟藛蜗⑻幚砗瘮?shù)2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院3410.4.1應(yīng)用程序框架菜單②向?qū)⒃诔绦驅(qū)崿F(xiàn)文件Cs10_10View.cpp的消息映射宏中,添加菜單項(xiàng)與消息處理函數(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é)自動(dòng)化學(xué)院3510.4.1應(yīng)用程序框架菜單③向?qū)⒃陬惖某绦蛭募﨏MyView.cpp中添加消息處理函數(shù)的雛形,如下所示。voidCMyView::OnLine(){//TODO:Addyourcommandhandlercodehere}向?qū)砑拥牟藛蜗⑻幚砗瘮?shù)雛形2023/3/30濟(jì)南大學(xué)自動(dòng)化學(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é)自動(dòng)化學(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é)自動(dòng)化學(xué)院3810.4.2建立新菜單欄例10-11為例10-10重新建立一新菜單,實(shí)現(xiàn)同樣的功能。實(shí)現(xiàn)過(guò)程簡(jiǎn)述如下1)在VC++中打開例10-10建立的項(xiàng)目文件,在工程管理窗口“ResourceView”中展開“Myresources”資源,右鍵單擊“Menu”,并從彈出的快捷菜單中選擇“InsertMenu”,將插入一個(gè)標(biāo)識(shí)為“IDR_MENU1”的菜單。用前面的方法添加“畫圖”和“學(xué)生”菜單,如圖所示。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院3910.4.2建立新菜單欄新菜單IDR_MENU1,設(shè)置其中菜單項(xiàng)“直線”的ID為“IDR_LINE1”,“矩形”的ID為“IDR_RECT1”、“橢圓”的ID為“IDR_ELLIPSE1”,“輸入學(xué)生檔案”的ID為“ID_STUDENT1”。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4010.4.2建立新菜單欄2)按快捷鍵Ctrl+W,彈出如圖a所示的對(duì)話框,選擇“Selectanexistingclass”,然后單擊“OK”按鈕,彈出如圖b所示對(duì)話框,選擇“CMyView”,然后單擊“Select”按鈕。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4110.4.2建立新菜單欄3)通過(guò)消息映射向?qū)А癕essageMaps”建立菜單項(xiàng)IDR_LINE1、IDR_RECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函數(shù)和函數(shù)代碼。4)加載新菜單。打開CMyApp::InitInstance函數(shù),將其中建立單文檔模板時(shí)指定的菜單標(biāo)識(shí)IDR_MAINFRAME修改為新菜單的標(biāo)識(shí)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é)自動(dòng)化學(xué)院4210.4.3工具欄操作工具欄的建立方法與菜單完全相同,但須注意兩點(diǎn)1)工具欄的修改或新建需要通過(guò)C++工程項(xiàng)目窗口“ResourceView”中的“Toolbar”選項(xiàng)進(jìn)行2)加載新建工具欄的方法是通過(guò)CMainFrame::OnCreate成員函數(shù)實(shí)現(xiàn)的,如下所示。將IDR_MAINFRAME改為新工具欄的標(biāo)識(shí)就行了!2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4310.4.3工具欄操作將其中LoadToolBar函數(shù)的參數(shù)IDR_MAINFRAME修改為新工具欄的標(biāo)識(shí)就行了。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)識(shí)就行了!2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4410.4.3工具欄操作例10-12建立一個(gè)工具欄,工具欄實(shí)現(xiàn)與菜單同樣的功能。建立過(guò)程如下:1)用與新建菜單相同的的方法插入一個(gè)工具欄Toolbar,它的默認(rèn)標(biāo)識(shí)為IDR_TOOLBAR1。2)通過(guò)VC++的工具編輯器在IDR_TOOLBAR1上繪制并添加4個(gè)圖形按鈕,如圖所示。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4510.4.3工具欄操作3)修改命令按鈕的ID,方法是雙擊對(duì)應(yīng)的按鈕圖標(biāo),在彈出的屬性對(duì)話框中修改ID。直線按鈕的ID改為“ID_TLine”,矩形按鈕的ID改為“ID_TRect”,橢圓按鈕的ID改為“ID_TEllise”,學(xué)生按鈕的ID改為“ID_TStudent”。4)通過(guò)向?qū)е付↖DR_TOOLBAR1所屬類為CS10_12View。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4610.4.3工具欄操作5)通過(guò)類向?qū)У摹癕essageMaps”建立各命令按鈕在CMyView類中的消息響應(yīng)函數(shù),方法與菜單消息響應(yīng)函數(shù)的建立過(guò)程相同。然后在各消息響應(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é)自動(dòng)化學(xué)院472023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院4810.5視圖與文檔原CFrameWnd派生類的任務(wù)分配給文檔類(CDocument)和視圖類(CView)。文檔類主要負(fù)責(zé)管理數(shù)據(jù)通過(guò)文檔類能夠方便地實(shí)現(xiàn)磁盤文件的存取操作。視圖類主要負(fù)責(zé)顯示文檔內(nèi)容,接收用戶的輸入視圖是框架窗口中的客戶區(qū)域,是程序與用戶的接口,MFC程序常在視圖中設(shè)計(jì)數(shù)據(jù)的輸入輸出功能使用文檔/視窗結(jié)構(gòu)的意義將數(shù)據(jù)操作與數(shù)據(jù)顯示分開,可以簡(jiǎn)化工作量;一組數(shù)據(jù)可以同時(shí)以不同的形式顯示在多個(gè)視圖中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é)自動(dòng)化學(xué)院4910.5視圖與文檔應(yīng)用程序類(CWinApp)控制應(yīng)用程序的開始運(yùn)行、初始化和結(jié)束生成應(yīng)用程序類對(duì)象后,這個(gè)對(duì)象自動(dòng)與Widnows系統(tǒng)建立聯(lián)系,接收WINDOWS傳送的消息,并交給程序中相應(yīng)的對(duì)象去處理。這個(gè)類中有一個(gè)重要的成員函數(shù):INITINSTANCE,在Windows環(huán)境下,可以運(yùn)行同一程序的多個(gè)實(shí)例,函數(shù)INITINSTANCE的作用是在生成的一個(gè)新的實(shí)例的時(shí)候,完成一些初始化的工作。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院5010.5視圖與文檔框架窗口類(CFrameWnd)CFrameWnd類是應(yīng)用程序的框架窗口。所謂框架窗口是指包括菜單、工具欄、狀態(tài)欄和窗口客戶區(qū)的整個(gè)應(yīng)用程序的主窗口,相當(dāng)于簡(jiǎn)單應(yīng)用程序框架中所提到的主窗口。在MFC程序中,一般并不需要經(jīng)常對(duì)CFrameWnd類進(jìn)行操作,更多的是對(duì)視窗類進(jìn)行操作,達(dá)到對(duì)程序中的數(shù)據(jù)進(jìn)行編輯的修改的目的。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院5110.5視圖與文檔視圖類(CView)顯示數(shù)據(jù)并接收用戶的輸入和編輯信息CView類派生于Cwnd類,用于管理文檔/視圖結(jié)構(gòu)中的窗口客戶區(qū),在文檔/視圖結(jié)構(gòu)中稱視圖。視圖類專門用于對(duì)應(yīng)用程序的數(shù)據(jù)進(jìn)行顯示,在視圖類中有一個(gè)很重要的函數(shù)OnDraw(),OnDraw()函數(shù)是用于進(jìn)行應(yīng)用程序數(shù)據(jù)顯示的函數(shù),一般在派生類中要重寫這一個(gè)函數(shù)。在文檔/視圖結(jié)構(gòu)中,重寫的OnDraw()函數(shù)首先清空客戶區(qū)窗口,然后再在窗口上繪制客戶需要的內(nèi)容,也就是說(shuō),OnDraw()函數(shù)將集中管理所有的數(shù)據(jù)顯示工作。2023/3/30濟(jì)南大學(xué)自動(dòng)化學(xué)院5210.5視圖與文檔文檔類(CDocument)管理程序操作的數(shù)據(jù)視圖類用OnDraw()函數(shù)顯示數(shù)據(jù),但應(yīng)用程序的數(shù)據(jù)一般不直接由視圖類管理,而是作為文檔類(CDocument)的數(shù)據(jù)成員,由文檔類來(lái)進(jìn)行集中管理而且文檔類將直接與磁盤相聯(lián)系,把文檔類中的數(shù)據(jù)存盤,或從磁盤中取出存盤的數(shù)據(jù)。視圖類的函數(shù)GetDocument()的返回值就是指向文檔類的指針,通過(guò)這個(gè)指針就可以訪問(wèn)到文檔類中的公有數(shù)據(jù)成員。

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

CStringdept;CStringsex;};classCs10_13Doc:publicCdocument{……public:STUDENTs;……virtualvoidSerialize(CArchive&ar);}2023/3/30濟(jì)南大學(xué)自動(dòng)化學(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論