CmdUI.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:6k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. // CmdUIDialog.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include <afxpriv.h>
  25. #include "CmdUI.h"
  26. // CCmdUIDialog dialog
  27. IMPLEMENT_DYNAMIC(CCmdUIDialog, CDialog)
  28. CCmdUIDialog::CCmdUIDialog()
  29. {
  30. }
  31. CCmdUIDialog::CCmdUIDialog(UINT nIDTemplate, CWnd* pParent /*=NULL*/)
  32. : CDialog(nIDTemplate, pParent)
  33. {
  34. }
  35. CCmdUIDialog::CCmdUIDialog(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
  36. : CDialog(lpszTemplateName, pParentWnd)
  37. {
  38. }
  39. CCmdUIDialog::~CCmdUIDialog()
  40. {
  41. }
  42. LRESULT CCmdUIDialog::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  43. {
  44. LRESULT ret = __super::DefWindowProc(message, wParam, lParam);
  45. if(message == WM_INITDIALOG)
  46. {
  47. SendMessage(WM_KICKIDLE);
  48. }
  49. return(ret);
  50. }
  51. BEGIN_MESSAGE_MAP(CCmdUIDialog, CDialog)
  52. ON_MESSAGE_VOID(WM_KICKIDLE, OnKickIdle)
  53. ON_WM_INITMENUPOPUP()
  54. END_MESSAGE_MAP()
  55. // CCmdUIDialog message handlers
  56. void CCmdUIDialog::OnKickIdle()
  57. {
  58. UpdateDialogControls(this, false);
  59. // TODO: maybe we should send this call to modeless child cdialogs too
  60. }
  61. // Q242577
  62. void CCmdUIDialog::OnInitMenuPopup(CMenu *pPopupMenu, UINT nIndex,BOOL bSysMenu)
  63. {
  64.     ASSERT(pPopupMenu != NULL);
  65.     // Check the enabled state of various menu items.
  66.     CCmdUI state;
  67.     state.m_pMenu = pPopupMenu;
  68.     ASSERT(state.m_pOther == NULL);
  69.     ASSERT(state.m_pParentMenu == NULL);
  70.     // Determine if menu is popup in top-level menu and set m_pOther to
  71.     // it if so (m_pParentMenu == NULL indicates that it is secondary popup).
  72.     HMENU hParentMenu;
  73.     if (AfxGetThreadState()->m_hTrackingMenu == pPopupMenu->m_hMenu)
  74.         state.m_pParentMenu = pPopupMenu;    // Parent == child for tracking popup.
  75.     else if ((hParentMenu = ::GetMenu(m_hWnd)) != NULL)
  76.     {
  77.         CWnd* pParent = this;
  78.            // Child windows don't have menus--need to go to the top!
  79.         if (pParent != NULL &&
  80.            (hParentMenu = ::GetMenu(pParent->m_hWnd)) != NULL)
  81.         {
  82.            int nIndexMax = ::GetMenuItemCount(hParentMenu);
  83.            for (int nIndex = 0; nIndex < nIndexMax; nIndex++)
  84.            {
  85.             if (::GetSubMenu(hParentMenu, nIndex) == pPopupMenu->m_hMenu)
  86.             {
  87.                 // When popup is found, m_pParentMenu is containing menu.
  88.                 state.m_pParentMenu = CMenu::FromHandle(hParentMenu);
  89.                 break;
  90.             }
  91.            }
  92.         }
  93.     }
  94.     state.m_nIndexMax = pPopupMenu->GetMenuItemCount();
  95.     for (state.m_nIndex = 0; state.m_nIndex < state.m_nIndexMax;
  96.       state.m_nIndex++)
  97.     {
  98.         state.m_nID = pPopupMenu->GetMenuItemID(state.m_nIndex);
  99.         if (state.m_nID == 0)
  100.            continue; // Menu separator or invalid cmd - ignore it.
  101.         ASSERT(state.m_pOther == NULL);
  102.         ASSERT(state.m_pMenu != NULL);
  103.         if (state.m_nID == (UINT)-1)
  104.         {
  105.            // Possibly a popup menu, route to first item of that popup.
  106.            state.m_pSubMenu = pPopupMenu->GetSubMenu(state.m_nIndex);
  107.            if (state.m_pSubMenu == NULL ||
  108.             (state.m_nID = state.m_pSubMenu->GetMenuItemID(0)) == 0 ||
  109.             state.m_nID == (UINT)-1)
  110.            {
  111.             continue;       // First item of popup can't be routed to.
  112.            }
  113.            state.DoUpdate(this, TRUE);   // Popups are never auto disabled.
  114.         }
  115.         else
  116.         {
  117.            // Normal menu item.
  118.            // Auto enable/disable if frame window has m_bAutoMenuEnable
  119.            // set and command is _not_ a system command.
  120.            state.m_pSubMenu = NULL;
  121.            state.DoUpdate(this, FALSE);
  122.         }
  123.         // Adjust for menu deletions and additions.
  124.         UINT nCount = pPopupMenu->GetMenuItemCount();
  125.         if (nCount < state.m_nIndexMax)
  126.         {
  127.            state.m_nIndex -= (state.m_nIndexMax - nCount);
  128.            while (state.m_nIndex < nCount &&
  129.             pPopupMenu->GetMenuItemID(state.m_nIndex) == state.m_nID)
  130.            {
  131.             state.m_nIndex++;
  132.            }
  133.         }
  134.         state.m_nIndexMax = nCount;
  135.     }
  136. }
  137. // CCmdUIPropertyPage
  138. IMPLEMENT_DYNAMIC(CCmdUIPropertyPage, CPropertyPage)
  139. CCmdUIPropertyPage::CCmdUIPropertyPage(UINT nIDTemplate, UINT nIDCaption)
  140. : CPropertyPage(nIDTemplate, nIDCaption)
  141. {
  142. }
  143. CCmdUIPropertyPage::~CCmdUIPropertyPage()
  144. {
  145. }
  146. LRESULT CCmdUIPropertyPage::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  147. {
  148. if(message == WM_COMMAND)
  149. {
  150. switch(HIWORD(wParam))
  151. {
  152. case BN_CLICKED: case CBN_SELCHANGE: case EN_CHANGE:
  153. SetModified();
  154. default:;
  155. }
  156. }
  157. LRESULT ret = __super::DefWindowProc(message, wParam, lParam);
  158. if(message == WM_INITDIALOG)
  159. {
  160. SendMessage(WM_KICKIDLE);
  161. }
  162. return(ret);
  163. }
  164. BEGIN_MESSAGE_MAP(CCmdUIPropertyPage, CPropertyPage)
  165. ON_MESSAGE_VOID(WM_KICKIDLE, OnKickIdle)
  166. END_MESSAGE_MAP()
  167. // CCmdUIPropertyPage message handlers
  168. void CCmdUIPropertyPage::OnKickIdle()
  169. {
  170. UpdateDialogControls(this, false);
  171. // TODO: maybe we should send this call to modeless child cPropertyPages too
  172. }