第4章 菜單工具欄與狀態(tài)欄new_第1頁
第4章 菜單工具欄與狀態(tài)欄new_第2頁
第4章 菜單工具欄與狀態(tài)欄new_第3頁
第4章 菜單工具欄與狀態(tài)欄new_第4頁
第4章 菜單工具欄與狀態(tài)欄new_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第4章菜單、工具欄與狀態(tài)欄

主要內(nèi)容4.1菜單4.2工具欄4.3狀態(tài)欄4.4應用實例4.1菜單4.1.1菜單的類型

常見菜單有3種:主菜單、彈出菜單和快捷菜單。1.主菜單

指出現(xiàn)在應用程序主窗口或最上層窗口的菜單。通常對應有一個彈出菜單作為它的子菜單。2.彈出菜單指選擇主菜單或一個菜單項時彈出的子菜單。3.快捷菜單

當右擊某個界面對象時,通常會彈出快捷菜單,它出現(xiàn)在鼠標箭頭的位置,快速展示當前對象可用的命令功能。菜單設計一般需要經(jīng)過下面三步:(1)使用菜單編輯器編輯菜單資源,設置菜單屬性(包括菜單名和ID);(2)使用ClassWizard進行消息映射(3)編輯成員函數(shù),完成菜單所要實現(xiàn)的功能。4.1.2編輯菜單

使用菜單編輯器來編輯菜單資源。雙擊ResourceView視圖中的Menu菜單資源,打開菜單編輯器。1.插入新菜單項在當前空白菜單項位置插入選定窗口中的空白菜單項后按回車鍵(或雙擊空白菜單項),系統(tǒng)彈出菜單屬性對話框。在某菜單項前插入選中該菜單項并按Ins鍵,再雙擊該空白菜單項進行編輯。2.屬性對話框的設置

用于輸入菜單項的標識符(ID)、標題(Caption)和菜單項在狀態(tài)欄上顯示的提示(Prompt)信息等。菜單項的標識符(ID)菜單項在狀態(tài)欄上顯示的提示信息標題3.調(diào)整菜單項位置

選中某菜單項將其拖至適當位置。4.刪除菜單項

用鼠標單擊菜單項或用上、下、左、右光標鍵選擇菜單項,然后單擊Cut按鈕或按Del鍵刪除?!纠?.1】編寫一個單文檔應用程序MyDraw,在菜單欄中增加一個“繪圖”主菜單,并在其中添加“矩形”和“橢圓”兩個菜單項。繪圖菜單:繪圖(D)/彈出式子菜單/子菜單間添加分割線(1)矩形ID號:IDM_RECTANGLE

快捷方式:Ctrl+R(2)橢圓ID號:

IDM_ELLIPSE

快捷方式:

Ctrl+L提示如果菜單中要使用中文,則除了在菜單名一項中輸入中文外,還要將菜單資源的語言屬性設置為中文。方法是:鼠標右鍵單擊資源視圖的菜單資源IDR_MAINFRAME選擇Properties在Languages下拉列表框中選擇Chinese(P.R.C.)。4.1.3建立消息映射

在上例中僅添加了菜單,并沒有實現(xiàn)菜單的功能,即沒有對應的命令處理函數(shù)與菜單項對應,因此,添加的菜單項是灰色的,即處于當前不可用狀態(tài)。添加新的菜單項后,還應該為菜單項指定一個處理函數(shù),即利用ClassWizard類向?qū)砑右粋€消息處理函數(shù)?!纠?.2】為例4.1中增加的菜單項添加消息處理函數(shù)。voidCLi4_1View::OnRectangle(){

//TODO:Addyourcommandhandlercodehere

CClientDCdc(this); dc.Rectangle(10,10,200,100);}voidCLi4_1View::OnEllipse(){

//TODO:Addyourcommandhandlercodehere

CClientDCdc(this); dc.Ellipse(250,100,450,250);}菜單命令的路由菜單命令響應順序為:視圖類、文檔類、框架類、應用程序類消息路由框架類接收消息,轉(zhuǎn)給子窗口(即視圖類)視圖類命令消息機制處理,若無,轉(zhuǎn)文檔類。文檔類命令消息機制處理,若無,轉(zhuǎn)還視圖類,視圖類轉(zhuǎn)還框架類處理。框架類命令消息機制處理,若無,轉(zhuǎn)還應用程序類?;静藛尾僮?002012022031230012訪問菜單項:ID或位置索引訪問子菜單:僅索引號訪問基本菜單操作獲取菜單欄CMenu*GetMenu()獲取子菜單CMenu*GetSubMenu(intnPos)添加移除標記UINTCheckMenuItem(UINTnIDCheckItem,UINTnCheck)示例intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){……

GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);return0;}替換為GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);4.1.4菜單的有效控制

