国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
VS2010/MFC編程入門(mén)之三十五(菜單:菜單及CMenu類(lèi)的使用)
 
分類(lèi)標(biāo)簽: 編程入門(mén)  VS2010  VC++  MFC  

       雞啄米在上一節(jié)中講的是VS2010的菜單資源,本節(jié)主要講菜單及CMenu類(lèi)的使用。

       CMenu類(lèi)的主要成員函數(shù)

       MFC為菜單的操作提供了CMenu類(lèi),下面雞啄米就常用的幾個(gè)成員函數(shù)進(jìn)行簡(jiǎn)單的介紹。

       BOOL LoadMenu(UINT nIDResource);

       加載菜單資源,并將其附加到CMenu對(duì)象上。參數(shù)nIDResource指定了要加載的菜單資源的ID。如果菜單加載成功則返回TRUE,否則返回FALSE。

       BOOL DeleteMenu(UINT nPosition,UINT nFlags);

       在菜單中刪除一個(gè)菜單項(xiàng)。參數(shù)nPosition指定要?jiǎng)h除的菜單項(xiàng)。參數(shù)nFlags就用來(lái)解釋nPosition的意義,為MF_BYCOMMAND時(shí)說(shuō)明nPosition表示菜單項(xiàng)的ID,為MF_BYPOSITION時(shí)說(shuō)明nPosition表示菜單項(xiàng)的位置,第一個(gè)菜單項(xiàng)的位置為0。如果刪除菜單項(xiàng)成功則返回TRUE,否則返回FALSE。

       BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd* pWnd,LPCRECT lpRect = 0);

       用來(lái)在指定位置顯示一個(gè)浮動(dòng)的彈出式菜單。參數(shù)nFlags指定屏幕坐標(biāo)和鼠標(biāo)位置的標(biāo)志,可以是以下取值:

       TPM_CENTERALIGN:菜單在水平方向上相對(duì)于參數(shù)x指定的坐標(biāo)值居中顯示
       TPM_LEFTALIGN:菜單的左側(cè)與參數(shù)x指定的坐標(biāo)值對(duì)齊
       TPM_RIGHTALIGN:菜單的右側(cè)與參數(shù)x指定的坐標(biāo)值對(duì)齊
       TPM_BOTTOMALIGN:菜單的底部與參數(shù)y指定的坐標(biāo)值對(duì)齊
       TPM_TOPALIGN:菜單項(xiàng)的頂部與參數(shù)y指定的坐標(biāo)值對(duì)齊
       TPM_VCENTERALIGN:菜單在垂直方向上相對(duì)于參數(shù)y指定的坐標(biāo)值居中顯示

       這里先介紹這幾個(gè)比較常用的,其他可參見(jiàn)MSDN。參數(shù)x指定彈出式菜單的水平方向的屏幕坐標(biāo),參數(shù)y指定菜單頂部垂直方向上的屏幕坐標(biāo),參數(shù)pWnd指明哪個(gè)窗口擁有此彈出式菜單,不能為NULL,參數(shù)lpRect忽略。

       UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);

       在彈出菜單中為菜單項(xiàng)增加選中標(biāo)記或移除選中標(biāo)記。參數(shù)nIDCheckItem指定要選中或取消選中的菜單項(xiàng)。參數(shù)nCheck指定菜單項(xiàng)的選中狀態(tài)和如何根據(jù)nIDCheckItem確定菜單項(xiàng)的位置,可以是MF_CHECKED或MF_UNCHECKED與MF_BYPOSITION或MF_BYCOMMAND的組合,這幾個(gè)標(biāo)志的含義如下:

       MF_BYCOMMAND:為默認(rèn)值。說(shuō)明參數(shù)nIDCheckItem表示菜單項(xiàng)的ID
       MF_BYPOSITION:說(shuō)明參數(shù)nIDCheckItem表示菜單項(xiàng)的位置,第一個(gè)菜單項(xiàng)的位置是0
       MF_CHECKED:為菜單項(xiàng)添加選中標(biāo)記
       MF_UNCHECKED:為菜單項(xiàng)移除選中標(biāo)記

       該函數(shù)返回菜單項(xiàng)之前的狀態(tài):MF_CHECKED或MF_UNCHECKED, 如果菜單項(xiàng)不存在則返回0xFFFFFFFF。

       UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);

       激活、禁用菜單項(xiàng)或使其變灰。參數(shù)nIDEnableItem指定要激活、禁用或變灰的菜單項(xiàng)。參數(shù)nEnable指定操作的類(lèi)型,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED與MF_BYCOMMAND或MF_BYPOSITION的組合,這些值的含義如下:

       MF_BYCOMMAND:同CheckMenuItem
       MF_BYPOSITION:同CheckMenuItem
       MF_DISABLED:禁用菜單項(xiàng),使其不能被選擇但不變灰
       MF_ENABLED:激活菜單項(xiàng),使其能夠被選擇并由變灰狀態(tài)恢復(fù)
       MF_GRAYED:禁用菜單項(xiàng),使其不能被選擇并變灰

       該函數(shù)返回菜單項(xiàng)之前的狀態(tài):MF_DISABLED、MF_ENABLED或MF_GRAYED

       CMenu* GetSubMenu(int nPos) const;

       獲取彈出菜單的CMenu對(duì)象。參數(shù)nPos指定彈出菜單在菜單中的位置,不能使用ID。返回值是CMenu對(duì)象的指針,該CMenu對(duì)象的m_hMenu成員為由nPos指定的彈出菜單的句柄,如果不存在這樣的CMenu對(duì)象則返回NULL,然后創(chuàng)建一個(gè)臨時(shí)彈出菜單。

       CMenu類(lèi)的成員函數(shù)先講這些,如果大家需要用其他的函數(shù)可以到MSDN中查看,解釋的很清楚。

       菜單消息

       菜單主要能發(fā)送兩種消息:COMMAND消息和UPDATE_COMMAND_UI消息。下面分別講解:

       COMMAND消息:在菜單項(xiàng)被點(diǎn)擊時(shí)發(fā)送該消息。

       UPDATE_COMMAND_UI消息:用來(lái)維護(hù)菜單項(xiàng)的各項(xiàng)狀態(tài),包括激活、禁用、變灰、選中、未選中等。在下拉菜單每次打開(kāi)的時(shí)候,所有菜單項(xiàng)的此消息都會(huì)被發(fā)送出去。如果所屬類(lèi)中為菜單項(xiàng)的該消息添加了處理函數(shù),則執(zhí)行相應(yīng)函數(shù)更新菜單狀態(tài),如果菜單項(xiàng)沒(méi)有此消息處理函數(shù),也沒(méi)有COMMAND消息的處理函數(shù),那么它就會(huì)變灰。

       菜單的應(yīng)用實(shí)例

       雞啄米先講一下本實(shí)例要實(shí)現(xiàn)的功能,此實(shí)例是在上一節(jié)創(chuàng)建的單文檔工程Example34的基礎(chǔ)上完成的,上一節(jié)中為主菜單欄添加了“Tools”菜單項(xiàng),并設(shè)置它的第一個(gè)子菜單項(xiàng)為“Draw”,另外我們還要為主菜單欄添加“Settings”項(xiàng),然后為其添加一個(gè)子菜單項(xiàng)“Draw Enable”,我們通過(guò)“Draw Enable”菜單項(xiàng)的選中狀態(tài)控制菜單項(xiàng)“Draw”的激活狀態(tài),如果“Draw Enable”菜單項(xiàng)選中,則“Draw”菜單項(xiàng)激活,點(diǎn)擊它彈出一個(gè)MessageBox,否則“Draw”菜單項(xiàng)禁用。程序中已經(jīng)在Example34View類(lèi)中自動(dòng)生成了OnRButtonUp(UINT /* nFlags */, CPoint point)函數(shù),并在其中實(shí)現(xiàn)了彈出右鍵菜單的功能,這里雞啄米用CMenu類(lèi)的TrackPopupMenu成員函數(shù)重新做一遍。

       注意:Example34的CMainFrame類(lèi)中定義的菜單并沒(méi)有使用常用的CMenu類(lèi),而是用的CMFCMenuBar類(lèi)(自VS2008起提供),但菜單的消息處理函數(shù)的添加是相同的。

       下面是具體步驟:

       1. 打開(kāi)Example34工程的IDR_MAINFRAME菜單資源,在“Help”菜單項(xiàng)前通過(guò)“Insert New”操作插入一個(gè)菜單項(xiàng),Caption設(shè)為“Settings”,在新菜單項(xiàng)的子菜單中再添加一個(gè)菜單項(xiàng),Caption設(shè)為“Draw Enable”,ID默認(rèn)為ID_SETTINGS_DRAWENABLE。

       2. 因?yàn)榇瞬藛螢镃MainFrame所擁有,所以我們?cè)贑MainFrame類(lèi)中對(duì)菜單進(jìn)行操作。在“MainFrm.h”中為CMainFrame類(lèi)添加成員變量bool m_bDraw,以標(biāo)識(shí)當(dāng)前是否可以點(diǎn)擊Tools->Draw菜單項(xiàng),并在CMainFrame類(lèi)的構(gòu)造函數(shù)中為m_bDraw初始化:m_bDraw = TRUE。

       3. 為菜單項(xiàng)Tools->Draw的COMMAND消息和UPDATE_COMMAND_UI消息分別添加處理函數(shù)CMainFrame::OnToolsDraw()和OnUpdateToolsDraw(CCmdUI *pCmdUI),這里要注意,添加處理函數(shù)時(shí)class list中應(yīng)選擇CMainFrame,修改兩個(gè)函數(shù)的實(shí)現(xiàn)為:

