VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 219|回复: 1

VC++基础班-[17]对话框的菜单操作

[复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-1-28 21:13:05 | 显示全部楼层 |阅读模式
------------------------------------------ Begin ----------------------------------------
①、两种方式的菜单:下拉式、弹出式;
②、MFC中菜单的关联类:CMenu
③、插入并编辑菜单资源;
④、让对话框显示下拉式菜单;
⑤、为菜单项添加消息响应函数:不要加错类了,否则可能不会正常的响应:
COMMAND 是事件的响应函数,也就是你点击了菜单项后,菜单如何处理;
UPDATE_COMMAND_UI 是设置菜单显示状态的响应函数 ;

⑥、为对话框添加右键弹出式菜单:
  1. CMenu mMenu, *pMenu = NULL;
  2. mMenu.LoadMenu(IDR_MENU1);
  3. pMenu = mMenu.GetSubMenu(0);
  4. pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
复制代码


※ point 的坐标点信息一定要基于屏幕坐标系的,否则弹出的位置会不对;
★★★ 这里面我们用的是 WM_CONTEXTMENU 消息来响应右键消息的,给大家留一个作业
响应对话框类的 WM_RBUTTONUP 消息,并在其中弹出菜单试试,看看会遇到什么问题?

⑦、菜单项的启用与禁用:EnableMenuItem
※ 一定要在菜单弹出之前进行 EnableMenuItem 操作

⑧、菜单项前面的复选框 CheckBox:CheckMenuItem
⑨、UPDATE_COMMAND_UI 消息:一般情况下用于修改菜单的状态,在菜单显示之前被调用
可用的操作:
  1. void Enable(BOOL bOn = TRUE);
  2. void SetCheck(int nCheck = 1);   // 0, 1 or 2 (indeterminate)
  3. void SetRadio(BOOL bOn = TRUE);
  4. void SetText(LPCTSTR lpszText);
复制代码


//////////// 对话框中 UPDATE_COMMAND_UI 消息 不能正确响应的解决办法 ///////////////
类的头文件中添加函数声明:afx_msg void OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu);
类的CPP文件中添加消息映射:ON_WM_INITMENUPOPUP()
类的CPP文件中添加函数实现:
  1. void CMFCTestDlg::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
  2. {
  3.         ASSERT(pPopupMenu != NULL);
  4.         // Check the enabled state of various menu items.

  5.         CCmdUI state;
  6.         state.m_pMenu = pPopupMenu;
  7.         ASSERT(state.m_pOther == NULL);
  8.         ASSERT(state.m_pParentMenu == NULL);

  9.         // Determine if menu is popup in top-level menu and set m_pOther to
  10.         // it if so (m_pParentMenu == NULL indicates that it is secondary popup).
  11.         HMENU hParentMenu;
  12.         if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
  13.                 state.m_pParentMenu = pPopupMenu; // Parent == child for tracking popup.
  14.         else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
  15.         {
  16.                 CWnd* pParent = this;
  17.                 // Child windows don't have menus--need to go to the top!
  18.                 if (pParent != NULL &&
  19.                         (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
  20.                         {
  21.                                 int nIndexMax = ::GetMenuItemCount(hParentMenu);
  22.                                 for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
  23.                                         {
  24.                                                 if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
  25.                                                         {
  26.                                                                 // When popup is found, m_pParentMenu is containing menu.
  27.                                                                 state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
  28.                                                                 break;
  29.                                                 }
  30.                                 }
  31.                 }
  32.         }

  33.         state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
  34.         for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
  35.                 state.m_nIndex++)
  36.                 {
  37.                         state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
  38.                         if (state.m_nID == 0)
  39.                                 continue; // Menu separator or invalid cmd - ignore it.

  40.                         ASSERT(state.m_pOther == NULL);
  41.                         ASSERT(state.m_pMenu != NULL);
  42.                         if (state.m_nID == (UINT)-1)
  43.                                 {
  44.                                         // Possibly a popup menu, route to first item of that popup.
  45.                                         state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
  46.                                         if (state.m_pSubMenu == NULL ||
  47.                                                 (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
  48.                                                 state.m_nID == (UINT)-1)
  49.                                                 {
  50.                                                         continue;    // First item of popup can't be routed to.
  51.                                         }
  52.                                         state.DoUpdate(this, TRUE); // Popups are never auto disabled.
  53.                         }
  54.                         else
  55.                                 {
  56.                                         // Normal menu item.
  57.                                         // Auto enable/disable if frame window has m_bAutoMenuEnable
  58.                                         // set and command is _not_ a system command.
  59.                                         state.m_pSubMenu = NULL;
  60.                                         state.DoUpdate(this, FALSE);
  61.                         }

  62.                         // Adjust for menu deletions and additions.
  63.                         UINT nCount = pPopupMenu->GetMenuItemCount();
  64.                         if (nCount < state.m_nIndexMax)
  65.                                 {
  66.                                         state.m_nIndex -= (state.m_nIndexMax - nCount);
  67.                                         while (state.m_nIndex < nCount &&
  68.                                                 pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
  69.                                                 {
  70.                                                         state.m_nIndex++;
  71.                                         }
  72.                         }
  73.                         state.m_nIndexMax = nCount;
  74.         }
  75. }
复制代码

///////////////////////////////////////////////////////////////////////

★★★ 本节课的第二个小作业:按钮点击后,实现菜单项的动态启用与禁用的切换操作,使用
EnableMenuItem 函数 或者 UPDATE_COMMAND_UI 消息 都可以!
------------------------------------- End -------------------------------------------

相关课程演示细节还请观看视频教程!
本套教程由VC驿站原创,提供视频教程+售后答疑服务!
教程介绍及详情请见:http://www.cctry.com/thread-17282-1-1.html
VC驿站Vip会员详情请见:http://www.cctry.com/static/vip/index.html





上一篇:VC++基础班-[16]让对话框支持拖拽功能
下一篇:VC++基础班-[18]对话框的工具栏操作

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-8-20 16:51

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表