一般情況下,菜單項都不止一種狀態(tài)。

例如,在沒有選擇任何內(nèi)容時,Edit菜單下的Copy、Cut等菜單項是無效的(灰色顯示)。有時,我們還會看到,在菜單項旁邊可能還會有檢查標記,表示它是選中的還是不選中的。比如,在Word的視圖菜單項下,當用戶選用【網(wǎng)格線】或【標尺】時,相應菜單項前會出現(xiàn)一個“√”。

MFC通過消息映射機制和CCmdUI類更新菜單項的顯示。在類向?qū)lassWizard的MessageMap標簽中,如果選擇一個菜單ID,在Messages列表框中就會出現(xiàn)以下兩項:

COMMANDUPDATE_COMMAND_UI

其中UPDATE_COMMAND_UI是更新命令用戶接口消息,專門用于處理菜單項和工具條按鈕的更新??蚣芟蛱幚砗瘮?shù)發(fā)送更新命令時,傳遞給處理函數(shù)一個指向CCmdUI對象的指針。利用指向CCmdUI對象的指針調(diào)用菜單或工具欄的命令接口函數(shù)來更新用戶接口對象。CCmdUI對象菜單項工具按鈕成員函數(shù)功能Enable()設置菜單項是否有效SetCheck()增加或清除“√”標記SetRadio()增加或清除圓點標記SetText()改變菜單顯示文本【例4.3】為例4.2的程序MyDraw添加更新用戶界面的消息處理函數(shù),使程序啟動時菜單項【橢圓】處于不可用狀態(tài),當用戶單擊【矩形】菜單項后,在菜單項前顯示“√”標記,并使【橢圓】菜單項變?yōu)榭捎?。設計思路:1、設置標記“橢圓”菜單是否有效m_enable“√”標記在“矩形”菜單中是否顯示m_checkr“√”標記在“橢圓”菜單中是否顯示m_checke2、“響應”的過程“矩形”菜單響應:“橢圓”菜單有效、“矩形”菜單加“√”標記,“橢圓”菜單不加“√”標記。“橢圓”菜單響應:“橢圓”菜單加“√”標記,矩形菜單不加“√”標記。3、“更新響應”的過程“矩形”菜單設置標記“橢圓”菜單設置標記,并且設置菜單有效性1、設置標記(bool)m_enablem_checkrm_checkeCTempView::CTempView(){

//TODO:addconstructioncodehere m_checke=false;m_checkr=false; m_enable=false;}2、“響應”的過程voidCLi4_1View::OnRectangle(){

//TODO:Addyourcommandhandlercodehere

m_enable=true; m_checkr=true; m_checke=false;

CClientDCdc(this); dc.Rectangle(10,10,200,100);}voidCLi4_1View::OnEllipse(){

//TODO:Addyourcommandhandlercodehere

m_checke=true; m_checkr=false;

CClientDCdc(this); dc.Ellipse(250,100,450,250);}3、“更新響應”的過程voidCLi4_1View::OnUpdateRectangle(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodehere

pCmdUI->SetCheck(m_checkr);

}voidCLi4_1View::OnUpdateEllipse(CCmdUI*pCmdUI){//TODO:AddyourcommandupdateUIhandlercodehere

pCmdUI->SetCheck(m_checke); pCmdUI->Enable(m_enable);

}4.1.5快捷菜單

為應用程序創(chuàng)建快捷菜單主要有以下兩種方法。1.使用ComponentGallery創(chuàng)建快捷菜單

ComponentGallery(組件畫廊)是一個組件庫,它保存著可以共享或重用的代碼。這些代碼包括由VisualC++自帶的組件和從用戶工程中增加到Gallery中去的用戶自定義組件。操作步驟:選擇組件建立關(guān)聯(lián)【例4.4】為例4.3中的應用程序MyDraw增加一個快捷菜單。程序運行后,用戶在視圖窗口中右擊,彈出一個快捷菜單,顯示主菜單“繪圖”下的所有菜單項。快捷菜單2.使用TrackPopupMenu()函數(shù)創(chuàng)建快捷菜單

使用菜單資源編輯器和CMenu::TrackPopupMenu()函數(shù)來創(chuàng)建右鍵快捷菜單。CMenu::TrackPopupMenu函數(shù)的原型為:

BOOLTrackPopupMenu(UINTnFlags,intx,inty,CWnd*pWnd,LPCRECTlpRect=NULL);

