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

下載本文檔

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

文檔簡介

1、.1 第四章第四章 菜單、工具欄和狀態(tài)欄菜單、工具欄和狀態(tài)欄 4.1菜單菜單 4.2工具欄工具欄 4.3狀態(tài)欄狀態(tài)欄 4.4交互對象的動態(tài)更新交互對象的動態(tài)更新 4.5綜合應(yīng)用綜合應(yīng)用 view-doc-mainframe-app .2 4.1菜單菜單 菜單是一系列命令的列表,通過選中其中的菜單項 (命令)來執(zhí)行相應(yīng)任務(wù)。 菜單系統(tǒng)的設(shè)計規(guī)則: 菜單項文本后有“”, 將彈出一個對話框。 若某項菜單有子菜單,那么在該菜單項文本后有 “”。 助記符,則用括號將帶下劃線的字母括起來。助 記符與Alt構(gòu)成一個組合鍵。 若某項菜單需要快捷鍵的支持,則一般將其列在 相應(yīng)菜單項文本之后。所謂“快捷鍵”是一個

2、組合鍵,如 Ctrl+N。 頂層菜單頂層菜單,每一個頂層菜單項可以是一個簡單的菜單命令, 也可以是下拉下拉(Popup)菜單。 .3 4.1菜單菜單 表表4.1 菜單菜單General屬性對話框的各項含義屬性對話框的各項含義 項項 目目含含 義義 ID菜單的資源ID標(biāo)識符 標(biāo)題(Caption)用來標(biāo)識菜單項顯示文本。助記符字母的前面須有一個/ 使菜單對象和菜單句柄分離 m_NewMenu.LoadMenu( IDR_MAINFRAME ); SetMenu(NULL); / 清除應(yīng)用程序菜單 SetMenu( / 設(shè)置應(yīng)用程序菜單 LoadMenu和Detach都是CMenu類成員函數(shù). 在

3、調(diào)用LoadMenu后,菜單對象m_NewMenu就擁有一個 菜單句柄,當(dāng)再次調(diào)用LoadMenu時,由于菜單對象的句 柄已經(jīng)創(chuàng)建,因而會發(fā)生運行時錯誤,但當(dāng)菜單對象與菜 單句柄分離后,就可以再次創(chuàng)建菜單了。 SetMenu是CWnd類的一個成員函數(shù),用來設(shè)置應(yīng)用程序 的菜單。 .6 4.1菜單菜單 4.1.4 菜單的編程控制 1. 創(chuàng)建菜單創(chuàng)建菜單 CMenu類的CreateMenu和CreatePopupMenu分別用 來創(chuàng)建一個菜單或子菜單框架,它們的原型如下: BOOL CreateMenu( ); / 產(chǎn)生一個空菜單 BOOL CreatePopupMenu( );/ 產(chǎn)生一個空的

4、彈出式子菜單 2. 裝入菜單裝入菜單 將菜單從資源裝入應(yīng)用程序中,需調(diào)用CMenu成員函 數(shù)LoadMenu,或者用SetMenu對應(yīng)用程序菜單進(jìn)行重新 設(shè)置。 BOOL LoadMenu( LPCTSTR lpszResourceName ); BOOL LoadMenu( UINT nIDResource ); lpszResourceName為菜單資源名稱為菜單資源名稱 nIDResource為菜單資源為菜單資源ID標(biāo)識符。標(biāo)識符。 .7 3. 添加菜單項添加菜單項 AppendMenu或InsertMenu函數(shù)來添加一些菜單項。 AppendMenu是將菜單項添加在菜單的末尾處,而 I

5、nsertMenu在菜單的指定位置處插入菜單項,并將后面的菜 單項依次下移。 BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0,LPCTSTR lpszNewItem = NULL ); BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL ); BOOL InsertMen

