SpawnMDIFrameWnd.cpp
上传用户:pasef_zww
上传日期:2007-01-02
资源大小:109k
文件大小:5k
源码类别:

菜单

开发平台:

Visual C++

  1. // SpawnMDIFrameWnd.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ToolbarMenuDemoMDI.h"
  5. #include "SpawnMDIFrameWnd.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. // 3D HIGHLIGHT CODE
  12. UINT GfxSetSafeTimer(CWnd * pWnd, const UINT uiElapse)
  13. {
  14. ASSERT(pWnd && pWnd->GetSafeHwnd());
  15. UINT iTimer = 1;
  16. while (iTimer < 10000)
  17. {
  18. UINT res = pWnd->SetTimer(1, uiElapse, NULL);
  19. if (res) return res;
  20. iTimer ++;
  21. }
  22. return 0;
  23. }
  24. // 3D HIGHLIGHT CODE END
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CSpawnMDIFrameWnd
  27. IMPLEMENT_DYNCREATE(CSpawnMDIFrameWnd, CMDIFrameWnd)
  28. CSpawnMDIFrameWnd::CSpawnMDIFrameWnd()
  29. {
  30. // 3D HIGHLIGHT CODE
  31. oldMenuBarRc.SetRect(0,0,0,0);
  32. bMenuLooping = false;
  33. uiTimerId = 0;
  34. // 3D HIGHLIGHT CODE END
  35. }
  36. CSpawnMDIFrameWnd::~CSpawnMDIFrameWnd()
  37. {
  38. }
  39. BEGIN_MESSAGE_MAP(CSpawnMDIFrameWnd, CMDIFrameWnd)
  40. //{{AFX_MSG_MAP(CSpawnMDIFrameWnd)
  41. ON_WM_DRAWITEM()
  42. ON_WM_MEASUREITEM()
  43. ON_WM_INITMENU()
  44. ON_WM_INITMENUPOPUP()
  45. ON_WM_MENUCHAR()
  46. ON_WM_NCHITTEST()
  47. ON_WM_TIMER()
  48. ON_WM_CREATE()
  49. ON_WM_DESTROY()
  50. //}}AFX_MSG_MAP
  51. ON_WM_ENTERMENULOOP()
  52. ON_WM_EXITMENULOOP()
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CSpawnMDIFrameWnd message handlers
  56. void CSpawnMDIFrameWnd::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) 
  57. {
  58. if (!cSpawn.DrawItem(lpDrawItemStruct))
  59. CMDIFrameWnd::OnDrawItem(nIDCtl, lpDrawItemStruct);
  60. }
  61. void CSpawnMDIFrameWnd::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
  62. {
  63. if (!cSpawn.MeasureItem(lpMeasureItemStruct))
  64. CMDIFrameWnd::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
  65. }
  66. void CSpawnMDIFrameWnd::OnInitMenu(CMenu* pMenu) 
  67. {
  68. cSpawn.RemapMenu(pMenu);
  69. CMDIFrameWnd::OnInitMenu(pMenu);
  70. }
  71. void CSpawnMDIFrameWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
  72. {
  73. cSpawn.RemapMenu(pPopupMenu);
  74. CMDIFrameWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
  75. }
  76. LRESULT CSpawnMDIFrameWnd::OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu) 
  77. {
  78. LRESULT lRes = CMDIFrameWnd::OnMenuChar(nChar, nFlags, pMenu);
  79. if (nFlags != MF_SYSMENU)
  80. {
  81. if (HIWORD(lRes) != 2) cSpawn.FindKeyboardShortcut(nChar, nFlags, pMenu, lRes);
  82. }
  83. return lRes;
  84. }
  85. // 3D HIGHLIGHT CODE
  86. UINT CSpawnMDIFrameWnd::OnNcHitTest(CPoint point) 
  87. {
  88. UINT res = CMDIFrameWnd::OnNcHitTest(point);
  89. if (!bMenuLooping && res == HTMENU)
  90. {
  91. CMenu * pMenu = GetMenu();
  92. ASSERT(pMenu);
  93. UINT mifp = MenuItemFromPoint(GetSafeHwnd(), pMenu->GetSafeHmenu(), point);
  94. if (mifp != (UINT) -1)
  95. {
  96. CRect rc, wrc;
  97. if (GetMenuItemRect(GetSafeHwnd(), pMenu->GetSafeHmenu(), mifp, &rc))
  98. {
  99. if (cSpawn.IsSpawnMenu(pMenu, mifp, true))
  100. {
  101. GetWindowRect(wrc);
  102. rc.top -= wrc.top;
  103. rc.bottom -= wrc.top;
  104. rc.left -= wrc.left;
  105. rc.right -= wrc.left;
  106. if (oldMenuBarRc != rc || oldMenuBarRc.IsRectEmpty())
  107. {
  108. CWindowDC dc(this);
  109. if (!(oldMenuBarRc.IsRectEmpty()))
  110. {
  111. dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
  112. }
  113. dc.Draw3dRect(rc,cSpawn.cr3dHilight, cSpawn.cr3dShadow);
  114. oldMenuBarRc = rc;
  115. }
  116. }
  117. else
  118. {
  119. if (!(oldMenuBarRc.IsRectEmpty()))
  120. {
  121. CWindowDC dc(this);
  122. dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
  123. oldMenuBarRc.SetRect(0,0,0,0);
  124. }
  125. }
  126. }
  127. }
  128. }
  129. else
  130. {
  131. if (!(oldMenuBarRc.IsRectEmpty()))
  132. {
  133. CWindowDC dc(this);
  134. dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
  135. oldMenuBarRc.SetRect(0,0,0,0);
  136. }
  137. }
  138. return res;
  139. }
  140. void CSpawnMDIFrameWnd::OnTimer(UINT nIDEvent) 
  141. {
  142. if (uiTimerId == nIDEvent && !bMenuLooping)
  143. {
  144. CPoint pt;
  145. GetCursorPos(&pt);
  146. LRESULT res = SendMessage(WM_NCHITTEST, 0, MAKELONG(pt.x, pt.y));
  147. }
  148. CMDIFrameWnd::OnTimer(nIDEvent);
  149. }
  150. void CSpawnMDIFrameWnd::OnEnterMenuLoop(BOOL bIsTrackPopupMenu)
  151. {
  152. if (!(oldMenuBarRc.IsRectEmpty()))
  153. {
  154. CWindowDC dc(this);
  155. dc.Draw3dRect(oldMenuBarRc,cSpawn.crMenu, cSpawn.crMenu);
  156. oldMenuBarRc.SetRect(0,0,0,0);
  157. }
  158. bMenuLooping = true;
  159. }
  160. void CSpawnMDIFrameWnd::OnExitMenuLoop(BOOL bIsTrackPopupMenu)
  161. {
  162. bMenuLooping = false;
  163. }
  164. int CSpawnMDIFrameWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  165. {
  166. if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
  167. return -1;
  168. uiTimerId = GfxSetSafeTimer(this, 100);
  169. return 0;
  170. }
  171. void CSpawnMDIFrameWnd::OnDestroy() 
  172. {
  173. if (uiTimerId) KillTimer(uiTimerId);
  174. CMDIFrameWnd::OnDestroy();
  175. }
  176. // 3D HIGHLIGHT CODE END