屏幕位置標志矩形域菜單坐標彈出的窗口參數(shù)nflags的含義

【例4.5】使用TrackPopupMenu()函數(shù)創(chuàng)建例4.3中的快捷菜單。操作步驟:創(chuàng)建新菜單建立關(guān)聯(lián)WM_CONTEXTMENU消息處理

加載菜單獲取子菜單獲取父窗口指針顯示菜單

CMenu類的成員函數(shù)較多,但建立彈出式菜單只需用到其中幾個成員函數(shù)。

1、LoadMenu函數(shù)BOOLLoadMenu(UINTnIDResource);其中nIDResource是菜單資源的ID號。2、GetSubMenu函數(shù)

CMenu*GetSubMenu(intnPos)const;用于得到子菜單的指針,nPos為層數(shù),0為第一層子菜單……以此類推。voidCLi4_1View::OnContextMenu(CWnd*pWnd,CPointpoint){

//TODO:AddyourmessagehandlercodehereCMenumenu,*pPopup;

menu.LoadMenu(IDR_POP);//加載菜單pPopup=menu.GetSubMenu(0);//獲取子菜單CWnd*pWndPopupOwner=this;pWndPopupOwner=pWndPopupOwner->GetParent();//返回父窗口

pPopup->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,pWndPopupOwner);

}4.1.6創(chuàng)建動態(tài)菜單動態(tài)創(chuàng)建菜單分為以下3個步驟。CMenu::CreateMenu

//創(chuàng)建菜單CMenu::AppendMenu

//追加或插入菜單CMenu::InsertMenuCMenu::Detach

//創(chuàng)建菜單

intCMainFrame::OnCreate(LPCREATESTRUCTlpCreateStruct){……

CMenumenu;

menu.CreateMenu();// GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Test");

GetMenu()->InsertMenu(2,MF_POPUP|MF_BYPOSITION,(UINT)menu.m_hMenu,"Test");

menu.AppendMenu(MF_STRING,111,"where"); menu.AppendMenu(MF_STRING,112,"who"); menu.AppendMenu(MF_STRING,113,"whitch");menu.Detach();

return0;}【例4.6】為例4.4中的應用程序MyDraw創(chuàng)建一個【畫筆】動態(tài)菜單。程序運行后,用戶單擊【繪圖|矩形】菜單項,在主菜單中添加動態(tài)菜單【畫筆】,并通過此菜單的子菜單項畫一個紅色矩形。voidCMenuView::OnRectangle(){

//TODO:Addyourcommandhandlercodehere CClientDCdc(this); dc.Rectangle(50,50,100,200); CMenumenu,*pmenu;

//創(chuàng)建新菜單

menu.CreateMenu();

//獲取主窗口指針

CWnd*pMainFrame=AfxGetMainWnd();

//獲取主菜單指針

pmenu=pMainFrame->GetMenu();

//主菜單中創(chuàng)建動態(tài)菜單

pmenu->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"畫筆(&P)");

//動態(tài)菜單中創(chuàng)建菜單項

menu.AppendMenu(MF_STRING,WM_USER+1,"紅色矩形"); menu.Detach();

//重新顯示菜單

pMainFrame->SetMenu(pmenu);

}4.1.6創(chuàng)建動態(tài)菜單動態(tài)創(chuàng)建菜單分為以下3個步驟。(1)

利用CreateMenu()函數(shù)創(chuàng)建一個空的彈出式菜單,該函數(shù)的原型為:

HMENUCreateMenu()

該函數(shù)沒有參數(shù),它的返回值是一個菜單句柄。(2)調(diào)用AppendMenu()或InsertMenu()函數(shù)在菜單中加入菜單項。MF_POPUP:指定菜單打開一個下拉式菜單或子菜單。參數(shù)uIDNewltem下拉式菜單或子菜單的句柄。MF_STRING:指定菜單項是一個正文字符串;參數(shù)lpNewltem指向該字符串。

