www.pudn.com > rs232_moni.rar > CoolMenu.h
//-----------------------------------------------------------------------// // This is a part of the GuiLib MFC Extention. // // Modified by : Francisco Campos // // (C) 2002 Francisco CamposAll rights reserved // // This code is provided "as is", with absolutely no warranty expressed // // or implied. Any use is at your own risk. // // You must obtain the author's consent before you can include this code // // in a software library. // // If the source code in this file is used in any application // // then acknowledgement must be made to the author of this program // // fco_campos@tutopia.com // //-----------------------------------------------------------------------// //////////////////////////////////////////////////////////////// // 199 Microsoft Systems Journal. // If this code works, it was written by Paul DiLascia. // If not, I don't know who wrote it. // // ========================================================================== // HISTORY: // ========================================================================== // 1.01 13 Aug 1998 - Andrew Bancroft [ABancroft@lgc.com] - Since we've already // added the entire toolbar to the imagelist we need to // increment nNextImage even if we didn't add this button to // m_mapIDtoImage in the LoadToolbar() method. // 1.01a 13 Aug 1998 - Peter Tewkesbury - Added AddSingleBitmap(...) // method for adding a single bitmap to a pulldown // menu item. // 1.02 13 Aug 1998 - Omar L Francisco - Fixed bug with lpds->CtlType // and lpds->itemData item checking. // 1.03 12 Nov 1998 - Fixes debug assert in system menu. - Wang Jun // 1.04 17 Nov 1998 - Fixes debug assert when you maximize a view - Wang Jun // window, then try to use the system menu for the view. // 1.05 09 Jan 1998 - Seain B. Conover [sc@tarasoft.com] - Fix for virtual // key names. // 1.06 24 Feb 1999 - Michael Lange [michael.home@topdogg.com] - Fix for memory // leak in CMyItemData structure, added a destructor that // calls text.Empty(). // - Boris Kartamishev [kbv@omegasoftware.com] - Fix for resource // ID bug. // - Jeremy Horgan [jeremyhorgan@hotmail.com] - During // accelerator key processing OnInitMenuPopup() calls // ConvertMenu() which allocates a new CMyItemData for each // menu item. This is memory is normally freed by a call to // OnMenuSelect(), which is not called when processing // accelerator keys. This results in a memory leak. This was // fixed by modifying the ~CCoolMenuManager() destructor. // 1.07 24 Feb 1999 - Koji MATSUNAMI [kmatsu@inse.co.jp] - Fixed problem with // popup menus being drawn correctly as cool menus. // ========================================================================== // ///////////////////////////////////////////////////////////////////////////// #ifndef __COOLMENU_H__ #define __COOLMENU_H__ #include "SubClass.h" #include "GuiLib.h" ////////////////// // CCoolMenuManager implements "cool" menus with buttons in them. To use: // // * Instantiate in your CMainFrame. // * Call Install to install it // * Call LoadToolbars or LoadToolbar to load toolbars // // Don't forget to link with CoolMenu.cpp, Subclass.cpp and DrawTool.cpp! // class GUILIBDLLEXPORT CCoolMenuManager : private CSubclassWnd { public: DECLARE_DYNAMIC(CCoolMenuManager) CCoolMenuManager(); ~CCoolMenuManager(); // You can set these any time BOOL m_bShowButtons; // use to control whether buttons are shown BOOL m_bAutoAccel; // generate auto accelerators BOOL m_bUseDrawState; // use ::DrawState for disabled buttons BOOL m_bDrawDisabledButtonsInColor; // draw disabled buttons in color // (only if m_bUseDrawState = FALSE) // public functions to use void Install(CFrameWnd* pFrame); // connect to main frame BOOL LoadToolbars(const UINT* arIDs, int n); // load multiple toolbars BOOL LoadToolbar(UINT nID); // load one toolbar BOOL AddSingleBitmap(UINT nBitmapID, UINT n, UINT *nID); // should never need to call: virtual void Destroy(); // destroys everything--to re-load new toolbars? virtual void Refresh(); // called when system colors, etc change static HBITMAP GetMFCDotBitmap(); // get.. static void FixMFCDotBitmap(); // and fix MFC's dot bitmap static BOOL bTRACE; // Set TRUE to see extra diagnostics in DEBUG code protected: CFrameWnd* m_pFrame; // frame window I belong to CUIntArray m_arToolbarID; // array of toolbar IDs loaded CImageList m_ilButtons; // image list for all buttons CMapWordToPtr m_mapIDtoImage;// maps command ID -> image list index CMapWordToPtr m_mapIDtoAccel;// maps command ID -> ACCEL* HACCEL m_hAccel; // current accelerators, if any ACCEL* m_pAccel; // ..and table in memory CPtrList m_menuList; // list of HMENU's initialized CSize m_szBitmap; // size of button bitmap CSize m_szButton; // size of button (including shadow) CFont m_fontMenu; // menu font // helpers void DestroyAccel(); void DrawMenuText(CDC& dc, CRect rc, CString text, COLORREF color); BOOL Draw3DCheckmark(CDC& dc, const CRect& rc, BOOL bSelected, HBITMAP hbmCheck=NULL); void ConvertMenu(CMenu* pMenu,UINT nIndex,BOOL bSysMenu,BOOL bShowButtons); void LoadAccel(HACCEL hAccel); CString GetVirtualKeyName( const CString strVirtKey ) const; BOOL AppendAccelName(CString& sItemName, UINT nID); CFont* GetMenuFont(); void DrawSeparator(CRect& rc,CDC& dc); void PLNormalRect(CDC& dc, const CRect& rc); // Get button index for given command ID, or -1 if not found int GetButtonIndex(WORD nID) { void* val; return m_mapIDtoImage.Lookup(nID, val) ? (int)val : -1; } // Get ACCEL structure associated with a given command ID ACCEL* GetAccel(WORD nID) { void* val; return m_mapIDtoAccel.Lookup(nID, val) ? (ACCEL*)val : NULL; } // window proc to hook frame using CSubclassWnd implementation virtual LRESULT WindowProc(UINT msg, WPARAM wp, LPARAM lp); // CSubclassWnd message handlers virtual void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu); virtual BOOL OnMeasureItem(LPMEASUREITEMSTRUCT lpms); virtual BOOL OnDrawItem(LPDRAWITEMSTRUCT lpds); virtual LONG OnMenuChar(UINT nChar, UINT nFlags, CMenu* pMenu); virtual void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu); }; ////////////////// // Friendly version of MENUITEMINFO initializes itself // // // There is a BUG in GeMenuItemInfo => doesn't want to work with WINVER = 5000, => 48 bytes // we are redifining it here: // Garbaged Menu Strings and how to Fix it... igor1960 19:53 31 Jul '02 #ifndef __MENUITEMINFO_LOCAL_DEFINED #define __MENUITEMINFO_LOCAL_DEFINED typedef struct tagMENUITEMINFO_LOCAL { UINT cbSize; UINT fMask; UINT fType; // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0) UINT fState; // used if MIIM_STATE UINT wID; // used if MIIM_ID HMENU hSubMenu; // used if MIIM_SUBMENU HBITMAP hbmpChecked; // used if MIIM_CHECKMARKS HBITMAP hbmpUnchecked; // used if MIIM_CHECKMARKS DWORD dwItemData; // used if MIIM_DATA LPSTR dwTypeData; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) UINT cch; // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0) } MENUITEMINFO_LOCAL; #endif struct CMenuItemInfo : public MENUITEMINFO_LOCAL { CMenuItemInfo() { memset(this, 0, sizeof(MENUITEMINFO_LOCAL)); cbSize = sizeof(MENUITEMINFO_LOCAL); } }; #endif // __COOLMENU_H__