6、u( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ); 其中,nIDNewItem表示新菜單項的資源ID標(biāo)識符, lpszNewItem表示新菜單項的內(nèi)容,pBmp用于菜單項的位圖 指針,nPosition表示新菜單項要插入的菜單項位置。nFlags 表示要增加的新菜單項的狀態(tài)信息,它的值影響其他參數(shù)的 含義,如表4.3所示。 .8 表表4.3 nFlags的值及其對其他參數(shù)的影響的值及其對其他參數(shù)的影響 nFlags值值含含 義義nPosition值值 nIDNewItem 值值 lpszNewItem

7、值值 MF_BYCOMMAND 菜單項以ID 標(biāo)識符來標(biāo)識 菜單項資源 ID MF_BYPOSITION 菜單項以位置 來標(biāo)識 菜單項的位 置 MF_POPUP 菜單項有彈出 式子菜單 彈出式菜單 句柄 MF_SEPARATOR分隔線忽略忽略 MF_OWNERDRAW自畫菜單項自畫所需數(shù)據(jù) MF_STRING字符串標(biāo)志字符串指針 MF_CHECKED 設(shè)置菜單項的 選中標(biāo)記 MF_UNCHECKED取消選中標(biāo)記 MF_DISABLED禁用菜單項 MF_ENABLED允許用菜單項 MF_GRAYED菜單項灰顯 .9 4.1菜單菜單 需要注意的是: 當(dāng)nFlags為MF_BYPOSITION時,n

8、Position表示 新菜單項要插入的具體位置,為0時表示第一個菜單項,為 -1時,將菜單項添加菜單的末尾處。 nFlags的標(biāo)志中,可以用“|”(按位或)來組合, 例如MF_CHECKED|MF_STRING等。但有些組合是不允 許的。 當(dāng)菜單項增加、改變或刪除后,不管菜單依附的 窗口是否改變,都應(yīng)調(diào)用CWnd:DrawMenuBar來更新菜 單。 4. 刪除菜單項刪除菜單項 BOOL DeleteMenu( UINT nPosition, UINT nFlags ); 其中,參數(shù)nPosition表示要刪除的菜單項位置,它由 nFlags進(jìn)行說明。nFlags為為MF_BYCOMMAND或

9、者或者 MF_BYPOSITION。 另外一個函數(shù):另外一個函數(shù):RemoveMenu(); .10 4.1菜單菜單 5. 獲取菜單項獲取菜單項 CMenu成員函數(shù)分別獲得菜單的項數(shù)、菜單項的ID標(biāo) 識符以及彈出式子菜單的句柄。 UINT GetMenuItemCount( ) const; 該函數(shù)用來獲得菜單的菜單項數(shù),調(diào)用失敗后返回-1。 UINT GetMenuItemID( int nPos ) const; 該函數(shù)用來獲得由nPos指定菜單項位置(以0為基數(shù)) 的菜單項的標(biāo)識號,若nPos是SEPARATOR(分隔符),則 返回-1。 CMenu* GetSubMenu( int n

10、Pos ) const; 該函數(shù)用來獲得指定菜單的彈出式菜單的菜單句柄。 該彈出式菜單位置由參數(shù)nPos指定,開始的位置為0。若 菜單不存在,則創(chuàng)建一個臨時的菜單指針。 .11 4.1菜單菜單 (2)選擇)選擇“查看查看”“資源符號資源符號” (Resource Symbols)命令,)命令, 彈出彈出“資源符號資源符號”對話框,它能對話框,它能 對應(yīng)用程序中的資源標(biāo)識符進(jìn)行對應(yīng)用程序中的資源標(biāo)識符進(jìn)行 管理。管理。 .12 4.1菜單菜單 (3)“新建符號”(New Symbol)對話框。 在“名稱”(Name)框中輸入一個新的標(biāo)識符 ID_NEW_MENUITEM。在“值”(Value)框