C++代碼
  1. void CMainFrame::OnToolsDraw()   
  2. {   
  3.     // TODO: Add your command handler code here   
  4.     // 彈出提示框   
  5.     MessageBox(_T("Draw"));   
  6. }   
  7.   
  8. void CMainFrame::OnUpdateToolsDraw(CCmdUI *pCmdUI)   
  9. {   
  10.     // TODO: Add your command update UI handler code here   
  11.     // 根據(jù)m_bDraw的值設(shè)置是否激活   
  12.     pCmdUI->Enable(m_bDraw);   
  13. }  

       4. 為菜單項(xiàng)Settings->Draw Enable的COMMAND消息和UPDATE_COMMAND_UI消息分別添加處理函數(shù)CMainFrame::OnSettingsDrawenable()和OnUpdateSettingsDrawenable(CCmdUI *pCmdUI),并將它們的實(shí)現(xiàn)修改為:

C++代碼
  1. void CMainFrame::OnSettingsDrawenable()   
  2. {   
  3.     // TODO: Add your command handler code here   
  4.     // 繪圖使能標(biāo)識(shí)取反   
  5.     m_bDraw = !m_bDraw;   
  6. }   
  7.   
  8.   
  9. void CMainFrame::OnUpdateSettingsDrawenable(CCmdUI *pCmdUI)   
  10. {   
  11.     // TODO: Add your command update UI handler code here   
  12.     // 根據(jù)m_bDraw的值設(shè)置是否選中   
  13.     pCmdUI->SetCheck(m_bDraw);   
  14. }  

       5. 運(yùn)行程序,效果圖如下:

       6. 接下來(lái)我們要重新實(shí)現(xiàn)右鍵菜單。大家以后可以仿照VS2010自動(dòng)生成的代碼實(shí)現(xiàn)右鍵菜單,也可以用雞啄米下面講到的方法。首先將CExample34View::OnRButtonUp(UINT /* nFlags */, CPoint point)函數(shù)內(nèi)的代碼都注釋掉,保證原來(lái)的彈出方法失效。

       7. 自動(dòng)生成代碼是在鼠標(biāo)彈起時(shí)實(shí)現(xiàn)的右鍵菜單,我們這里改為在鼠標(biāo)按下時(shí)就彈出右鍵菜單。在class view類(lèi)視圖中點(diǎn)擊CExample34View,然后在屬性頁(yè)的messages列表中找到WM_RBUTTONDOWN,添加其消息響應(yīng)函數(shù)CExample34View::OnRButtonDown(UINT nFlags,CPoint point),修改其實(shí)現(xiàn)為:

