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

对话框与窗口

开发平台:

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.  * *
  18.  * Bug Fixes and improvements : (Add your name) *
  19.  * -Francisco Campos *
  20.  * *
  21.  ****************************************************************************/
  22. //------------------------------------------------------------------------------
  23. // File    : NewMenu.h 
  24. // Version : 1.0
  25. // Date    : Mai 2002
  26. // Author  : Bruno Podetti
  27. // Email   : Podetti@gmx.net
  28. // Systems : VC6.0 and VC7.0 (Run under (Window 98/ME), Windows Nt 2000/XP)
  29. //
  30. // Bug Fixes and portions of code from previous version supplied by:
  31. //
  32. // Brent Corkum, Ben Ashley, Girish Bharadwaj, Jean-Edouard Lachand-Robert,
  33. // Robert Edward Caldecott, Kenny Goers, Leonardo Zide, Stefan Kuhr, 
  34. // Reiner Jung, Martin Vladic, Kim Yoo Chul, Oz Solomonovich, Tongzhe Cui, 
  35. // Stephane Clog, Warren Stevens, Damir Valiulin
  36. // 
  37. // You are free to use/modify this code but leave this header intact.
  38. // This class is public domain so you are free to use it any of your 
  39. // applications (Freeware, Shareware, Commercial). 
  40. // All I ask is that you let me know so that if you have a real winner I can
  41. // brag to my buddies that some of my code is in your app. I also wouldn't 
  42. // mind if you sent me a copy of your application since I like to play with
  43. // new stuff.
  44. //------------------------------------------------------------------------------
  45. #ifndef __CNewMenu_H_
  46. #define __CNewMenu_H_
  47. #pragma warning(push)
  48. #pragma warning(disable : 4211)
  49. // Flagdefinitions 
  50. #define MFT_TITLE       0x0001
  51. #define MFT_TOP_TITLE   0x0000
  52. #define MFT_SIDE_TITLE  0x0002
  53. #define MFT_GRADIENT    0x0004
  54. #define MFT_SUNKEN      0x0008
  55. #define MFT_LINE        0x0010
  56. #define MFT_ROUND       0x0020
  57. #define MFT_CENTER      0x0040
  58. // Typedefinition for compatibility to MFC 7.0
  59. #ifndef DWORD_PTR
  60. typedef DWORD DWORD_PTR, *PDWORD_PTR;
  61. #endif
  62. #ifndef ULONG_PTR
  63. typedef unsigned long ULONG_PTR, *PULONG_PTR;
  64. #endif
  65. #ifndef LONG_PTR
  66. typedef long LONG_PTR, *PLONG_PTR;
  67. #endif
  68. #include "MenuBar.h"
  69. /////////////////////////////////////////////////////////////////////////////
  70. // Forwarddeclaration for drawing purpose
  71. class CMenuTheme;
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CNewMenuItemData menu item data for drawing
  74. class CNewMenuItemData : public CObject
  75. {
  76.   DECLARE_DYNCREATE(CNewMenuItemData)
  77. public:
  78.   CNewMenuItemData();
  79.   virtual ~CNewMenuItemData();
  80. public:
  81.   LPCTSTR GetString();
  82.   void SetString(LPCTSTR szMenuText);
  83. #if defined(_DEBUG) || defined(_AFXDLL)
  84.   // Diagnostic Support
  85.   virtual void AssertValid() const;
  86.   virtual void Dump(CDumpContext& dc) const;
  87. #endif
  88. public:
  89.   CString m_szMenuText;
  90.   UINT m_nTitleFlags;
  91.   UINT m_nFlags;
  92.   UINT m_nID;
  93.   UINT m_nSyncFlag;
  94.   int m_nxOffset;
  95.   int m_nMenuIconNormal;
  96.   CImageList* m_pBitmap;
  97.   void* m_pData;
  98. };
  99. /////////////////////////////////////////////////////////////////////////////
  100. // CNewMenu the new menu class
  101. class GUILIBDLLEXPORT  CNewMenu : public CMenu
  102. {
  103.   friend class CNewMenuHook;
  104.   DECLARE_DYNCREATE(CNewMenu)
  105. public:
  106.   // how the menu's are drawn, either original or XP style
  107.   typedef enum 
  108.   { 
  109.     STYLE_ORIGINAL,
  110.     STYLE_ORIGINAL_NOBORDER,
  111.     STYLE_XP,
  112.     STYLE_XP_NOBORDER,
  113.     STYLE_SPECIAL,
  114.     STYLE_SPECIAL_NOBORDER
  115.   } EDrawStyle;
  116.   // how seperators are handled when removing a menu (Tongzhe Cui)
  117.   typedef enum {NONE, HEAD, TAIL, BOTH} ESeperator;
  118. public:
  119.   CNewMenu(HMENU hParent=0); 
  120.   virtual ~CNewMenu();
  121.   // Functions for loading and applying bitmaps to menus (see example application)
  122.   virtual BOOL LoadMenu(HMENU hMenu);
  123.   virtual BOOL LoadMenu(LPCTSTR lpszResourceName);
  124.   virtual BOOL LoadMenu(int nResource);
  125.   BOOL LoadToolBar(WORD* pToolInfo, COLORREF crTransparent=CLR_NONE);
  126.   BOOL LoadToolBar(LPCTSTR lpszResourceName);
  127.   BOOL LoadToolBar(UINT nToolBar);
  128.   BOOL LoadToolBars(const UINT *arID,int n);
  129.   void AddFromToolBar(CToolBar* pToolBar, int nResourceID);
  130.   BOOL LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset);
  131.   BOOL AddBitmapToImageList(CImageList *list,UINT nResourceID);
  132.   static HBITMAP LoadSysColorBitmap(int nResourceId);
  133.   // custom check mark bitmaps
  134.   void LoadCheckmarkBitmap(int unselect, int select); 
  135.   // functions for appending a menu option, use the AppendMenu call
  136.   BOOL AppendMenu(UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL,int nIconNormal=-1);
  137.   BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,LPCTSTR lpszNewItem,CImageList *il,int xoffset);
  138.   BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,LPCTSTR lpszNewItem,CBitmap *bmp);
  139.   BOOL AppendODMenu(LPCTSTR lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);  
  140.   BOOL AppendODMenu(LPCTSTR lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
  141.   // for appending a popup menu (see example application)
  142.   CNewMenu* AppendODPopupMenu(LPCTSTR lpstrText);
  143.   // functions for inserting a menu option, use the InsertMenu call (see above define)
  144.   BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,LPCTSTR lpszNewItem=NULL,int nIconNormal=-1);
  145.   BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,LPCTSTR lpszNewItem,CImageList *il,int xoffset);
  146.   BOOL InsertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,LPCTSTR lpszNewItem,CBitmap *bmp);
  147.   BOOL InsertODMenu(UINT nPosition,LPCTSTR lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);  
  148.   BOOL InsertODMenu(UINT nPosition,LPCTSTR lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
  149.   // functions for modifying a menu option, use the ModifyODMenu call (see above define)
  150.   BOOL ModifyODMenu(LPCTSTR lpstrText,UINT nID=0,int nIconNormal=-1);
  151.   BOOL ModifyODMenu(LPCTSTR lpstrText,UINT nID,CImageList *il,int xoffset);
  152.   BOOL ModifyODMenu(LPCTSTR lpstrText,UINT nID,CBitmap *bmp);
  153.   BOOL ModifyODMenu(LPCTSTR lpstrText,LPCTSTR OptionText,int nIconNormal);
  154.   // use this method for adding a solid/hatched colored square beside a menu option
  155.   // courtesy of Warren Stevens
  156.   BOOL ModifyODMenu(LPCTSTR lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle=-1);
  157.   // for deleting and removing menu options
  158.   BOOL  DeleteMenu(UINT uiId,UINT nFlags);
  159.   BOOL  RemoveMenu(UINT uiId,UINT nFlags);
  160.   int RemoveMenu(LPCTSTR pText, ESeperator sPos=CNewMenu::NONE);
  161.   // function for retrieving and setting a menu options text (use this function
  162.   // because it is ownerdrawn)
  163.   BOOL GetMenuText(UINT id,CString &string,UINT nFlags = MF_BYPOSITION);
  164.   BOOL SetMenuText(UINT id,CString string, UINT nFlags = MF_BYPOSITION);
  165.   // Getting a submenu from it's name or position
  166.   CMenu* GetSubMenu (LPCTSTR lpszSubMenuName);
  167.   CMenu* GetSubMenu (int nPos);
  168.   int GetMenuPosition(LPCTSTR pText);
  169.   // Destoying
  170.   virtual BOOL DestroyMenu();
  171.   // Drawing: 
  172.   // Draw an item
  173.   virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
  174.   // Measure an item  
  175.   virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
  176.   // Draw title of the menu
  177.   virtual void DrawTitle(LPDRAWITEMSTRUCT lpDIS,BOOL bIsMenuBar);
  178.   // Erase the Background of the menu
  179.   virtual BOOL EraseBkgnd(HWND hWnd,HDC hDC);
  180.   BOOL SetMenuTitle(LPCTSTR pTitle,UINT nTitleFlags=MFT_TOP_TITLE);
  181.   BOOL RemoveMenuTitle();
  182.   // Function to set how menu is drawn, either original or XP style
  183.   static int  GetMenuDrawMode();
  184.   static void SetMenuDrawMode(UINT mode);
  185.   // Function to set how disabled items are drawn 
  186.   //(mode=FALSE means they are not drawn selected)
  187.   static BOOL SetSelectDisableMode(BOOL mode);
  188.   static BOOL GetSelectDisableMode();
  189.   // Static functions used for handling menu's in the mainframe
  190.   static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
  191.   static BOOL OnMeasureItem(const MSG* pMsg);
  192.   static void OnInitMenuPopup(HWND hWnd, CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
  193.   static CMenu* FindPopupMenuFromID(CMenu* pMenu, UINT nID);
  194.   static CMenu* FindPopupMenuFromID(HMENU hMenu, UINT nID);
  195.   static CMenu* FindPopupMenuFromIDData(CMenu* pMenu, UINT nID, ULONG_PTR pData);
  196.   static CMenu* FindPopupMenuFromIDData(HMENU hMenu, UINT nID, ULONG_PTR pData);
  197.   virtual void OnInitMenuPopup();
  198.   virtual BOOL OnUnInitPopupMenu();
  199.   // Customizing:
  200.   // Set icon size
  201.   void SetIconSize (int, int); 
  202.   // set the color in the bitmaps that is the background transparent color
  203.   COLORREF SetBitmapBackground(COLORREF newColor);
  204.   COLORREF GetBitmapBackground(); 
  205.   CRect GetLastActiveMenuRect();
  206.   HMENU GetParent();
  207.   BOOL IsPopup();
  208.   void StyleDispl(DWORD dwDsp=GUISTYLE_XP)
  209.   {
  210. m_StyleMenu=dwDsp;
  211.   }  
  212. // Miscellaneous Protected Member functions
  213. protected:
  214.   BOOL Replace(UINT nID,UINT nNewID);
  215.   static BOOL IsNewShell();
  216.   BOOL IsMenuBar(HMENU hMenu=NULL);
  217.   void SetLastMenuRect(HDC hDC, LPRECT pRect);
  218.   CNewMenuItemData* FindMenuItem(UINT nID);
  219.   CNewMenu* FindMenuOption(int nId, int& nLoc);
  220.   CNewMenu* FindMenuOption(LPCTSTR lpstrText, int& nLoc);
  221.   CNewMenu* FindAnotherMenuOption(int nId,int& nLoc,CArray<CNewMenu*,CNewMenu*>&newSubs,CArray<int,int&>&newLocs);
  222.   void DrawCheckMark(CDC* pDC,int x,int y,COLORREF color);
  223.   void DrawRadioDot(CDC* pDC,int x,int y,COLORREF color);
  224.   CNewMenuItemData* NewODMenu(UINT pos,UINT nFlags,UINT nID,LPCTSTR string);
  225.   void SynchronizeMenu();
  226.   void InitializeMenuList(int value);
  227.   void DeleteMenuList();
  228.   
  229.   CNewMenuItemData* FindMenuList(UINT nID);
  230.   void DrawSpecial_OldStyle(CDC* pDC, LPCRECT pRect, UINT nID, DWORD dwStyle);
  231.   void DrawSpecial_WinXP(CDC* pDC, LPCRECT pRect, UINT nID, DWORD dwStyle);
  232.   void DrawSpecialCharStyle(CDC* pDC, LPCRECT pRect, TCHAR Sign, DWORD dwStyle);
  233.   void DrawSpecialChar(CDC* pDC, LPCRECT pRect, TCHAR Sign, BOOL bBold);
  234.   void DrawMenuTitle(LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar);
  235.   // Measure an item
  236.   void MeasureItem_OldStyle( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar); 
  237.   void DrawItem_OldStyle (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenubar);
  238.   BOOL Draw3DCheckmark(CDC* dc, const CRect& rc,HBITMAP hbmCheck, DWORD dwStyle);
  239.   void MeasureItem_WinXP( LPMEASUREITEMSTRUCT lpMIS, BOOL bIsMenuBar); 
  240.   void DrawItem_WinXP (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenuBar);
  241.   void DrawItem_SpecialStyle (LPDRAWITEMSTRUCT lpDIS, BOOL bIsMenubar);
  242.   BOOL ImageListDuplicate(CImageList* il,int xoffset,CImageList* newlist);
  243.   static WORD NumBitmapColors(LPBITMAPINFOHEADER lpBitmap);
  244.   void ColorBitmap(CDC* pDC, CBitmap& bmp,CSize size,COLORREF fill,COLORREF border,int hatchstyle=-1);
  245.   void SetMBar(CMenuButton *pBar);
  246.   
  247. // Member Variables
  248. public:
  249.   static int cCOLOR_MENUBAR;
  250.   static DWORD m_StyleMenu; //new variable for guitoolkit
  251.  
  252. protected: 
  253.   // Stores list of menu items
  254.   CTypedPtrArray<CPtrArray, CNewMenuItemData*> m_MenuList;   
  255.   // When loading an owner-drawn menu using a Resource, CNewMenu must keep track of
  256.   // the popup menu's that it creates. Warning, this list *MUST* be destroyed
  257.   // last item first :)
  258.   // Stores list of sub-menus
  259.   CTypedPtrArray<CPtrArray, HMENU>  m_SubMenus;
  260.   // Stores a list of all CNewMenu's ever created 
  261.   static CTypedPtrArray<CPtrArray, HMENU>  m_AllSubMenus;
  262.   static BOOL m_bSelectDisable;
  263.   static CMenuTheme* m_pActMenuDrawing;
  264.   
  265.   int m_iconX;
  266.   int m_iconY;
  267.   COLORREF m_bitmapBackground;
  268.   CImageList* checkmaps;
  269.   BOOL checkmapsshare;
  270.   int m_selectcheck;
  271.   int m_unselectcheck;
  272.   BOOL m_bDynIcons;
  273.   HMENU m_hParentMenu;
  274.   BOOL m_bIsPopupMenu;
  275.   CRect m_LastActiveMenuRect;
  276.   DWORD m_dwOpenMenu;
  277. };
  278. #pragma warning(pop)
  279. #endif // __CNewMenu_H_