11、中, 輸入該ID的值,系統(tǒng)要求用戶定義的ID值應(yīng)大于 15(0X000F)而小于61440(0XF000)。 .13 4.1菜單菜單 (4)在CMainFrame:OnCreate函數(shù)中添加下列代碼,該函數(shù)在框架窗口創(chuàng)建時自 動調(diào)用。 int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct) . CMenu* pSysMenu = GetMenu();/ 獲得程序菜單指針 CMenu* pSubMenu = pSysMenu-GetSubMenu(1); / 獲得第二個子菜單的指針 CString strMenuItem(新的菜單項); pS

12、ubMenu-AppendMenu(MF_SEPARATOR);/ 增加一水平分隔線 pSubMenu-AppendMenu(MF_STRING,ID_NEW_MENUITEM, strMenuItem); / 在子菜單中增加一菜單項 m_bAutoMenuEnable = FALSE; / 關(guān)閉自動更新菜單狀態(tài),這樣避免添加 的菜單項是禁用的 pSysMenu- EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|MF_ENABLED); / 激活菜單項 DrawMenuBar();/ 更新菜單 return 0; .14 4.1菜單菜單 (5)此時編譯運

13、行后,結(jié)果如圖4.15所示。但此時選擇“新的菜單項”命令不會有反應(yīng)。 圖圖4.15 程序添加的菜單項程序添加的菜單項 (6)用MFC ClassWizard在CMainFrame添加OnCommand消息函數(shù)的重載,并添 加下列代碼: BOOL CMainFrame:OnCommand(WPARAM wParam, LPARAM lParam) / wParam的低字節(jié)表示菜單、控件、加速鍵的命令I(lǐng)D if (LOWORD(wParam) = ID_NEW_MENUITEM) MessageBox(你選中了新的菜單項); return CFrameWnd:OnCommand(wParam, l

14、Param); .15 4.1菜單菜單 4.1.5 使用快捷菜單 快捷菜單快捷菜單是一種浮動的彈出式菜單。 CMenu:TrackPopupMenu函數(shù)原型如下:函數(shù)原型如下: BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 該函數(shù)用來顯示一個浮動的彈出式菜單,其位置由各參數(shù)決定。其 中,nFlags表示菜單在屏幕顯示的位置以及鼠標(biāo)按鈕標(biāo)志。 x和y表示菜單的水平坐標(biāo)和菜單的頂端的垂直坐標(biāo)。 pWnd表示彈出菜單的窗口,此窗口將收到菜單全部的 WM_COMMAND消息。 l

15、pRect是一個RECT結(jié)構(gòu)或CRect類指針,它表示一個矩形區(qū)域, 用戶 單擊這個區(qū)域時,彈出菜單不消失。而當(dāng)lpRect為NULL時,若用戶擊 在菜單外面, 菜單立刻消失。 右擊鼠標(biāo)時會向系統(tǒng)發(fā)送WM_CONTEXTMENU通知消息 nFlags值值含含 義義 TPM_CENTERALIGN 屏幕位置標(biāo)志,表示菜單的水平中心位置 由x坐標(biāo)確定 TPM_LEFTALIGN 屏幕位置標(biāo)志,表示菜單的左邊位置由x坐 標(biāo)確定 TPM_RIGHTALIGN 屏幕位置標(biāo)志,表示菜單的右邊位置由x坐 標(biāo)確定 TPM_LEFTBUTTON 鼠標(biāo)按鈕標(biāo)志,表示當(dāng)用戶單擊鼠標(biāo)左鍵 時彈出菜單 TPM_RIGH

