CoolMenu.h
上传用户:wlkj888
上传日期:2022-08-01
资源大小:806k
文件大小:8k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. /****************************************************************************
  2.  * *  
  3.  * GuiToolKit   *
  4.  *                            (MFC extension) *  
  5.  * Created by Francisco Campos G. www.beyondata.com fcampos@beyondata.com *
  6.  *--------------------------------------------------------------------------*    
  7.  * *
  8.  * This program is free software; so you are free to use it any of your *
  9.  * applications(Freeware, Shareware, Commercial), but leave this header *
  10.  * intact. *
  11.  * *
  12.  * These files are provided "as is" without warranty of any kind. *
  13.  * *
  14.  *        GuiToolKit is forever FREE CODE !!!!! *
  15.  * *
  16.  *--------------------------------------------------------------------------*
  17.  * Created by: Francisco Campos G. *
  18.  * Bug Fixes and improvements :(Add your name) *
  19.  * -Francisco Campos *
  20.  * *
  21.  ****************************************************************************/
  22. ////////////////////////////////////////////////////////////////
  23. // 199 Microsoft Systems Journal. 
  24. // If this code works, it was written by Paul DiLascia.
  25. // If not, I don't know who wrote it.
  26. //
  27. // ==========================================================================  
  28. // HISTORY:   
  29. // ==========================================================================  
  30. // 1.01 13 Aug 1998 - Andrew Bancroft [ABancroft@lgc.com] - Since we've already 
  31. //   added the entire toolbar to the imagelist we need to 
  32. //   increment nNextImage even if we didn't add this button to 
  33. //   m_mapIDtoImage in the LoadToolbar() method.
  34. // 1.01a 13 Aug 1998 - Peter Tewkesbury - Added AddSingleBitmap(...)
  35. //   method for adding a single bitmap to a pulldown
  36. //   menu item.
  37. // 1.02 13 Aug 1998 - Omar L Francisco - Fixed bug with lpds->CtlType
  38. //   and lpds->itemData item checking.
  39. // 1.03 12 Nov 1998 - Fixes debug assert in system menu. - Wang Jun
  40. // 1.04 17 Nov 1998 - Fixes debug assert when you maximize a view - Wang Jun
  41. //   window, then try to use the system menu for the view.
  42. // 1.05 09 Jan 1998 - Seain B. Conover [sc@tarasoft.com] - Fix for virtual 
  43. //   key names.
  44. // 1.06 24 Feb 1999 - Michael Lange [michael.home@topdogg.com] - Fix for memory 
  45. //   leak in CMyItemData structure, added a destructor that 
  46. //   calls text.Empty().
  47. // - Boris Kartamishev [kbv@omegasoftware.com] - Fix for resource
  48. //   ID bug.
  49. // - Jeremy Horgan [jeremyhorgan@hotmail.com] - During 
  50. //   accelerator key processing OnInitMenuPopup() calls 
  51. //   ConvertMenu() which allocates a new CMyItemData for each 
  52. //       menu item. This is memory is normally freed by a call to 
  53. //       OnMenuSelect(), which is not called when processing 
  54. //   accelerator keys. This results in a memory leak. This was
  55. //   fixed by modifying the ~CCoolMenuManager() destructor.
  56. // 1.07 24 Feb 1999 - Koji MATSUNAMI [kmatsu@inse.co.jp] - Fixed problem with 
  57. //   popup menus being drawn correctly as cool menus.
  58. // ==========================================================================
  59. //
  60. /////////////////////////////////////////////////////////////////////////////
  61. #ifndef __COOLMENU_H__
  62. #define __COOLMENU_H__
  63. #include "StdAfx.h"
  64. #include "SubClass.h"
  65. //////////////////
  66. // CCoolMenuManager implements "cool" menus with buttons in them. To use:
  67. //
  68. //  * Instantiate in your CMainFrame.
  69. //  * Call Install to install it
  70. //  * Call LoadToolbars or LoadToolbar to load toolbars
  71. //
  72. //  Don't forget to link with CoolMenu.cpp, Subclass.cpp and DrawTool.cpp!
  73. //
  74. class GUILIBDLLEXPORT CCoolMenuManager : private CSubclassWnd 
  75. {
  76. DECLARE_DYNAMIC(CCoolMenuManager)
  77. public:
  78. CCoolMenuManager();
  79. virtual ~CCoolMenuManager();
  80. // You can set these any time
  81. BOOL m_bShowButtons; // use to control whether buttons are shown
  82. BOOL m_bAutoAccel; // generate auto accelerators
  83. BOOL m_bUseDrawState; // use ::DrawState for disabled buttons
  84. BOOL m_bDrawDisabledButtonsInColor; // draw disabled buttons in color
  85. // (only if m_bUseDrawState = FALSE)
  86. // public functions to use
  87. void Install(CFrameWnd* pFrame); // connect to main frame
  88. BOOL LoadToolbars(const UINT* arIDs, int n); // load multiple toolbars
  89. BOOL LoadToolbar(UINT nID); // load one toolbar
  90. BOOL AddSingleBitmap(UINT nBitmapID, UINT n, UINT *nID);
  91. void StyleDispl(DWORD dwDsp=GUISTYLE_XP)
  92. {m_StyleDisplay=dwDsp;}
  93. // should never need to call:
  94. virtual void Destroy(); // destroys everything--to re-load new toolbars?
  95. virtual void Refresh(); // called when system colors, etc change
  96. static  HBITMAP GetMFCDotBitmap(); // get..
  97. static  void    FixMFCDotBitmap(); // and fix MFC's dot bitmap
  98. static BOOL bTRACE; // Set TRUE to see extra diagnostics in DEBUG code
  99. protected:
  100. CFrameWnd* m_pFrame; // frame window I belong to
  101. CUIntArray m_arToolbarID; // array of toolbar IDs loaded
  102. CImageList m_ilButtons; // image list for all buttons
  103. CMapWordToPtr m_mapIDtoImage;// maps command ID -> image list index
  104. CMapWordToPtr m_mapIDtoAccel;// maps command ID -> ACCEL*
  105. HACCEL m_hAccel; // current accelerators, if any
  106. ACCEL* m_pAccel; // ..and table in memory
  107. CPtrList m_menuList; // list of HMENU's initialized
  108. CSize m_szBitmap; // size of button bitmap
  109. CSize m_szButton; // size of button (including shadow)
  110. CFont m_fontMenu; // menu font
  111. DWORD m_StyleDisplay;
  112. // helpers
  113. void DestroyAccel();
  114. void DrawMenuText(CDC& dc, CRect rc, CString text, COLORREF color);
  115. BOOL Draw3DCheckmark(CDC& dc, const CRect& rc, BOOL bSelected,
  116. HBITMAP hbmCheck = NULL);
  117. void ConvertMenu(CMenu* pMenu, UINT nIndex, BOOL bSysMenu, BOOL bShowButtons);
  118. void LoadAccel(HACCEL hAccel);
  119. CString GetVirtualKeyName(const CString strVirtKey) const;
  120. BOOL AppendAccelName(CString& sItemName, UINT nID);
  121. CFont* GetMenuFont();
  122. void PLSelectRect(CDC& dc, const CRect& rc);
  123. void DrawSeparator(CRect& rc, CDC& dc);
  124. void PLNormalRect(CDC& dc, const CRect& rc);
  125. // Get button index for given command ID, or -1 if not found
  126. int  GetButtonIndex(WORD nID) 
  127. {
  128. void* val;
  129. return m_mapIDtoImage.Lookup(nID, val) ?(int)val : -1;
  130. }
  131. // Get ACCEL structure associated with a given command ID
  132. ACCEL* GetAccel(WORD nID) 
  133. {
  134. void* val;
  135. return m_mapIDtoAccel.Lookup(nID, val) ?(ACCEL*)val : NULL;
  136. }
  137. // window proc to hook frame using CSubclassWnd implementation
  138. virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
  139. // CSubclassWnd message handlers 
  140. virtual void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu);
  141. virtual BOOL OnMeasureItem(LPMEASUREITEMSTRUCT lpms);
  142. virtual BOOL OnDrawItem(LPDRAWITEMSTRUCT lpds);
  143. virtual LONG OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu);
  144. virtual void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
  145. };
  146. //////////////////
  147. // Friendly version of MENUITEMINFO initializes itself
  148. //
  149. //
  150. // There is a BUG in GeMenuItemInfo => doesn't want to work with WINVER = 5000, => 48 bytes
  151. // we are redifining it here:
  152. // Garbaged Menu Strings and how to Fix it...   igor1960  19:53 31 Jul '02  
  153.  
  154. #ifndef __MENUITEMINFO_LOCAL_DEFINED
  155. #define __MENUITEMINFO_LOCAL_DEFINED
  156. typedef struct tagMENUITEMINFO_LOCAL
  157. {
  158. UINT cbSize;
  159. UINT fMask;
  160. UINT fType; // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
  161. UINT fState; // used if MIIM_STATE
  162. UINT wID; // used if MIIM_ID
  163. HMENU hSubMenu; // used if MIIM_SUBMENU
  164. HBITMAP hbmpChecked; // used if MIIM_CHECKMARKS
  165. HBITMAP hbmpUnchecked; // used if MIIM_CHECKMARKS
  166. DWORD dwItemData; // used if MIIM_DATA
  167. LPTSTR dwTypeData; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
  168. UINT cch; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
  169. } MENUITEMINFO_LOCAL;
  170. #endif
  171. struct CMenuItemInfo : public MENUITEMINFO_LOCAL 
  172. {
  173. CMenuItemInfo()
  174. {
  175. memset(this, 0, sizeof(MENUITEMINFO_LOCAL));
  176. cbSize = sizeof(MENUITEMINFO_LOCAL);
  177. }
  178. };
  179. #endif // __COOLMENU_H__