CoolMenu.h
上传用户:shilei2004
上传日期:2020-07-18
资源大小:83k
文件大小:6k
源码类别:

RichEdit

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////
  2. // 199 Microsoft Systems Journal. 
  3. // If this code works, it was written by Paul DiLascia.
  4. // If not, I don't know who wrote it.
  5. //
  6. // ==========================================================================  
  7. // HISTORY:   
  8. // ==========================================================================  
  9. // 1.01 13 Aug 1998 - Andrew Bancroft [ABancroft@lgc.com] - Since we've already 
  10. //   added the entire toolbar to the imagelist we need to 
  11. //   increment nNextImage even if we didn't add this button to 
  12. //   m_mapIDtoImage in the LoadToolbar() method.
  13. // 1.01a 13 Aug 1998 - Peter Tewkesbury - Added AddSingleBitmap(...)
  14. //   method for adding a single bitmap to a pulldown
  15. //   menu item.
  16. // 1.02 13 Aug 1998 - Omar L Francisco - Fixed bug with lpds->CtlType
  17. //   and lpds->itemData item checking.
  18. // 1.03 12 Nov 1998 - Fixes debug assert in system menu. - Wang Jun
  19. // 1.04 17 Nov 1998 - Fixes debug assert when you maximize a view - Wang Jun
  20. //   window, then try to use the system menu for the view.
  21. // 1.05 09 Jan 1998 - Seain B. Conover [sc@tarasoft.com] - Fix for virtual 
  22. //   key names.
  23. // 1.06 24 Feb 1999 - Michael Lange [michael.home@topdogg.com] - Fix for memory 
  24. //   leak in CMyItemData structure, added a destructor that 
  25. //   calls text.Empty().
  26. // - Boris Kartamishev [kbv@omegasoftware.com] - Fix for resource
  27. //   ID bug.
  28. // - Jeremy Horgan [jeremyhorgan@hotmail.com] - During 
  29. //   accelerator key processing OnInitMenuPopup() calls 
  30. //   ConvertMenu() which allocates a new CMyItemData for each 
  31. //       menu item. This is memory is normally freed by a call to 
  32. //       OnMenuSelect(), which is not called when processing 
  33. //   accelerator keys. This results in a memory leak. This was
  34. //   fixed by modifying the ~CCoolMenuManager() destructor.
  35. // 1.07 24 Feb 1999 - Koji MATSUNAMI [kmatsu@inse.co.jp] - Fixed problem with 
  36. //   popup menus being drawn correctly as cool menus.
  37. // ==========================================================================
  38. //
  39. /////////////////////////////////////////////////////////////////////////////
  40. #ifndef __COOLMENU_H__
  41. #define __COOLMENU_H__
  42. #include "SubClass.h"
  43. //////////////////
  44. // CCoolMenuManager implements "cool" menus with buttons in them. To use:
  45. //
  46. //  * Instantiate in your CMainFrame.
  47. //  * Call Install to install it
  48. //  * Call LoadToolbars or LoadToolbar to load toolbars
  49. //
  50. //  Don't forget to link with CoolMenu.cpp, Subclass.cpp and DrawTool.cpp!
  51. //
  52. class /*AFX_EXT_CLASS*/ CCoolMenuManager : private CSubclassWnd {
  53. public:
  54. DECLARE_DYNAMIC(CCoolMenuManager)
  55. CCoolMenuManager();
  56. ~CCoolMenuManager();
  57. // You can set these any time
  58. BOOL m_bShowButtons; // use to control whether buttons are shown
  59. BOOL m_bAutoAccel; // generate auto accelerators
  60. BOOL m_bUseDrawState; // use ::DrawState for disabled buttons
  61. BOOL m_bDrawDisabledButtonsInColor; // draw disabled buttons in color
  62. // (only if m_bUseDrawState = FALSE)
  63. // public functions to use
  64. void Install(CFrameWnd* pFrame); // connect to main frame
  65. BOOL LoadToolbars(const UINT* arIDs, int n); // load multiple toolbars
  66. BOOL LoadToolbar(UINT nID); // load one toolbar
  67. BOOL AddSingleBitmap(UINT nBitmapID, UINT n, UINT *nID);
  68. // should never need to call:
  69. virtual void Destroy(); // destroys everything--to re-load new toolbars?
  70. virtual void Refresh(); // called when system colors, etc change
  71. static  HBITMAP GetMFCDotBitmap(); // get..
  72. static  void    FixMFCDotBitmap(); // and fix MFC's dot bitmap
  73. static BOOL bTRACE; // Set TRUE to see extra diagnostics in DEBUG code
  74. protected:
  75. CFrameWnd* m_pFrame; // frame window I belong to
  76. CUIntArray m_arToolbarID; // array of toolbar IDs loaded
  77. CImageList m_ilButtons; // image list for all buttons
  78. CMapWordToPtr m_mapIDtoImage;// maps command ID -> image list index
  79. CMapWordToPtr m_mapIDtoAccel;// maps command ID -> ACCEL*
  80. HACCEL m_hAccel; // current accelerators, if any
  81. ACCEL* m_pAccel; // ..and table in memory
  82. CPtrList m_menuList; // list of HMENU's initialized
  83. CSize m_szBitmap; // size of button bitmap
  84. CSize m_szButton; // size of button (including shadow)
  85. CFont m_fontMenu; // menu font
  86. // helpers
  87. void DestroyAccel();
  88. void DrawMenuText(CDC& dc, CRect rc, CString text, COLORREF color);
  89. BOOL Draw3DCheckmark(CDC& dc, const CRect& rc, BOOL bSelected,
  90. HBITMAP hbmCheck=NULL);
  91. void ConvertMenu(CMenu* pMenu,UINT nIndex,BOOL bSysMenu,BOOL bShowButtons);
  92. void LoadAccel(HACCEL hAccel);
  93. CString GetVirtualKeyName( const CString strVirtKey ) const;
  94. BOOL AppendAccelName(CString& sItemName, UINT nID);
  95. CFont* GetMenuFont();
  96. // Get button index for given command ID, or -1 if not found
  97. int  GetButtonIndex(WORD nID) {
  98. void* val;
  99. return m_mapIDtoImage.Lookup(nID, val) ? (int)val : -1;
  100. }
  101. // Get ACCEL structure associated with a given command ID
  102. ACCEL* GetAccel(WORD nID) {
  103. void* val;
  104. return m_mapIDtoAccel.Lookup(nID, val) ? (ACCEL*)val : NULL;
  105. }
  106. // window proc to hook frame using CSubclassWnd implementation
  107. virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
  108. // CSubclassWnd message handlers 
  109. virtual void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu);
  110. virtual BOOL OnMeasureItem(LPMEASUREITEMSTRUCT lpms);
  111. virtual BOOL OnDrawItem(LPDRAWITEMSTRUCT lpds);
  112. virtual LONG OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu);
  113. virtual void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
  114. };
  115. //////////////////
  116. // Friendly version of MENUITEMINFO initializes itself
  117. //
  118. struct CMenuItemInfo : public MENUITEMINFO {
  119. CMenuItemInfo()
  120. { memset(this, 0, sizeof(MENUITEMINFO));
  121.   cbSize = sizeof(MENUITEMINFO);
  122. }
  123. };
  124. #endif // __COOLMENU_H__