《面向?qū)ο蟮某绦蛟O(shè)計語言-C》課件-第6章.ppt
《《面向?qū)ο蟮某绦蛟O(shè)計語言-C》課件-第6章.ppt》由會員分享,可在線閱讀,更多相關(guān)《《面向?qū)ο蟮某绦蛟O(shè)計語言-C》課件-第6章.ppt(75頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1,第六章菜單、工具欄和狀態(tài)欄,本章導(dǎo)讀掌握菜單的創(chuàng)建步驟和方法,如何進行命令消息的映射和編寫相應(yīng)的程序代碼。掌握CMenu類及其常用成員函數(shù)的功能和使用方法,掌握利用這些成員函數(shù)創(chuàng)建快捷菜單和實現(xiàn)動態(tài)增加或減少菜單項。掌握工具欄的創(chuàng)建方法和步驟,如何將工具欄的功能與菜單的功能相對應(yīng)。掌握創(chuàng)建狀態(tài)欄的方法和步驟。學(xué)習(xí)和掌握CMenu類、CStatusBar類、CToolBar類、CCmdUI類及常用成員函數(shù)的功能和使用。菜單、工具欄和狀態(tài)欄是Windows應(yīng)用程序中最重要的三個用戶界面元素,是應(yīng)用程序設(shè)計中不可缺少的步驟。,2,6.1創(chuàng)建菜單,菜單是一系列命令的列表,是最常用的命令輸入方式。在Windows中,幾乎所有的命令操作都與菜單有關(guān)。Windows應(yīng)用程序中的菜單是按照一定層次來進行組織的,包括菜單項和彈出菜單,其中彈出菜單又可以包括菜單項和其他的彈出菜單。1.創(chuàng)建菜單資源菜單中的每一個菜單項都由菜單項名和命令I(lǐng)D號兩個基本要素組成。在菜單資源中,每個菜單項都必須有一個唯一的命令I(lǐng)D號來對它進行標識,這個ID號是系統(tǒng)在對菜單項進行識別時使用的。對于用戶而言,菜單項的標識是利用它所屬的彈出菜單和菜單項的句子來標識的,比如ID_FILE_OPEN,其所屬的彈出菜單是【文件】,菜單項名稱為【打開】。,3,創(chuàng)建菜單可以有幾種方法,最簡單的方法是用菜單資源編輯器進行設(shè)計。在這里,我們把第五章關(guān)于模式對話框的例子進行改造,使對話框的彈出方式由在窗口中雙擊鼠標改為由單擊某個菜單命令實現(xiàn)。具體步驟如下:步驟一:在VisualC++6.0中,選【File】菜單中的【OpenWorkspace】菜單項,打開已創(chuàng)建的“Dialog.dsw”文件。步驟二:在工作區(qū)窗口中選擇【ResourceView】選項卡,展開【DialogResources】目錄,再展開【Menu】文件,將會看到菜單IDR_MAINFRAME。步驟三:雙擊IDR_MAINFRAME,將在菜單資源編輯器中打開菜單資源。步驟四:在主菜單中增加一個【顯示】菜單。用鼠標雙擊主菜單最右邊的空菜單項,或者用鼠標右擊,在彈出的快捷菜單中選擇【Properties】菜單項。系統(tǒng)將彈出屬性對話框。,4,在【Caption】欄中輸入“顯示(afx_msgvoidOnDisplayData();//ClassWizard自動添加的//}}AFX_MSGDECLARE_MESSAGE_MAP()};,14,其中://{{AFX_MSG(CDialogView)……//}}AFX_MSG是ClassWizard分別用來識別命令消息處理函數(shù)定義的起始標記和結(jié)束標記,在AFX_MSG(CDialogView)后面括號內(nèi)的CDialogView表示是處理該消息的類。2.在CDialogView類的實現(xiàn)文件DialogView.cpp中的消息映射部分也進行了一些修改:BEGIN_MESSAGE_MAP(CDialogView,CView)//{{AFX_MSG_MAP(CDialogView),15,ON_WM_LBUTTONDBLCLK()ON_COMMAND(ID_DISPLAY_DATA,OnDisplayData)//ClassWizard自動添加的//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中://{{AFX_MSG_MAP(CDialogView)……//}}AFX_MSG_MAP是ClassWizard標識命令消息處理映射機制的起始標記和結(jié)束標記。,16,3.在DialogView.cpp文件中編寫OnDisplayData函數(shù)的代碼。把DialogView.cpp文件中響應(yīng)雙擊窗口的函數(shù)OnLButtonDBLCLK()的代碼復(fù)制到OnDisplayData()函數(shù)中,具體代碼如下:voidCDialogView::OnDisplayData(){//TODO:AddyourcommandhandlercodehereCMydataDialogdlg;dlg.m_radio_m=0;dlg.m_edit_name="";CStringmsg;if(dlg.DoModal()==IDOK){msg="按鈕被按下!";}Else{msg="按鈕被按下!";},17,msg+="\r\n";msg+="姓名:";msg+=dlg.m_edit_name;msg+="\r\n";msg+="性別:";switch(dlg.m_radio_m){case0:msg+="男";break;case1:msg+="女";break;}msg+="\r\n";msg+="最高學(xué)歷:";msg+=dlg.m_combo_school;msg+="\r\n";msg+="愛好:";,18,if(dlg.m_check_art==TRUE)msg+="藝術(shù)";if(dlg.m_check_music==TRUE)msg+="音樂";if(dlg.m_check_sport==TRUE)msg+="體育";AfxMessageBox(msg);}步驟五:編譯運行并測試此應(yīng)用程序。當選擇【顯示】菜單中的【個人資料】菜單項,或單擊Ctrl+D鍵時,將彈出【個人資料】對話框,在對話框內(nèi)可以進行各種設(shè)置,然后單擊【確認】或【取消】按鈕退出??梢钥吹狡湫Чc雙擊應(yīng)用程序窗口是一樣的。,19,4.CMenu類及其常用成員函數(shù)介紹VisualC++的MFC提供的菜單類Cmenu的對象可以用來表示各種Windows菜單,其中包括頂層菜單項及其相應(yīng)的彈出式菜單。并且該類可以在程序運行時處理有關(guān)菜單的操作,如創(chuàng)建菜單、裝入菜單、刪除菜單項、獲取或設(shè)置菜單項的狀態(tài)等。創(chuàng)建菜單CMenu類的成員函數(shù)CreateMenu和CreatePopupMenu分別用來創(chuàng)建一個菜單或子菜單框架,其函數(shù)原型如下:BOOLCreateMenu();//產(chǎn)生一個空菜單BOOLCreatePopupMenu();//產(chǎn)生一個空彈出式子菜單,20,裝入菜單CMenu類的成員函數(shù)LoadMenu可用來將菜單資源裝入應(yīng)用程序中,它的函數(shù)原型有兩種,如下所示:BOOLLoadMenu(LPCTSTRlpszResourceName);BOOLLoadMenu(UNITnIDResource);其中:形參lpszResourceName表示菜單資源的名稱,形參nIDResource為菜單資源的ID號。添加菜單項當菜單創(chuàng)建后,可以調(diào)用CMenu類提供的成員函數(shù)AppendMenu或InsertMenu來向菜單中添加一些菜單項,但每次添加時,函數(shù)AppendMenu是將菜單項添加在菜單的末尾處,而InsertMenu是在指定的位置處插入菜單項,并將后面的菜單項依次下移。它們的函數(shù)原型如下:,21,BOOLAppendMenu(UNITnFlags,UNITnIDNewItem,constCBitmap*pBmp);BOOLAppendMenu(UNITnFlags,UNITnIDNewItem=0,LPCTSTRlpszNewItem=NULL);BOOLInsertMenu(UNITnPosition,UNITnFlags,UNITnIDNewItem,constCBitmap*pBmp);BOOLInsertMenu(UNITnPosition,UNITnFlags,UNITnIDNewItem=0,LPCTSTRlpszNewItem=NULL);其中:形參nIDNewItem表示新增菜單項的資源ID號,形參lpszNewItem表示新增菜單項的標題內(nèi)容,形參pBmp是新增菜單項的位圖指針,形參nPosition表示新增菜單項要插入的菜單項的位置,nFlags表示要增加的菜單項的狀態(tài)信息,其取值的不同會影響其他參數(shù)的含義,見表6.3。,22,23,注意:(1)當形參nFlags為MF_BYPOSITION時,nPosition表示新菜單項要插入的位置,該位置為0時表示新菜單項插入到第一個菜單項,為1時表示新菜單項插入到第二個菜單項,……,當為-1時,表示新菜單項插入到菜單的末尾(2)在形參nFlags中,可以用按位或運算符“|”將某些取值組合起來,如:MF_CHECKED|MF_STRING等。但有些組合是不允許的,如:MF_DISABLED、MF_ENABLED和MF_GRAYED等。(3)當利用以上函數(shù)向菜單中新增菜單后,不管菜單所在的窗口是否改變,都應(yīng)調(diào)用CWnd類的成員函數(shù)CWnd::DrawMenuBar來更新菜單,函數(shù)DrawMenuBar的原型為:voidDrawMenuBar();,24,刪除菜單項當要刪除指定的菜單項時,可利用CMenu類的成員函數(shù)DeleteMenu來完成,該函數(shù)的原型為:BOOLDeleteMenu(UNITnPosition,UNITnFlags);其中:形參nPosition的值表示要刪除的菜單項的位置,其值的選取要受到形參nFlags的取值的影響。當nFlags的取值為MF_BYCOMMAND時,nPosition表示要刪除的菜單項的ID號,而當nFlags的取值為MF_BYPOSITION時,nPosition表示要刪除的菜單項的位置(第一個菜單項的位置為0,第二個菜單項的位置為1,……)。注意:當調(diào)用DeleteMenu函數(shù)刪除某個菜單項后,不管菜單所依附的窗口是否改變,也必須調(diào)用CWnd類的成員函數(shù)CWnd::DrawMenuBar來更新菜單。,25,獲取菜單項可以利用CMenu類的以下三個成員函數(shù)分別獲得菜單的項數(shù)、菜單項的ID號以及彈出式子菜單的句柄。(1)GetMenuItemCount函數(shù)該函數(shù)的原型為:UNITGetMenuItemCount()const;該函數(shù)的功能是取得菜單中的菜單項數(shù),如果調(diào)用失敗則返回值為-1。(2)GetMenuItemID函數(shù)該函數(shù)的原型是:UNITGetMenuItemID(intnPos)const;該函數(shù)的功能是返回由參數(shù)nPos所指定的菜單項位置的菜單項的ID號,若nPos所指定的位置處為分隔線,則該函數(shù)的返回值為-1。,26,(3)GetSubMenu函數(shù)該函數(shù)的原型為:CMenu*GetSubMenu(intnPos)const;該函數(shù)的功能是獲得指定菜單的彈出式菜單的菜單句柄。該彈出式菜單位置由參數(shù)nPos給定,開始的位置為0,若菜單不存在,則創(chuàng)建一個臨時的菜單指針。此外,在主框架CMainFrame類中,可以利用該類的成員函數(shù)CMainFrame::GetMenu來獲得主菜單句柄。該函數(shù)的原型為:CMenu*GetMenu();,27,5.快捷菜單的實現(xiàn)利用MFC提供的CMenu類的TrackPopupMenu成員函數(shù)可以用來顯示一個彈出式菜單,該函數(shù)的原型為:BOOLTrackPopupMenu(UNITnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=0);其中:(1)形參nFlags表示菜單在屏幕上顯示的位置以及鼠標的按鈕狀態(tài),具體見表6.4所示。其中前三個值可分別與后兩個值用“|”運算符進行組合。,28,(2)形參x和y表示菜單的水平坐標和菜單的頂端的垂直坐標。(3)pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的WM_COMMAND消息。(4)lpRect是一個RECT結(jié)構(gòu)或CRect類的對象指針,它表示一個矩形區(qū)域,用戶單擊這個區(qū)域時,彈出菜單不消失,而當lpRect為NULL時,則當用戶單擊菜單外面時,菜單會立刻消失。下面,我們在上例的基礎(chǔ)上,添加一個快捷菜單,并使其能夠完成與與雙擊應(yīng)用程序窗口或選擇【顯示】菜單中的【個人資料】菜單項一樣的功能。具體步驟如下:步驟一:在VisualC++6.0中,選擇【File】菜單中的【OpenWorkspace】菜單項,打開上例中的“Dialog.dsw”,29,步驟二:添加一個新的菜單資源。選擇【Insert】菜單中的【Resource】菜單項,或直接按Ctrl+R鍵,在打開的【InsertResource】對話框窗口中選擇【Menu】,單擊【New】按鈕。步驟三:在工作區(qū)窗口中選擇【ResourceView】選項卡,展開【DialogResources】目錄,再展開【Menu】文件夾,將會看到菜單IDR_MENU1(這是系統(tǒng)給該菜單資源的缺省ID號)。雙擊IDR_MENU1,將在菜單資源編輯器中打開菜單資源。用鼠標雙擊主菜單最右邊的空菜單項,或者用鼠標右鍵單擊它,在彈出的快捷菜單中選擇【Properties】菜單項。在出現(xiàn)的“MenuItemProperties”對話框中的【Caption】欄中任意輸入一個標題,最后按回車鍵退出該對話框。,30,步驟四:在快捷菜單中增加菜單項。在菜單資源編輯器中用鼠標右鍵單擊【顯示】菜單中的空菜單項,在出現(xiàn)的快捷菜單中選擇【Properties】選項。在出現(xiàn)的“MenuItemProperties”屬性對話框的【Caption】欄中輸入“個人資料(dlg.m_radio_m=0;dlg.m_edit_name="";CStringmsg;if(dlg.DoModal()==IDOK){msg="按鈕被按下!";}else{msg="按鈕被按下!";},33,msg+="\r\n\n";msg+="姓名:";msg+=dlg.m_edit_name;msg+="\r\n";msg+="性別:";switch(dlg.m_radio_m){case0:msg+="男";break;case1:msg+="女";break;}msg+="\r\n";msg+="最高學(xué)歷:";msg+=dlg.m_combo_school;msg+="\r\n";msg+="愛好:";,34,if(dlg.m_check_art==TRUE)msg+="藝術(shù)";if(dlg.m_check_music==TRUE)msg+="音樂";if(dlg.m_check_sport==TRUE)msg+="體育";AfxMessageBox(msg);}步驟九:選擇【View】菜單中的【ClassWizard】菜單項.在出現(xiàn)的【MFCClassWizard】對話框中,選擇【MessageMaps】選項卡。在【Classname】下拉列表框中,選擇類CMainFrame;在【ObjectIds】中選擇CMainFrame選項;在【Messages】欄中選擇WM_CONTEXTMENU。單擊對話框右側(cè)的【AddFunction】,35,按鈕,系統(tǒng)將會彈出【AddMemberfunction】對話框。系統(tǒng)將自動生成一個缺省名稱為OnContextMenu的映射函數(shù),單擊【OK】按鈕。單擊【EditCode】按鈕退出【MFCClassWizard】對話框,并對OnContextMenu函數(shù)進行如下編輯:voidCMainFrame::OnContextMenu(CWnd*pWnd,CPointpoint){//TODO:AddyourmessagehandlercodehereCMenumenu;menu.LoadMenu(IDR_MENU1);menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);},36,步驟十:編譯運行并測試此應(yīng)用程序。當在應(yīng)用程序窗口中,單擊鼠標右鍵時,會彈出快捷菜單,選擇其中的【個人資料】菜單項,則彈出【個人資料】對話框。在對話框內(nèi)可以進行各種設(shè)置,然后單擊【確認】或【取消】按鈕退出。可以看到其效果與雙擊應(yīng)用程序窗口或選擇【顯示】菜單中的【個人資料】菜單項是一樣的。6.動態(tài)向菜單中添加新的菜單項下面,我們在上例的基礎(chǔ)上,向程序中動態(tài)增加一個新的菜單項,具體步驟如下:步驟一:在VisualC++6.0中,選擇【File】菜單中的【OpenWorkspace】菜單項,打開上例中的【Dialog.dsw】文件。步驟二:選擇【View】菜單中的【ResourceSymbols】菜單項,則會出現(xiàn)【ResourceView】對話框。,37,步驟三:單擊對話框中【New…】按鈕,則出現(xiàn)“NewSymbol”對話框。在該對話框中的Name文本框中,輸入一個用于菜單項的ID號,如:在本例中輸入“ID_NEW_MENUITEM”。在Value文本框中輸入對在該ID號的ID值,系統(tǒng)缺省為101,用戶也可以自行修改成新值,新值必須處在15~61440之間。在此取系統(tǒng)默認值,單擊【OK】按鈕。步驟四:利用VisualC++的工作區(qū)窗口,打開CMainFrame類的實現(xiàn)文件MainFrm.cpp文件,在CMainFrame::OnCreate函數(shù)體中添加如下代碼:intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){//前一部分在此省略,38,CMenu*pMainMenu=GetMenu();CMenu*pSubMenu=pMainMenu->GetSubMenu(4);CStringStrOfNewMenuItem("新建菜單項");pSubMenu->AppendMenu(MF_SEPARATOR);pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrOfNewMenuItem);m_bAutoMenuEnable=FALSE;pMainMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED);DrawMenuBar();return0;},39,步驟五:選擇【View】菜單中的【ClassWizard】菜單項,在出現(xiàn)的【MFCClassWizard】對話框中,選擇【MessageMaps】選項卡。在【Classname】下拉列表框中,選擇類CMainFrame;在【ObjectIds】中選擇CMainFrame選項;在【Messages】欄中選擇OnCommand。單擊對話框右側(cè)的【EditCode】按鈕,系統(tǒng)將會進入CMainFrame::OnCommand編輯窗口,輸入以下黑體部分代碼:BOOLCMainFrame::OnCommand(WPARAMwParam,LPARAMlParam){//TODO:Addyourspecializedcodehereand/orcallthebaseclassif(LOWORD(wParam)==ID_NEW_MENUITEM)MessageBox("您選中了新的菜單項");returnCFrameWnd::OnCommand(wParam,lParam);}此步中完成了對新增菜單項的消息映射功能。步驟六:編譯運行并測試此應(yīng)用程序。,40,6.2創(chuàng)建工具欄,工具欄是一系列工具按鈕的組合,也是一種常用的命令輸入方式。可以說,工具欄是菜單的一種快捷方式。1.創(chuàng)建工具欄的方法和步驟創(chuàng)建工具欄資源在這里,我們將對上一節(jié)的例子進行擴充,增加一個工具欄。當用鼠標選擇工具欄上的某個按鈕時,顯示出【個人資料】對話框。具體步驟如下:步驟一:打開上一節(jié)創(chuàng)建的Dialog例子。步驟二:在工作區(qū)窗口中選擇【ResourceView】選項卡,展開【DialogResources】文件夾,由于我們在用AppWizard生成應(yīng)用程序時,沒有選擇生成工具欄,因此在【DialogResources】文件夾中,找不到Toolbar文件夾。,41,步驟三:選擇【Insert】菜單中的【Resource】菜單項,在彈出菜單中選擇【Insert】菜單項。系統(tǒng)將彈出【InsertResource】對話框,在對話框中選擇【Toolbar】,單擊【New】按鈕。步驟四:系統(tǒng)將自動在【DialogResounrces】文件夾中添加一個【Toolbar】文件夾,同時在【Toolbar】文件夾中添加了一個名為IDR_TOOLBAR1的文件。屏幕上同時顯示工具欄設(shè)計窗口。步驟四:鼠標右鍵單擊【ResourceView】中【Toolbar】文件夾中的IDR_TOOLBAR1項目。在彈出菜單中選擇【Properties】菜單項,系統(tǒng)將彈出工具欄屬性對話框。在屬性對話框中的【ID】框中,我們把ID號修改為IDR_MYTOOLBAR。,42,步驟五:添加按鈕和制作按鈕圖標。我們可以利用【Graphic】和【Color】工具欄上提供的設(shè)計工具,根據(jù)自己需要制作按鈕圖標。我們用字母R作為按鈕的圖標。工具欄按鈕的繪制是一個個分開進行的,在畫完一個按鈕后,該按鈕的實際效果立刻顯示出來。在【ToolbarButtonProperties】工具欄按鈕屬性對話框中,各項的含義如表6.5所示。,43,注:要使選擇工具欄按鈕的功能與選擇菜單的功能一致時,應(yīng)將工具欄按鈕屬性對象框中的ID號設(shè)置為與某一菜單項的ID號相同。值得一提的是,在創(chuàng)建工具欄按鈕的過程中,可以進行有關(guān)的操作及方法:(1)創(chuàng)建新的工具欄按鈕在新建一個工具欄的過程中,在工具欄的右端會有一個空按鈕,用鼠標單擊該按鈕,則該按鈕的周圍有虛的方框包圍,同時在編輯區(qū)內(nèi)顯示出該按鈕,用戶可以在其中繪制圖形。(2)移動工具欄中的按鈕在編輯工具欄的過程中,可以根據(jù)用戶的需要移動工具欄中的按鈕,將某個按鈕放置到所需要的位置上。,44,(3)復(fù)制工具欄中的按鈕在工具欄編輯窗口內(nèi),選擇待移動的工具欄按鈕,在按下Ctrl鍵的同時,將其拖動到所需要的位置。(4)刪除工具欄中的按鈕方法是用鼠標拖動該按鈕到工具欄以外的位置。(5)在工具欄中的按鈕間插入空格可以根據(jù)需要在某個按鈕的左邊、右邊或兩邊插入一個空格分隔符,方法是:①如果某按鈕左邊沒有任何空格,拖動該按鈕向右移動并當按鈕的右邊界接觸到右邊按鈕時,釋放鼠標鍵,則可以此按鈕的左邊插入一個空格,反之,亦然。②如果某按鈕的左邊已有空格而右邊沒有空格,拖動該按鈕向左移動并當按鈕的左邊界接觸到左邊按鈕時,釋放鼠標鍵,則可在此按鈕右邊插入一個空格。,45,③如果某按鈕的左右兩邊都有空格,拖動該按鈕向右移動并接觸到相鄰按鈕時,則此按鈕左邊的空格保留,按鈕右邊的空格消失。反之亦然。實現(xiàn)工具欄編碼實現(xiàn)工具欄。具體實現(xiàn)步驟如下:步驟一:在工作區(qū)中窗口中選中【ClassView】選項卡,用鼠標右鍵單擊【CmainFrame】,在彈出的菜單中選擇【AddMemberVariable】菜單項,系統(tǒng)將彈出【AddMemberVariable】對話框。步驟二:在【VariableType】欄中輸入類型名稱CToolBar,在【VariableName】欄中輸入變量名稱m_MyDataToolBar。單擊【OK】按鈕繼續(xù)。此時,VisualC++將自動在主框架中的類定義文件MainFrm.h中添加以下聲名:CToolBarm_MyDataToolBar;,46,步驟三:選擇【View】菜單中的【ClassWizard】菜單項,或者直接按Ctrl+R鍵,彈出【MFCClassWizard】對話框。在【Classname】列表框選擇CmainFrame類;在【ObjectIds】列表框中選中CMainFrame;雙擊【Messages】列表欄中的WM_CREATE選項,或者選中WM_CREATE,再單擊【AddFunction】按鈕。在【MemberFunction】欄中將會出現(xiàn)OnCreate()函數(shù)。步驟四:單擊【EditCode】按鈕,ClassWizard將自動在框架類的實現(xiàn)文件MainFrm.cpp中添加成員函數(shù)OnCreate()。在函數(shù)中加入顯示工具欄的代碼。具體代碼如下,其中粗體部分為新添加的代碼。,47,IntCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;}return0;},48,步驟五:編譯并運行該程序。當單擊工具欄上的新建按鈕,窗口中將彈出【個人資料】對話框。此按鈕的作用和選擇【顯示】菜單中的【個人資料】菜單項的效果是一樣的。說明:(1)在上例創(chuàng)建工具欄的過程中,曾用到了CToolBar類的對象,CToolBar類是由CControlBar類派生而來的,它用于描述工具欄。其中,Create函數(shù)是其成員函數(shù),該函數(shù)的原型為:BOOLCreate(Cwnd*pParentWnd,DWORDwStyle=WS_CHILD|WS_VISIBLE|CBRS_TOP,UNITnID=AFX_IDW_TOOLBAR);其中:參數(shù)pParentWnd是指向父窗口的指針,dwStyle是工具欄的風(fēng)格,nID是子窗口的ID號。,,49,表6.6工具欄的部分風(fēng)格,50,(2)TRACE宏TRACE宏提供了類似與printf函數(shù)的輸出格式,用于將某一信息(即字符串)輸出到Dump的設(shè)備環(huán)境DC中。該宏只在調(diào)試狀態(tài)下工作。TRACE宏的限制是一次最多輸出512個字符。如:inti=1;charsz[]="one";TRACE("Integer=%d,String=%s\n",i,sz);此外,還有TRACE0~TRACE3這樣4個獨立的宏,分別用于輸出純字符串~字符串+3個參數(shù)。它們的原型分別為:TRACE0(exp)TRACE1(exp,param1)TRACE2(exp,param1,param2)TRACE3(exp,param1,param2,param3),51,如:TRACE0("StartDumpofMyClassmembers:");inti=1;TRACE1("Integer=%d\n",i);//Output:Integer=1intj=1;charsz[]="one";TRACE2("Integer=%d,String=%s\n",j,sz);//Output:Integer=1,String=one2.如何實現(xiàn)工具欄的船塢化所謂船塢化工具欄就是可以將工具欄拖動到屏幕的任意位置上,還可以用鼠標改變工具欄的大小。下面我們就來實現(xiàn)工具欄的船塢化。,52,首先要通過調(diào)用CControlBar的成員函數(shù)EnableDocking()使工具欄能夠船塢化;然后通過調(diào)用CFrameWnd類的成員函數(shù)EnableDocking()確保邊框窗口能夠船塢化;最后調(diào)用CFrameWnd的成員函數(shù)DockControlBar()使工具欄固定在邊框窗口上。所有這些工作都在邊框窗口類的成員函數(shù)OnCreate()中完成。這三個函數(shù)的原型為:voidCControlBar::EnableDocking(DWORDdwStyle);voidCFrameWnd::EnableDocking(DWORDdwDockStyle);voidCFrameWnd::DockControlBar(CControlBar*pBar,UINTnDockBarID=0,LPCRECTlpRect=NULL);其中:參數(shù)dwStyle和dwDockStyle表示工具欄的風(fēng)格,其取值見表6.6,pBar是指向待船塢化的工具欄的指針。,53,具體代碼如下,其中粗體部分為新添加的代碼。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;},54,m_MyDataToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(}編譯并運行該應(yīng)用程序,將看到工具欄已經(jīng)船塢化了??梢杂檬髽藢⑺蟿拥酱翱诘娜我馕恢?。,55,6.3創(chuàng)建狀態(tài)欄,狀態(tài)欄位于應(yīng)用程序框架窗口的底部,它可以分割成幾個窗格,一般用于顯示一些文本信息,比如:工具欄按鈕的提示信息、CapsLock鍵及NumLock鍵的狀態(tài)等等。1.創(chuàng)建狀態(tài)欄資源下面,我們在前例的基礎(chǔ)上,為應(yīng)用程序Dialog添加一個狀態(tài)欄,用來顯示一個消息區(qū)、一個字符串和NumLock鍵的狀態(tài)。其具體步驟如下:步驟一:為狀態(tài)欄的內(nèi)容建立一個ID號。步驟二:在對話框中單擊【New】按鈕,彈出【NewSymbol】對話框,在【Name】欄中填入ID_STATUSBAR_STR,在【Value】欄中的數(shù)字是系統(tǒng)為用戶提供的ID數(shù)值。單擊【OK】按鈕繼續(xù)。,56,步驟三:新添加的ID信息將會出現(xiàn)在【ResourceSymbols】對話框的列表中。單擊【Close】按鈕關(guān)閉【ResourceSymbols】對話框。此時完成創(chuàng)建ID的工作。步驟四:在工作區(qū)窗口中選擇【ResourceView】選項卡,雙擊【StringTable】文件夾中的【StringTable】選項,窗口中將顯示出串表編輯器。在編輯器中單擊鼠標右鍵,在彈出的菜單中選擇【NewString】菜單項。步驟五:系統(tǒng)彈出【StringProperties】對話框,在【ID】框中選擇ID_STATUSBAR_STR項,在【Caption】框中輸入字符串“測試狀態(tài)欄!”,按【Enter】鍵確認。,57,2.實現(xiàn)狀態(tài)欄實現(xiàn)狀態(tài)欄的具體步驟如下:步驟一:在工作區(qū)窗口中選擇【ClassView】選項卡,用鼠標右鍵單擊【CMainFrame】選項,在彈出菜單中選擇【AddMemberVariable】菜單項。彈出【AddMemberVariable】對話框,在【VariableType】欄中輸入類型名稱CStatusBar,在【VariableName】欄中輸入類型名稱為m_MyStatusBar。單擊【OK】按鈕繼續(xù)。此時,VisualC++將自動在主框架的類定義文件MainFrm.h中添加以下聲明:CStatusBarm_MyStatusBar;步驟二:在MainFrm.cpp文件中加入數(shù)組indicators的定義,具體代碼如下,其中粗體部分為新增加的代碼。,58,//CMainFrameIMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)ON_WM_CONTEXTMENU()ON_WM_CREATE()//}}AFX_MSG_MAPEND_MESSAGE_MAP()staticUINTindicators[]={ID_SEPARATOR,//狀態(tài)行指示器ID_STATUSBAR_STR,ID_INDICATOR_NUM,};,59,步驟三:在文件MainFrm.app中對函數(shù)OnCreate()進行修改,增加狀態(tài)欄的創(chuàng)建代碼。具體代碼如下,其中粗體部分為新增加的代碼。intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){if(CFrameWnd::OnCreate(lpCreateStruct)==-1)return-1;//TODO:Addyourspecializedcreationcodehereif(!m_MyDataToolBar.Create(this)||!m_MyDataToolBar.LoadToolBar(IDR_MYTOOLBAR)){TRACE0("Failedtocreatedtoolbar\n");return-1;},60,m_MyDataToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(},61,步驟四:編譯并運行此應(yīng)用程序,將會看到在原來程序的基礎(chǔ)之上,在窗口的最下端增加了一個狀態(tài)欄。說明:(1)在上例創(chuàng)建狀態(tài)欄的過程中,曾用到了CStatusBar類的對象,CStatusBar是VisualC++的MFC類庫中的一個類,它用于描述狀態(tài)欄,CStatusBar類是由CControlBar類派生而來的。其中,Create函數(shù)是其成員函數(shù),該函數(shù)的原型為:BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINTnID=AFX_IDW_STATUS_BAR);其中:pParentWnd是指向狀態(tài)欄父窗口的指針,dwStyle是狀態(tài)欄的風(fēng)格,nID是子窗口的ID號,表6.7中列出了決定狀態(tài)欄風(fēng)格的幾種常用的取值及對應(yīng)的風(fēng)格。,62,表6.7dwStyle的取值及對應(yīng)的狀態(tài)欄的風(fēng)格(2)在MainFrm.cpp文件中加入的數(shù)組indicators的定義:staticUINTindicators[],用于描述狀態(tài)欄中所包含的內(nèi)容。如果在利用AppWizard向?qū)?chuàng)建SDI或MDI應(yīng)用程序框架中的第4步中,選擇了“Initialstatusbar”時,則向?qū)詣釉贛ainFrm.cpp文件中加入數(shù)組indicators的定義。向?qū)傻娜笔〉膇ndicator數(shù)組包含了四個元素,它們是ID_SEPARATOR、ID_INDICATOR_CAPS、ID_INDICATOR_NUM和ID_INDICATOR_SCRL。,63,(3)要在狀態(tài)欄的窗格中顯示文本信息,可以采用以下三種方法:①調(diào)用CWnd::SetWindowText函數(shù)更新信息行窗格中的文本。由于狀態(tài)欄也是一種窗口,所以在程序中可以直接調(diào)用該函數(shù)。如:若狀態(tài)欄變量為m_wndStatusBar,則m_wndStatusBar.SetWindowText(“新修改的信息”)語句將在信息行窗格中顯示“新修改的信息”。②手動處理狀態(tài)欄的ON_UPDATE_COMMAND_UI更新信息,并在處理函數(shù)中調(diào)用CCmdUI::SetText函數(shù),該函數(shù)的原型為:virtualvoidSetText(LPCTSTRlpszText);其中:參數(shù)lpszText是一個指向字符串的指針。,64,③調(diào)用函數(shù)CStatusBar::SetPaneText與CStatusBar::GetPaneText可以設(shè)置或獲得任何窗格(包括信息行窗格)中的文本。此函數(shù)的原型為:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);CStringGetPaneText(intnIndex)const;其中,參數(shù)nIndex是待設(shè)置的窗格位置索引號(第1個窗格的位置索引為0),lpszNewText表示要顯示的字符串,若參數(shù)bUpdate的值為TRUE,系統(tǒng)自動更新顯示的結(jié)果。(4)調(diào)用CStatusBar::CommandToIndex可以獲得指定資源ID號所在窗格的位置索引號,該函數(shù)的原型為:intCommandToIndex(UINTnIDFind)const;其中:參數(shù)nIDFind是狀態(tài)欄中某一資源ID號。,65,(5)調(diào)用函數(shù)CStatusBar::SetPaneInfo與CStatusBar::GetPaneInfo可設(shè)置或獲得窗格的長度、風(fēng)格等信息,它們的函數(shù)原型為:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);voidGetPaneInfo(intnIndex,UINT其中:參數(shù)nIndex表示要設(shè)置的狀態(tài)欄窗格的索引號,nID用來為狀態(tài)欄窗格指定新的資源ID號,cxWidth表示窗格的像素寬度,nStyle表示狀態(tài)欄窗格的風(fēng)格類型,用來指定窗格的外觀,如:SBPS_POPOUT表示窗格是凸起來的。具體見表6.8。,66,表6.8狀態(tài)欄中各窗格的風(fēng)格取值及對應(yīng)風(fēng)格,67,(6)調(diào)用CStatusBar::SetPaneStyle與CStatusBar::GetPaneStyle可分別用來設(shè)置或獲得狀態(tài)欄窗格的風(fēng)格,二者的原型如下:UINTGetPaneStyle(intnIndex)const;voidSetPaneStyle(intnIndex,UINTnStyle);其中:參數(shù)nIndex是狀態(tài)欄中某一窗格的位置索引號,nStyle為狀態(tài)欄中窗格的風(fēng)格。3.進一步完善狀態(tài)欄現(xiàn)在,我們在剛才添加狀態(tài)欄例子的基礎(chǔ)上進行修改。當用戶選擇“關(guān)于”菜單項時,彈出“字體對話框”,當單擊“確定”按鈕關(guān)閉此對話框后,在狀態(tài)欄上原來顯示文本測試狀態(tài)欄的空格中顯示“您已經(jīng)查看過字體對話框!”,按照下面的方法進行操作。,68,步驟一:選擇【View】菜單中的【ClassWizard】菜單項。彈出【MFCClassWizard】對話框,在【Classname】列表中選擇類CMainFrame,在【ObjectIDs】列表中選擇ID_APP_ABOUT;右邊的【Messages】欄中將出現(xiàn)COMMAND和UPDATE_COMMAND_UI,雙擊COMMAND選項。將彈出AddMemberFunction對話框。步驟二:接受系統(tǒng)缺省的函數(shù)名稱OnAppAbout,單擊【OK】按鈕,返回MFCClassWizard對話框。這時在MFCClassWizard對話框中的【Memberfunctions】框中增加了一個函數(shù)OnAppAbout。步驟三:單擊【EditCode】按鈕,在代碼編輯窗口中打開OnAppAbout函數(shù)。在編輯此函數(shù)之前,首先要在MainFrm.cpp文件中添加一個#include語句。具體代碼如下,其中粗體部分為新增加的代碼。,69,//MainFrm.cpp:implementationoftheCMainFrameclass//#include"stdafx.h"#include"Dialog.h"#include"MainFrm.h"#include"MydataDialog.h"#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif,70,步驟四:在代碼編輯窗口中,編輯函數(shù)OnAppAbout()。具體代碼如下,其中粗體部分為新增加的代碼。voidCMainFrame::OnAppAbout(){//TODO:AddyourcommandhandlercodehereCMydataDialogdlg;if(dlg.DoModal()==IDOK){CClientDCdc(this);SIZEsize=dc.GetTextExtent("您已經(jīng)查看過個人資料對話框!");intndex=m_MyStatusBar.CommandToIndex(ID_STATUSBAR_STR);m_MyStatusBar.SetPaneInfo(index,ID_STATUSBAR_STR,SBPS_POPOUT,size.cx);m_MyStatusBar.SetPaneText(index,_T("您已經(jīng)查看過個人資料對話框!"),TRUE);}},71,說明:在此函數(shù)中,首先生成了一個字體對話框的實例,并且顯示為有模式對話框。當用戶單擊【確定】按鈕退出此對話框時,要改變狀態(tài)欄的字符串顯示。首先調(diào)用函數(shù)GetTextExtent()來獲得字符串的長度,然后調(diào)用CommandToIndex()函數(shù)獲得窗格的索引,再通過調(diào)用函數(shù)SetPaneInfo()來設(shè)置窗格的長度、風(fēng)格等信息。在此例中,我們使用了風(fēng)格SBPS_POPOUT,它使創(chuàng)建的窗格看起來是從狀態(tài)欄中凸出來的。最后調(diào)用函數(shù)SetPaneText()來顯示文本內(nèi)容。步驟五:編譯并運行此應(yīng)用程序。,72,本章小結(jié),在應(yīng)用程序中,要實現(xiàn)菜單的功能,其步驟和方法是先利用菜單編輯器建立菜單資源,然后編寫菜單命令的WM_COMMAND消息映射函數(shù)及相應(yīng)代碼。在MFC框架中,菜單命令消息是按照一定的順序進行傳遞的。對于一個單文檔應(yīng)用程序,消息傳遞的順序為:視圖類→文檔類→框架類→應(yīng)用程序類。VisualC++的MFC提供的菜單類Cmenu的對象可以用來表示各種Windows菜單,其中包括頂層菜單項及其相應(yīng)的彈出式菜單。并且利用該類的成員函數(shù)可以在程序運行時處理有關(guān)菜單的操作。工具欄是應(yīng)用程序中常用操作的快捷方式,創(chuàng)建工具欄的方法是先創(chuàng)建工具欄資源,然后在主框架窗口類CMainFrame中創(chuàng)建響應(yīng)WM_CREATE的消息映射函數(shù),在該函數(shù)中,利用MFC提供的工具欄類CToolBar對象的,73,Create成員函數(shù),創(chuàng)建工具欄。CToolBar類是由CControlBar類派生而來的,它用于描述工具欄。狀態(tài)欄中的空間按從左向右的順序分為信息行窗格和指示器窗格,處在狀態(tài)欄最左側(cè)的窗格,其位置序號為0,向右依次類推,它可以分割成幾個窗格,用來顯示許多信息。其創(chuàng)建方法是先創(chuàng)建狀態(tài)欄資源,然后在主框架窗口類CMainFrame中創(chuàng)建響應(yīng)WM_CREATE的消息映射函數(shù),在該函數(shù)中,利用MFC提供的工具欄類CStatusBar對象的Create成員函數(shù),創(chuàng)建狀態(tài)欄。CStatusBar類是由CControlBar類派生而來的,它用于描述狀態(tài)欄。狀態(tài)欄中的窗格的個數(shù)及所顯示的信息由在MainFrm.cpp文件中定義的數(shù)組indicators的元素的個數(shù)和元素的值來決定。,74,習(xí)題,6.1利用AppWizard向?qū)Ы⒁粋€單文檔應(yīng)用程序,并完成以下操作:(1)利用資源編輯器向原有菜單欄中增加一個頂層菜單“查看”,并在其下拉菜單(彈出菜單)中添加“顯示鼠標坐標”菜單項。(2)在主框架窗口類即CMainFrame類中,建立響應(yīng)WM_COMMAND和WM_COMMAND_UI消息映射函數(shù),函數(shù)名自定,函數(shù)的功能是,當程序運行過程中,用戶選擇“顯示鼠標坐標”菜單項時能在該菜單項的左邊顯示“√”標記,當再次選擇該菜單項時標記消失。(3)為“顯示鼠標坐標”菜單項建立一個快捷鍵“Ctrl+D”。,75,(4)利用資源編輯器向現(xiàn)有的工具欄的末尾添加一個按鈕,按鈕的圖標自己設(shè)計。并進行有關(guān)的設(shè)定使該按鈕的功能同選擇“顯示鼠標坐標”菜單項的功能相同。(5)在現(xiàn)有狀態(tài)欄的基礎(chǔ)上再增加一個信息行窗格,用于顯示鼠標移動過程中鼠標的當前X,Y坐標。(6)利用ClassWizard向?qū)г趹?yīng)用程序的視圖類中添加響應(yīng)WM_MOUSEMOVE消息的消息處理函數(shù),函數(shù)名自定,該函數(shù)的功能就是把鼠標在移動過程中的位置X,Y坐標顯示到狀態(tài)欄的新增信息行窗格中。6.2在VC環(huán)境中,利用Help菜單查看和學(xué)習(xí)CMenu類、CToolBar類、CStatusBar類、CCmdUI類的內(nèi)容,即其中的數(shù)據(jù)成員和成員函數(shù)。,- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
14.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 面向?qū)ο蟮某绦蛟O(shè)計語言-C 面向 對象 程序設(shè)計語言 課件
鏈接地址:http://www.820124.com/p-11500100.html