AppendMenu(HMENUhMenu,//將修改的菜單句柄UINTuFlags,//新菜單屬性標志UINT_PTRuIDNewItem,//新菜單句柄LPCTSTRlpNewItem//新菜單的內(nèi)容);(3)調(diào)用函數(shù)SetMenu()加載動態(tài)菜單。BOOLSetMenu(HWNDhwnd,//窗口句柄HMENUhmenu//菜單句柄);voidCLi4_1View::OnRectangle(){//TODO:Addyourcommandhandlercodehere …… CClientDCdc(this); dc.Rectangle(10,10,200,100);

HMENUhmenu,hPopmenu;//菜單句柄

CWnd*pMainFrame=AfxGetMainWnd();//獲取窗口指針 CMenu*pTopMenu=pMainFrame->GetMenu();//獲取主菜單指針 hmenu=pTopMenu->m_hMenu;//獲取主菜單句柄

//創(chuàng)建菜單

hPopmenu=CreateMenu();

//主菜單下添加動態(tài)菜單,為彈出式菜單,名稱為“畫筆”

AppendMenu(hmenu,MF_POPUP,UINT(hPopmenu),"畫筆(&P)");//“畫筆”菜單下添加“紅色矩形”菜單

AppendMenu(hPopmenu,MF_STRING,WM_USER+1,"紅色矩形"); pMainFrame->SetMenu(pTopMenu);}動態(tài)菜單若要響應動態(tài)菜單的消息,需要重載OnCmdMsg消息。BOOLCLi4_1View::OnCmdMsg(UINTnID,intnCode,void*pExtra,AFX_CMDHANDLERINFO*pHandlerInfo){

//TODO:Addyourspecializedcodehereand/orcallthebaseclass

if(nID==(UINT)(WM_USER+1)) {

if(nCode==CN_COMMAND)

DoSelectMenu();

else

if(nCode==CN_UPDATE_COMMAND_UI)

DoUpdateSelectMenu((CCmdUI*)pExtra);

returntrue; }

returnCView::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);}voidCLi4_1View::DoSelectMenu(){ CPenNewPen,*OldPen; CClientDCdc(this); NewPen.CreatePen(PS_SOLID,2,RGB(255,0,0)); OldPen=dc.SelectObject(&NewPen); dc.Rectangle(100,100,350,200); dc.SelectObject(OldPen);}voidCLi4_1View::DoUpdateSelectMenu(CCmdUI*pCmdUI){ pCmdUI->Enable(true);}4.1.7創(chuàng)建基于對話框的菜單

從第2章可知,利用MFCAppWizard[exe]向?qū)Чぞ呖梢陨苫趯υ捒虻膽贸绦颉?/p>

基于對話框的應用程序在運行時并沒有菜單欄。下面我們通過實例來討論如何給它創(chuàng)建一個菜單。

【例4.7】編寫一個基于對話框的應用程序Li4_7,為該應用程序添加一個菜單。菜單包括【文件】、【編輯】、【視圖】和【幫助】4個主菜單項。操作步驟:創(chuàng)建新菜單建立關(guān)聯(lián)工具欄工具欄:常用的菜單命令以按鈕的形式,提供給用戶使用。工具欄可以方便用戶操作。4.2.1編輯工具欄

使用工具欄編輯器來編輯工具欄資源。雙擊ResourceView視圖中的Toolbar工具欄資源,即可打開工具欄編輯器。1.添加按鈕

雙擊工具條上的空白按鈕或單擊空白按鈕后,選擇【View|Properties】菜單項,彈出如圖所示的ToolbarButtonProperties屬性對話框,在此對話框中編輯按鈕的標識符、寬度與高度值。2.刪除按鈕

將按鈕拖出工具欄外,即可刪除該按鈕。3.編輯按鈕位圖設置按鈕位圖有以下兩種方法。l

利用繪圖工具與調(diào)色板直接進行繪制l

先利用專用繪圖軟件制作,然后粘貼到按鈕上4.2.2建立消息映射

通常,只需讓一個按鈕的ID值與同樣功能菜單項的ID值相同即可。

如果按鈕沒有對應菜單項,則必須利用ClassWizard類向?qū)砑右粋€消息處理函數(shù)。【例4.8】編寫一個單文檔應用程序Li4_8。刪除默認工具欄上的【打印設置】按鈕,并在【幫助】按鈕前添加【上一頁】和【下一頁】2個按鈕,當用戶單擊這兩個按鈕后,視圖中分別顯示文本“這是《上一頁》按鈕!”和“這是《下一頁》按鈕!”。

工具類的繼承關(guān)系

在MFC中,狀態(tài)欄的功能由CToolBar類實現(xiàn)。4.2工具欄

在MFC中,工具欄的功能由類CToolBar實現(xiàn)。工具欄資源和工具欄類CToolBar是工具欄的兩個要素。創(chuàng)建工具欄的基本步驟是:

創(chuàng)建工具欄資源;

構(gòu)建一個CToolBar對象;

調(diào)用CToolBar::Create()或CreateEx()函數(shù)創(chuàng)建工具欄窗口;

