NMDIMenuFrameWnd.cpp
上传用户:whjcdz88
上传日期:2007-01-02
资源大小:350k
文件大小:4k
源码类别:

工具条

开发平台:

Visual C++

  1. // MDIMenuFrameWnd.cpp : implementation file
  2. //
  3. /*
  4. Copyright (C) 1998 Tony Hoyle (tmh@netfusion.co.uk)
  5.  This program is free software; you can redistribute it and/or modify it under the terms
  6. of the GNU General Public License as published by the Free Software Foundation; either
  7. version 2 of the License, or (at your option) any later version.
  8. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
  9. without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. See the GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License along with this program;
  12. if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  13. */
  14. #include "stdafx.h"
  15. #include "NMDIMenuFrameWnd.h"
  16. #include "NGenericToolBar.h"
  17. #include "NGenericDockBar.h"
  18. #include "NMiniDockFrameWnd.h"
  19. #ifdef _DEBUG
  20. #define new DEBUG_NEW
  21. #undef THIS_FILE
  22. static char THIS_FILE[] = __FILE__;
  23. #endif
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CNMDIMenuFrameWnd
  26. CNMDIMenuFrameWnd::CNMDIMenuFrameWnd()
  27. {
  28. }
  29. CNMDIMenuFrameWnd::~CNMDIMenuFrameWnd()
  30. {
  31. }
  32. IMPLEMENT_DYNAMIC(CNMDIMenuFrameWnd, CMDIFrameWnd)
  33. BEGIN_MESSAGE_MAP(CNMDIMenuFrameWnd, CMDIFrameWnd)
  34. //{{AFX_MSG_MAP(CNMDIMenuFrameWnd)
  35. ON_WM_CREATE()
  36. ON_WM_MENUCHAR()
  37. ON_WM_ACTIVATE()
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CNMDIMenuFrameWnd message handlers
  42. int CNMDIMenuFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  43. {
  44. if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  45. return -1;
  46. m_hDefaultMenu=*GetMenu();
  47. SetMenu(NULL);
  48. if(!m_wndMenu.Create(this) ||
  49.    !m_wndMenu.SetMenu(m_hDefaultMenu))
  50. {
  51. TRACE0("CNMDIMenuFrameWnd: Failed to create menun");
  52. return -1;
  53. }
  54. m_wndMenu.EnableDocking(CBRS_ALIGN_ANY);
  55. EnableDocking(CBRS_ALIGN_ANY);
  56. DockControlBar(&m_wndMenu);
  57. return 0;
  58. }
  59. BOOL CNMDIMenuFrameWnd::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
  60. {
  61. if(!CMDIFrameWnd::OnCreateClient(lpcs, pContext)) return FALSE;
  62. m_wndMenu.SubclassMDIClient(m_hWndMDIClient);
  63. return TRUE;
  64. }
  65. LRESULT CNMDIMenuFrameWnd::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) 
  66. {
  67. for(int n=0; n<CNGenericToolBar::m_ToolbarList.GetSize(); n++)
  68. {
  69. if(CNGenericToolBar::m_ToolbarList[n]->TranslateMenuChar(nChar))
  70. return MAKELPARAM(MNC_EXECUTE,-1); // Handled by toolbar
  71. }
  72. return CMDIFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
  73. }
  74. void CNMDIMenuFrameWnd::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) 
  75. {
  76. if(nState==WA_INACTIVE && pWndOther && pWndOther->IsKindOf(RUNTIME_CLASS(CNGenericPopup)))
  77. return; // Dump the message
  78. CMDIFrameWnd::OnActivate(nState, pWndOther, bMinimized);
  79. }
  80. // dock bars will be created in the order specified by dwDockBarMap
  81. // this also controls which gets priority during layout
  82. // this order can be changed by calling EnableDocking repetitively
  83. // with the exact order of priority
  84. void CNMDIMenuFrameWnd::EnableDocking(DWORD dwDockStyle)
  85. {
  86. // must be CBRS_ALIGN_XXX or CBRS_FLOAT_MULTI only
  87. ASSERT((dwDockStyle & ~(CBRS_ALIGN_ANY|CBRS_FLOAT_MULTI)) == 0);
  88. m_pFloatingFrameClass = RUNTIME_CLASS(CNMiniDockFrameWnd);
  89. for (int i = 0; i < 4; i++)
  90. {
  91. if (dwDockBarMap[i][1] & dwDockStyle & CBRS_ALIGN_ANY)
  92. {
  93. CDockBar* pDock = (CDockBar*)GetControlBar(dwDockBarMap[i][0]);
  94. if (pDock == NULL)
  95. {
  96. pDock = new CNGenericDockBar;
  97. if (!pDock->Create(this,
  98. WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_CHILD|WS_VISIBLE |
  99. dwDockBarMap[i][1], dwDockBarMap[i][0]))
  100. {
  101. AfxThrowResourceException();
  102. }
  103. }
  104. }
  105. }
  106. BOOL CNMDIMenuFrameWnd::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
  107. CWnd* pParentWnd, CCreateContext* pContext)
  108. {
  109. if (!CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle,
  110.   pParentWnd, pContext))
  111. return FALSE;
  112. // save menu to use when no active MDI child window is present
  113. ASSERT(m_hWnd != NULL);
  114. m_hMenuDefault = ::GetMenu(m_hWnd);
  115. // This fixes a *nasty* MFC bug
  116. // Someone at MS forgot that this would compile differently in release...
  117. #ifdef _DEBUG
  118. if (m_hMenuDefault == NULL)
  119. TRACE0("Warning: CMDIFrameWnd without a default menu.n");
  120. #endif
  121. return TRUE;
  122. }