CoolMenu.h
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:7k
源码类别:

金融证券系统

开发平台:

Visual C++

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