調(diào)用CToolBar::LoadToolBar載入工具欄資源。工具欄???/工具欄對象可以停靠m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);//主框架窗口可以被??縀nableDocking(CBRS_ALIGN_ANY);//??吭谥鞔翱诳蚣蹹ockControlBar(&m_wndToolBar);4.2.3自定義工具欄的操作

向?qū)傻臉藴使ぞ邫诘腎D值為IDR_MAINFRAME。對一些功能復雜的應用程序,需要創(chuàng)建多個不同的工具欄。生成工具欄的基本步驟:

(1)添加工具欄資源;

(2)參照MFC應用程序框架添加工具欄的方法,構(gòu)造一個CToolBar類的對象,調(diào)用CToolBar::Create()或CreateEx()函數(shù)創(chuàng)建工具欄窗口;

(3)調(diào)用CToolBar::LoadToolBar()函數(shù)載入工具欄資源。

除這些基本步驟之外,還可以調(diào)用其他相關(guān)函數(shù)從而進一步改善工具欄。1.創(chuàng)建工具欄窗口

調(diào)用CToolBar::Create()或CreateEx()函數(shù)創(chuàng)建并初始化工具欄窗口對象。若創(chuàng)建成功,函數(shù)返回TRUE,否則返回FALSE。2.裝載工具欄資源

調(diào)用LoadToolBar()函數(shù)裝載工具欄資源。用Create()或者CreateEx()函數(shù)創(chuàng)建工具欄,其實只是獲得了一個窗口句柄,工具欄窗口中位圖按鈕的加載是靠LoadToolBar()函數(shù)來完成的。若加載成功,將返回TRUE,否則返回FALSE。3.設置工具欄風格

如果在調(diào)用初始化函數(shù)CToolBar::Create()或者CreateEx()時設置的工具欄風格不滿足需要,可以再用SetBarStyle()函數(shù)重新進行設置。4.設置工具欄??刻匦?/p>

設置工具欄??刻匦?,需要調(diào)用EnableDocking()函數(shù)。既要調(diào)用CControlBar::EnableDocking()函數(shù)設置工具欄的??刻匦?,還要調(diào)用框架類的成員函數(shù)EnableDocking()函數(shù)來設置框架窗口以允許它的子窗口控制欄可以以何種方式???。不管一個框架窗口中有多少個子窗口控制欄,該函數(shù)只需調(diào)用一次。5.設置工具欄的初始停靠位置

通過調(diào)用CFrameWnd::DockControlBar()函數(shù)定位一個工具欄的初始??课恢?。6.移動工具欄

調(diào)用CFrameWnd::FloatControlBar()函數(shù)來移動、定位一個工具欄。7.工具欄隱顯控制

通過對函數(shù)CWnd::SetStyle()的調(diào)用可以改變某些工具欄窗口的風格,但該函數(shù)不能改變WS_VISIBLE,只能通過父類CWnd的ShowWindow()成員函數(shù)來顯示或隱藏工具欄。

【例4.9】編寫一個單文檔應用程序Li4_9。為該應用程序創(chuàng)建一個帶有“線”、“圓”、“矩形”和“文本”4個按鈕的工具欄,當用戶單擊工具欄上的按鈕時,在窗口中顯示相應的圖形。工具欄的顯示與隱藏方法一:父類CWnd的ShowWindow()成員函數(shù)來顯示或隱藏工具欄。

“查看”中新建一個菜單及處理函數(shù)。IsWindowVisible()判斷窗口是否可視。ShowWindow(SW_HIDE)ShowWindow(SW_SHOW)CFrameWnd的RecalcLayout()控制布局DockControlBar(&m_myToolBar)重新停靠工具欄的顯示與隱藏方法二:父類CFrameWnd的ShowControlBar()成員函數(shù)來顯示或隱藏工具欄。

“查看”中新建一個菜單及處理函數(shù)。ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),false);4.3狀態(tài)欄

狀態(tài)欄實際上是一個窗口,一般分為幾個窗格,每個窗格顯示不同的信息。使用AppWizard創(chuàng)建的單文檔應用程序,接受默認選項時,生成的應用程序自動創(chuàng)建帶有默認窗格的狀態(tài)欄。

4.3.1狀態(tài)欄類的繼承關(guān)系

在MFC中,狀態(tài)欄的功能由CStatusBar類實現(xiàn)。

4.3.2狀態(tài)欄類的成員函數(shù)

4.3.3狀態(tài)欄操作利用MFCAppWizard向?qū)?chuàng)建應用程序時,首先在C

溫馨提示

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

評論

0/150

提交評論