C++代碼
  1. void CExample34View::OnRButtonDown(UINT nFlags, CPoint point)   
  2. {   
  3.     // TODO: Add your message handler code here and/or call default   
  4.     CMenu menu;       // 菜單(包含主菜單欄和子菜單)   
  5.     CMenu *pSubMenu;  // 右鍵菜單   
  6.   
  7.     // 加載菜單資源到menu對(duì)象   
  8.     menu.LoadMenu(IDR_POPUP_EDIT);   
  9.     // 因?yàn)橛益I菜單是彈出式菜單,不包含主菜單欄,所以取子菜單   
  10.     pSubMenu = menu.GetSubMenu(0);   
  11.     // 將坐標(biāo)值由客戶坐標(biāo)轉(zhuǎn)換為屏幕坐標(biāo)   
  12.     ClientToScreen(&point);   
  13.     // 彈出右鍵菜單,菜單左側(cè)與point.x坐標(biāo)值對(duì)齊   
  14.     pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);   
  15.   
  16.     CView::OnRButtonDown(nFlags, point);   
  17. }  

       8. 最終的右鍵菜單效果: 

       本節(jié)內(nèi)容不少,大家可以慢慢消化。菜單的講解就到這里了。雞啄米謝謝大家的關(guān)注和支持。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
如何動(dòng)態(tài)添加菜單/菜單項(xiàng)、子菜單、右鍵菜單
VC API之菜單函數(shù)
AppendMenu
VC++之菜單之右鍵彈出菜單
孫鑫VC視頻教程筆記之第六課“菜單”
EnableMenuItem
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服