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

菜单

开发平台:

Visual C++

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