16、TBUTTON 鼠標(biāo)按鈕標(biāo)志,表示用戶單擊鼠標(biāo)右鍵時 彈出菜單 .16 客戶區(qū)坐標(biāo)和屏幕坐標(biāo) BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL ); 其中其中x,y為為屏幕坐標(biāo)屏幕坐標(biāo) 鼠標(biāo)單擊點處的坐標(biāo)是鼠標(biāo)單擊點處的坐標(biāo)是客戶區(qū)坐標(biāo)客戶區(qū)坐標(biāo),即以程序窗口中客,即以程序窗口中客 戶區(qū)左上角為坐標(biāo)原點。戶區(qū)左上角為坐標(biāo)原點。 客戶區(qū)坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo),函數(shù)原型:客戶區(qū)坐標(biāo)轉(zhuǎn)化為屏幕坐標(biāo),函數(shù)原型: void ClientToScreen( LPPOINT lpPoint ) co

17、nst; void ClientToScreen( LPRECT lpRect ) const; 舉例舉例 : void CExView:OnLButtonDown(UINT nFlags, CPoint point) ClientToScreen( /自己定義的工具條自己定義的工具條 4.2.3 加入用戶自定義的工具條加入用戶自定義的工具條 .22 (1)調(diào)用工具條類的調(diào)用工具條類的Create()或或CreateEx()成員成員 函數(shù)創(chuàng)建該工具條函數(shù)創(chuàng)建該工具條 (2)調(diào)用調(diào)用LoadToolBar()成員函數(shù)將工具條對成員函數(shù)將工具條對 象和前面創(chuàng)建的工具條資源連接在一起。象和前面創(chuàng)建的

18、工具條資源連接在一起。 i f ( ! m _ w n d To o l B a r . C r e a t e ( t h i s, W S _ V I S I B L E | C B R S _ T O P ) |!m_wndToolBar.LoadToolBar(IDR_TESTBAR) / /引 入 資 源引 入 資 源 IDR_TESTBAR TRACE0(Failed to create toolbarn); return -1; / fail to create .23 3 對工具條進(jìn)行操作對工具條進(jìn)行操作 創(chuàng)建完成工具條后,可調(diào)用工具條類中的成員函創(chuàng)建完成工具條后,可調(diào)用工具條

19、類中的成員函 數(shù)對工具條進(jìn)行操作,例如設(shè)定工具條風(fēng)格,在窗口數(shù)對工具條進(jìn)行操作,例如設(shè)定工具條風(fēng)格,在窗口 中移動工具條,控制工具條的顯隱等。中移動工具條,控制工具條的顯隱等。 m_wndTestBar.SetBarStyle(CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC); 可在程序中設(shè)置允許用戶在程序運行中在框架窗口內(nèi)可在程序中設(shè)置允許用戶在程序運行中在框架窗口內(nèi) 移動工具條。通過調(diào)用移動工具條。通過調(diào)用CToolBar:EnableDocking和和 CFrame:EnableDocking來實現(xiàn)的。二函數(shù)原型均如下:來實現(xiàn)的。二函數(shù)原型均

20、如下: void EnableDocking( DWORD dwStyle ) .24 4 控制工具條的顯示控制工具條的顯示 CFrameWnd:ShowControlBar函數(shù)就是起到這樣的作用, 有3個參數(shù),第1個參數(shù)用來指定要操作的工具欄或狀態(tài) 欄指針,第2個參數(shù)是一個布爾型,當(dāng)為TRUE時表示顯 示,否則表示隱藏,第3個參數(shù)用來表示是否延遲顯示 或隱藏,當(dāng)為FALSE時表示立即顯示或隱藏。 void CMainFrame:OnViewNewbar() int bShow = m_wndTestBar.IsWindowVisible(); ShowControlBar( .25 4.2工

21、具欄工具欄 4.2.3 多個工具欄的使用 在用MFC AppWizard創(chuàng)建的文檔應(yīng)用程序中往往只有一個工具欄,但在實際應(yīng)用中, 常常需要多個工具欄。這里以一個實例的形式來討論多個工具欄的創(chuàng)建、顯示和隱 藏等操作。 例例Ex_MultiBar 多個工具欄的使用多個工具欄的使用 (1)創(chuàng)建一個默認(rèn)的單文檔應(yīng)用程序Ex_MultiBar。 (2)將項目工作區(qū)切換到ResourceView頁面,展開“Toolbar”(工具欄)資源, 用鼠標(biāo)單擊IDR_MAINFRAME不松開,然后按下Ctrl鍵,移動鼠標(biāo)將IDR_MAINFRAME 拖到 Toolbar資源名稱上,這樣就復(fù)制了工具欄默認(rèn)資源IDR_

22、MAINFRAME,復(fù)制后的 資源 標(biāo)識系統(tǒng)自動設(shè)為IDR_MAINFRAME1。 (3)右擊工具欄資源IDR_MAINFRAME1,從彈出的快捷菜單中選擇Properties命 令,如圖4.20所示,將ID設(shè)為IDR_TOOLBAR1。 圖圖4.20 工具欄屬性對話框工具欄屬性對話框 .26 4.2工具欄工具欄 (4)雙擊IDR_TOOLBAR1,打開工具欄資源,刪除幾個“編輯”相關(guān)的工具按鈕 (目的是讓IDR_TOOLBAR1工具欄與IDR_MAINFRAME有明顯區(qū)別)。 (5)在CMainFrame類中添加一個成員變量m_wndTestBar,變量類型為CToolBar (CToolB

23、ar類封裝了工具欄的操作)。 protected: / control bar embedded members CStatusBar m_wndStatusBar; CToolBar m_wndToolBar; CToolBar m_wndTestBar; (6)在CMainFrame:OnCreate函數(shù)中添加下面的工具欄創(chuàng)建代碼: 分析和說明: 代碼中,CreateEx是CToolBar類的成員函數(shù),用來創(chuàng)建一個工具欄對象。該函 數(shù)的第1個參數(shù)是用來指定工具欄所在的父窗口指針,this表示當(dāng)前的CMainFrame類 窗口指針。第2個參數(shù)用來指針工具按鈕的風(fēng)格,當(dāng)為TBSTYLE_FLA

24、T時表示工具按 鈕是“平面”的。第3個參數(shù)用來指針工具欄的風(fēng)格。由于這里的工具欄是 CMainFrame的子窗口,因此需要指定WS_CHILD | WS_VISIBLE。CBRS_TOP表示 工具欄放置在父窗口的頂部,CBRS_GRIPPER表示工具欄前面有一個“把手”, CBRS_TOOLTIPS表示允許有工具提示,CBRS_FLYBY表示在狀態(tài)欄顯示工具提示 文本,CBRS_SIZE_DYNAMIC表示工具欄在浮動時,其大小是可以動態(tài)改變的。第4 個參數(shù)是用來指定工具欄四周的邊框大小,一般都為0。最后一個參數(shù)是用來指定工具 欄這個子窗口的標(biāo)識ID(與工具欄資源標(biāo)識不同)。 .27 4.2工

25、具欄工具欄 if語句中的LoadToolBar函數(shù)是用來裝載工具欄資源。若CreateEx或 LoadToolBar的返回值為0,即調(diào)用不成功,則顯示診斷信息“Failed to create toolbar”。TRACE0是一個用于程序調(diào)試的跟蹤宏。OnCreate函數(shù)返回-1時,主框架 窗口被清除。 應(yīng)用程序中的工具欄一般具有??炕蚋犹匦?,m_wndTestBar.EnableDocking 使得m_wndTestBar對象可以停靠,CBRS_ALIGN_ANY表示可以停靠在窗口的任一邊。 EnableDocking(CBRS_ALIGN_ANY)是調(diào)用的是CFrameWnd類的成員函數(shù)

26、,用來讓 工具欄或其他控制條在主框架窗口可以進(jìn)行??坎僮?。DockControlBar也是 CFrameWnd類的成員函數(shù),用來將指定的工具欄或其他控制條進(jìn)行??俊?AFX_IDW_TOOLBAR是系統(tǒng)內(nèi)部的工具欄子窗口標(biāo)識工具欄子窗口標(biāo)識,并將 AFX_IDW_TOOLBAR + 1的值表示默認(rèn)的狀態(tài)欄子窗口標(biāo)識狀態(tài)欄子窗口標(biāo)識。如果在創(chuàng)建新的工具欄 時沒有指定相應(yīng)的子窗口標(biāo)識,則會使用默認(rèn)的AFX_IDW_TOOLBAR。這樣,當(dāng)打開 “查看”菜單時,單擊“工具欄”菜單時,顯示或隱藏的工具欄不是原來的工具欄而 是新添加的工具欄。因此,需要重新指定工具欄子窗口的標(biāo)識,并使其值等于 AFX_I

27、DW_TOOLBAR + 10。 .28 4.2工具欄工具欄 (7)編譯運行,結(jié)果如圖4.21所示。 圖圖4.21 多個工具欄第一次運行的結(jié)果多個工具欄第一次運行的結(jié)果 (8)事實上多個工具欄的程序重點不是在于工具欄的顯示,而是如何控制其顯示。 CFrameWnd:ShowControlBar函數(shù)就是起到這樣的作用,有3個參數(shù),第1個參數(shù)用來 指定要操作的工具欄或狀態(tài)欄指針,第2個參數(shù)是一個布爾型,當(dāng)為TRUE時表示顯示, 否則表示隱藏,第3個參數(shù)用來表示是否延遲顯示或隱藏,當(dāng)為FALSE時表示立即顯示 或隱藏。 .29 4.2工具欄工具欄 (9)打開菜單資源IDR_MAINFRAME,在“查

28、看”菜單下添加一個“新的工具欄 ( ShowControlBar( .30 4.3狀態(tài)欄狀態(tài)欄 4.3.1 狀態(tài)欄的定義 用MFC AppWizard(.exe)創(chuàng)建的SDI或MDI 應(yīng)用程序框架中,有一個靜態(tài)的indicator數(shù)組, 它是在MainFrm.cpp文件中指定的,被MFC用 作狀態(tài)欄的定義。 Static UINT indicators= ID_SEPARATOR, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL, 圖圖4.22 indicators數(shù)組的定義數(shù)組的定義 .31 4.3狀態(tài)欄狀態(tài)欄 4.3.2 狀態(tài)欄

29、的常用操作: CStatusBar類 1. 增加和減少窗格增加和減少窗格 窗格分為信息行窗格和指示器窗格信息行窗格和指示器窗格兩類。 增加一個信息行窗格,則只需在indicators數(shù)組中的適當(dāng)位置 中增加一個ID_SEPARATOR標(biāo)識即可; 增加一個用戶指示器窗格,則在indicators數(shù)組中的適當(dāng)位置 增加一個在字符串表中定義過的資源ID,其字符串的長度表 示用戶指示器窗格的大小。 減少一個窗格,只需減少indicators數(shù)組元素。 2. 在狀態(tài)欄上顯示文本在狀態(tài)欄上顯示文本 BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOO

30、L bUpdate = TRUE ); 若bUpdate為TRUE,則系統(tǒng)自動更新顯示的結(jié)果。 .32 4.3狀態(tài)欄狀態(tài)欄 4.3.3 改變狀態(tài)欄的風(fēng)格 void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth ); void SetPaneStyle( int nIndex, UINT nStyle ); 參數(shù)nIndex表示要設(shè)置的狀態(tài)欄窗格的索引,nID用來為狀 態(tài)欄窗格指定新的ID,cxWidth表示窗格的像素寬度, nStyle表示窗格的風(fēng)格類型,用來指定窗格的外觀。 風(fēng)格類型風(fēng)格類型含含 義義 SBPS_NOB

31、ORDERS窗格周圍沒有窗格周圍沒有3D邊框邊框 SBPS_POPOUT反顯邊界以使文字反顯邊界以使文字“凸出來凸出來” SBPS_DISABLED禁用窗格,不顯示文本禁用窗格,不顯示文本 SBPS_STRETCH 拉伸窗格,并填充窗格不用的空白空間。拉伸窗格,并填充窗格不用的空白空間。 但狀態(tài)欄只能有一個窗格具有這種風(fēng)格但狀態(tài)欄只能有一個窗格具有這種風(fēng)格 SBPS_NORMAL 普通風(fēng)格,它沒有普通風(fēng)格,它沒有“拉伸拉伸”,“3D邊框邊框” 或或“凸出來凸出來”等特性等特性 .33 4.3狀態(tài)欄狀態(tài)欄 例例Ex_SDIMouse 在狀態(tài)欄上顯示鼠標(biāo)位置在狀態(tài)欄上顯示鼠標(biāo)位置 (1)創(chuàng)建一個默

32、認(rèn)的單文檔應(yīng)用程序Ex_SDIMouse。 (2)將項目工作區(qū)切換到ClassView頁面,展開CMainFrame所有項,雙擊構(gòu)造 函數(shù)CMainFrame,在文檔窗口中出現(xiàn)該函數(shù)的定義,在它的前面就是狀態(tài)欄數(shù)組的 定義。 (3)將狀態(tài)欄indicators數(shù)組的定義改為下列代碼: static UINT indicators = ID_SEPARATOR, ID_SEPARATOR, ; (4)由于鼠標(biāo)移動消息WM_MOUSEMOVE在CMainFrame類映射后不起作用, 因此只能映射到CEx_SDIMouseView類中。但是,這樣一來,就需要更多的代碼,因 為狀態(tài)欄對象m_wndSt

33、atusBar是在CMainFrame類定義的成員變量,因而需要在 CEx_SDIMouseView類中添加訪問CMainFrame類的代碼。 CEx_SDIMouseView:OnMouseMove函數(shù)代碼如下: .34 4.3狀態(tài)欄狀態(tài)欄 void CEx_SDIMouseView:OnMouseMove(UINT nFlags, CPoint point) CString str; CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 獲得主窗口指針 CStatusBar* pStatus= / 獲得主窗口中的狀態(tài)欄指針 if

34、 (pStatus) str.Format(X=%d, Y=%d,point.x, point.y); / 格式化文本 pStatus-SetPaneText(1,str); / 更新第二個窗格的文本 CView:OnMouseMove(nFlags, point); .35 4.3狀態(tài)欄狀態(tài)欄 代碼中,AfxGetApp是CWinApp類的一個成員函數(shù),該函數(shù)可在應(yīng)用程序項目 中的任何類中使用,用來獲取應(yīng)用程序中的CWinApp類對象指針。 (5)將MainFrm.h文件中的受保護(hù)變量m_wndStatusBar變成公共變量。 (6)在Ex_SDIMouseView.cpp文件的開始處增加下

35、列語句: #include Ex_SDIMouseView.h #include MainFrm.h (7)編譯并運行,結(jié)果如圖4.23所示。 圖圖4.23 鼠標(biāo)的位置顯示在狀態(tài)欄上鼠標(biāo)的位置顯示在狀態(tài)欄上 .36 4.3狀態(tài)欄狀態(tài)欄 例如,在前面的示例中,將OnMouseMove函數(shù)修改為下列代碼,則結(jié)果如圖4.24所示。 void CEx_SDIMouseView:OnMouseMove(UINT nFlags, CPoint point) CString str; CMainFrame* pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd; / 獲得主窗

36、口指針 CStatusBar* pStatus= / 獲得主窗口中的 狀態(tài)欄指針if (pStatus) pStatus-SetPaneStyle(1, SBPS_POPOUT); str.Format(X=%d, Y=%d,point.x, point.y); / 格式化文本 pStatus-SetPaneText(1,str); / 更新第二個窗格的文本 CView:OnMouseMove(nFlags, point); 圖圖4.24 設(shè)置狀態(tài)欄的風(fēng)格設(shè)置狀態(tài)欄的風(fēng)格 .37 4.4交互對象的動態(tài)更新交互對象的動態(tài)更新 自動將用戶交互對象的自動將用戶交互對象的ID標(biāo)識符與標(biāo)識符與 ON_U

37、PDATE_COMMAND_UI宏相連接并產(chǎn)生處理更新宏相連接并產(chǎn)生處理更新 消息的相應(yīng)函數(shù)。消息的相應(yīng)函數(shù)。 void CMainFrame:OnUpdateTestToolbar(CCmdUI* pCmdUI) int bShow = m_wndTestBar.IsWindowVisible(); pCmdUI -SetCheck( bShow ); 該函數(shù)參數(shù)是指向該函數(shù)參數(shù)是指向CCmdUI對象的指針。對象的指針。 CCmdUI 類僅用于類僅用于ON_UPDATE_COMMAND_UI消息映消息映 射函數(shù),它的成員函數(shù)將對菜單項、工具按鈕等用戶交互射函數(shù),它的成員函數(shù)將對菜單項、工具按

38、鈕等用戶交互 對象起作用。對象起作用。 用戶交互對象EnableSetCheckSetRadioSetText 菜單項允許或禁用 選中或未選中選中用點()設(shè)置菜單文本 工具欄按鈕允許或禁用 選定、未選定或 不確定 同SetCheck無效 狀態(tài)欄窗格 (PANE) 使文本可見 或不可見 邊框外凸或正常同SetCheck設(shè)置窗格文本 CDialogBar中 的按鈕 允許或禁用選中或未選中同SetCheck設(shè)置按鈕文本 CDialogBar中 的控件 允許或禁用無效無效設(shè)置窗口文本 .38 命令更新 菜單項狀態(tài)的維護(hù)是依賴于CN_UPDATE_COMMAND_UI 消息,誰捕獲CN_UPDATE_C

39、OMMAND_UI消息,MFC就在其 中創(chuàng)建一個CCmdUI對象。我們可以通過手工或利用 ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI宏 來捕獲CN_UPDATE_COMMAND_UI消息。 后臺所做的工作是:操作系統(tǒng)發(fā)出 WM_INITMENUPOPUP消息,然后由MFC的基類如 CFrameWnd接管。它創(chuàng)建一個CCmdUI對象,并與第一個菜單 項相關(guān)聯(lián),調(diào)用對象的一個成員函數(shù)DoUpdate()。這個函數(shù)發(fā) 出CN_UPDATE_COMMAND_UI消息,這條消息帶有指向 CCmdUI對象的指針。同一個CCmdUI對象就設(shè)置為與第二個菜 單項相關(guān)聯(lián),這樣

40、順序進(jìn)行,直到完成所有菜單項。 更新命令UI處理程序僅應(yīng)用于彈出式菜單項上的項目,不 能應(yīng)用于永久顯示的頂級菜單項目。 .39 重點:重點: 菜單的靜態(tài)和動態(tài)控制 理解交互對象的動態(tài)更新機(jī)制 .40 4.5綜合應(yīng)用綜合應(yīng)用 例Ex_A4,其中彈出對話框即圖4-26改 為使用圖3-57(b). .41 4.5綜合應(yīng)用綜合應(yīng)用 為了能對學(xué)生成績記錄進(jìn)行管理,常見的操作包括:添加、刪除和查找等。 這 些操作在在文檔應(yīng)用程序中實現(xiàn)時可以有多種界面方法,具體如下: (1)構(gòu)造單獨的“操作”工具欄,包含上述操作的工具按鈕。 (2)在文檔應(yīng)用程序的主菜單中的“查看”菜單下添加一個“操作工具欄( ShowControlBar( UpdateOpMenu( !bShow ); void CMainFrame:OnUpdateViewOp(CCmdUI*

溫馨提示

  • 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

提交評論