UICoolMenu.h
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:8k
源码类别:

图形图象

开发平台:

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 "UISubClass.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 CTRL_EXT_CLASS CCoolMenuManager : public CSubclassWnd 
  53. {
  54. public:
  55.     DECLARE_DYNAMIC(CCoolMenuManager)
  56.     CCoolMenuManager();
  57.     ~CCoolMenuManager();
  58.     // You can set these any time
  59.     BOOL m_bShowButtons;            // use to control whether buttons are shown
  60.     BOOL m_bAutoAccel;          // generate auto accelerators
  61.     BOOL m_bUseDrawState;       // use ::DrawState for disabled buttons
  62.     BOOL m_bDrawDisabledButtonsInColor; // draw disabled buttons in color
  63.                                                     // (only if m_bUseDrawState = FALSE)
  64.     // public functions to use
  65.     void Install(CWnd* pFrame);                 // connect to main frame
  66.     void Uninstall();                 // disconnect from main frame
  67.     BOOL LoadToolbars(const UINT* arIDs, int n);    // load multiple toolbars
  68.     BOOL LoadToolbar(UINT nID);                     // load one toolbar
  69. CSize SetButtonSize(CSize &sz=CSize(0,0)); // Set up button sizes if not using toolbar
  70.     BOOL AddSingleBitmap(UINT nBitmapID, UINT n, UINT *nID);
  71.     // O.S. - item access
  72.     static void *SetItemData(HMENU hMenu, void *pData, UINT uItem, BOOL bByPosition = FALSE);
  73.     static void *GetItemData(HMENU hMenu, UINT uItem, BOOL bByPosition = FALSE);
  74.     static HICON SetItemIcon(HMENU hMenu, HICON hIcon, UINT uItem, BOOL bByPosition = FALSE);
  75.     static HICON GetItemIcon(HMENU hMenu, UINT uItem, BOOL bByPosition = FALSE);
  76.     // O.S. -- stuff for submenus
  77.     void SetSubMenuIcon(HMENU hSubMenu, int nID); // nID == -1 -> never convert this submenu
  78.     void UnmanageSubMenu(HMENU hSubMenu);
  79. // shell menu functions
  80. void SetShellContextMenu(LPCONTEXTMENU lpcm,UINT nIDFirst,UINT nIDLast);
  81. void AddShellContextMenu(CMenu *pMenu, LPCONTEXTMENU lpm, int iIndex);
  82.     // Conversion routines
  83. // Switch between MyItemData and their item data
  84. DWORD SwitchContextItemData(CMenu *pMenu, int iCmd, DWORD dwItemData=0, BOOL bByPosition=TRUE);
  85.     void ConvertMenu(CMenu *pMenu);
  86.     void UnconvertMenu(CMenu *pMenu);
  87.     void ConvertMenuItem(CMenu *pMenu, int iIndex, bool bRecurse = true, 
  88.         bool bUnconvert = false);
  89.     // should never need to call:
  90.     virtual void Destroy(); // destroys everything--to re-load new toolbars?
  91.     virtual void Refresh(); // called when system colors, etc change
  92.     static  HBITMAP GetMFCDotBitmap();  // get..
  93.     static  void    FixMFCDotBitmap();  // and fix MFC's dot bitmap
  94.     static BOOL bTRACE; // Set TRUE to see extra diagnostics in DEBUG code
  95. protected:
  96.     CWnd*       m_pFrame;       // frame window I belong to
  97.     CUIntArray      m_arToolbarID;  // array of toolbar IDs loaded
  98.     CImageList      m_ilButtons;    // image list for all buttons
  99.     CImageList      m_ilTemp;       // image list for all buttons
  100.     CMapWordToPtr   m_mapIDtoImage;// maps command ID -> image list index
  101.     CMapWordToPtr   m_mapIDtoAccel;// maps command ID -> ACCEL*
  102.     CMapPtrToWord   m_mapHMENUtoID; 
  103.     HACCEL          m_hAccel;       // current accelerators, if any
  104.     ACCEL*          m_pAccel;       // ..and table in memory
  105.     CPtrList            m_menuList;     // list of HMENU's initialized
  106.     CSize               m_szBitmap;     // size of button bitmap
  107.     CSize               m_szButton;     // size of button (including shadow)
  108.     CFont               m_fontMenu;     // menu font
  109. ///////////////////////////
  110. // Addition: Philip Oldaker
  111. // Shell helpers to show help string on the status bar
  112. UINT m_idShellMenuFirst;
  113. UINT m_idShellMenuLast;
  114. LPCONTEXTMENU m_lpcm;
  115. //////////////////////////
  116.     void ConvertMenu(CMenu* pMenu,UINT nIndex,BOOL bSysMenu,BOOL bShowButtons);
  117.     // helpers
  118.     void DestroyAccel();
  119.     void DrawMenuText(CDC& dc, CRect rc, CString text, COLORREF color);
  120.     BOOL Draw3DCheckmark(CDC& dc, const CRect& rc, BOOL bSelected,
  121.                 HBITMAP hbmCheck=NULL);
  122.     void LoadAccel(HACCEL hAccel);
  123.     CString GetVirtualKeyName( const CString strVirtKey ) const;
  124.     BOOL AppendAccelName(CString& sItemName, UINT nID);
  125.     CFont* GetMenuFont();
  126.     // Get button index for given command ID, or -1 if not found
  127.     int  GetButtonIndex(WORD nID) {
  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.         void* val;
  134.         return m_mapIDtoAccel.Lookup(nID, val) ? (ACCEL*)val : NULL;
  135.     }
  136.     // window proc to hook frame using CCoolMenuSubclassWnd implementation
  137.     virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp);
  138.     // CCoolMenuSubclassWnd message handlers 
  139.     virtual void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu);
  140.     virtual BOOL OnMeasureItem(LPMEASUREITEMSTRUCT lpms);
  141.     virtual BOOL OnDrawItem(LPDRAWITEMSTRUCT lpds);
  142.     virtual LONG OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu);
  143.     virtual void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
  144. };
  145. // the one and only manager
  146. extern CCoolMenuManager g_CoolMenuManager;
  147. //////////////////
  148. // Friendly version of MENUITEMINFO initializes itself
  149. //
  150. struct CMenuItemInfo : public MENUITEMINFO {
  151.     CMenuItemInfo()
  152.     { memset(this, 0, sizeof(MENUITEMINFO));
  153.       cbSize = sizeof(MENUITEMINFO);
  154.     }
  155. };
  156. #endif // __COOLMENU_H__