BCMenu.h
上传用户:aokegd
上传日期:2009-12-14
资源大小:1276k
文件大小:14k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //*************************************************************************
  2. // BCMenu.h : header file
  3. // Version : 3.0
  4. // Date : January 2002
  5. // Author : Brent Corkum
  6. // Email :  corkum@rocscience.com
  7. // Latest Version : http://www.rocscience.com/~corkum/BCMenu.html
  8. // 
  9. // Bug Fixes and portions of code supplied by:
  10. //
  11. // Ben Ashley,Girish Bharadwaj,Jean-Edouard Lachand-Robert,
  12. // Robert Edward Caldecott,Kenny Goers,Leonardo Zide,
  13. // Stefan Kuhr,Reiner Jung,Martin Vladic,Kim Yoo Chul,
  14. // Oz Solomonovich,Tongzhe Cui,Stephane Clog,Warren Stevens,
  15. // Damir Valiulin
  16. //
  17. // You are free to use/modify this code but leave this header intact.
  18. // This class is public domain so you are free to use it any of
  19. // your applications (Freeware,Shareware,Commercial). All I ask is
  20. // that you let me know so that if you have a real winner I can
  21. // brag to my buddies that some of my code is in your app. I also
  22. // wouldn't mind if you sent me a copy of your application since I
  23. // like to play with new stuff.
  24. //*************************************************************************
  25. #ifndef BCMenu_H
  26. #define BCMenu_H
  27. #include <afxtempl.h>
  28. // BCMenuData class. Fill this class structure to define a single menu item:
  29. class BCMenuData
  30. {
  31. wchar_t *m_szMenuText;
  32. public:
  33. BCMenuData () {menuIconNormal=-1;xoffset=-1;bitmap=NULL;pContext=NULL;
  34. nFlags=0;nID=0;syncflag=0;m_szMenuText=NULL;};
  35. void SetAnsiString(LPCSTR szAnsiString);
  36. void SetWideString(const wchar_t *szWideString);
  37. const wchar_t *GetWideString(void) {return m_szMenuText;};
  38. ~BCMenuData ();
  39. CString GetString(void);//returns the menu text in ANSI or UNICODE
  40. int xoffset;
  41. int menuIconNormal;
  42. UINT nFlags,nID,syncflag;
  43. CImageList *bitmap;
  44. void *pContext; // used to attach user data
  45. };
  46. //struct CMenuItemInfo : public MENUITEMINFO {
  47. struct CMenuItemInfo : public 
  48. //MENUITEMINFO 
  49. #ifndef UNICODE   //SK: this fixes warning C4097: typedef-name 'MENUITEMINFO' used as synonym for class-name 'tagMENUITEMINFOA'
  50. tagMENUITEMINFOA
  51. #else
  52. tagMENUITEMINFOW
  53. #endif
  54. {
  55. CMenuItemInfo()
  56. {
  57. memset(this, 0, sizeof(MENUITEMINFO));
  58. cbSize = sizeof(MENUITEMINFO);
  59. }
  60. };
  61. // how the menu's are drawn, either original or XP style
  62. typedef enum {BCMENU_DRAWMODE_ORIGINAL,BCMENU_DRAWMODE_XP} BC_MenuDrawMode;
  63. // how seperators are handled when removing a menu (Tongzhe Cui)
  64. typedef enum {BCMENU_NONE, BCMENU_HEAD, BCMENU_TAIL, BCMENU_BOTH} BC_Seperator;
  65. // defines for unicode support
  66. #ifndef UNICODE
  67. #define AppendMenu AppendMenuA
  68. #define InsertMenu InsertMenuA
  69. #define InsertODMenu InsertODMenuA
  70. #define AppendODMenu AppendODMenuA
  71. #define AppendODPopupMenu AppendODPopupMenuA
  72. #define ModifyODMenu ModifyODMenuA
  73. #else
  74. #define AppendMenu AppendMenuW
  75. #define InsertMenu InsertMenuW
  76. #define InsertODMenu InsertODMenuW
  77. #define AppendODMenu AppendODMenuW
  78. #define ModifyODMenu ModifyODMenuW
  79. #define AppendODPopupMenu AppendODPopupMenuW
  80. #endif
  81. class BCMenu : public CMenu
  82. {
  83. public:
  84. BCMenu(); 
  85. virtual ~BCMenu();
  86. // Functions for loading and applying bitmaps to menus (see example application)
  87. virtual BOOL LoadMenu(LPCTSTR lpszResourceName);
  88. virtual BOOL LoadMenu(int nResource);
  89. BOOL LoadToolbar(UINT nToolBar);
  90. BOOL LoadToolbars(const UINT *arID,int n);
  91. void AddFromToolBar(CToolBar* pToolBar, int nResourceID);
  92. BOOL LoadFromToolBar(UINT nID,UINT nToolBar,int& xoffset);
  93. BOOL AddBitmapToImageList(CImageList *list,UINT nResourceID);
  94. static HBITMAP LoadSysColorBitmap(int nResourceId);
  95. void LoadCheckmarkBitmap(int unselect,int select); // custom check mark bitmaps
  96. // functions for appending a menu option, use the AppendMenu call (see above define)
  97. BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem=0,const char *lpszNewItem=NULL,int nIconNormal=-1);
  98. BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset);
  99. BOOL AppendMenuA(UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp);
  100. BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem=0,wchar_t *lpszNewItem=NULL,int nIconNormal=-1);
  101. BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset);
  102. BOOL AppendMenuW(UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp);
  103. BOOL AppendODMenuA(LPCSTR lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);  
  104. BOOL AppendODMenuW(wchar_t *lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);  
  105. BOOL AppendODMenuA(LPCSTR lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
  106. BOOL AppendODMenuW(wchar_t *lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
  107. // for appending a popup menu (see example application)
  108. BCMenu* AppendODPopupMenuA(LPCSTR lpstrText);
  109. BCMenu* AppendODPopupMenuW(wchar_t *lpstrText);
  110. // functions for inserting a menu option, use the InsertMenu call (see above define)
  111. BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,const char *lpszNewItem=NULL,int nIconNormal=-1);
  112. BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CImageList *il,int xoffset);
  113. BOOL InsertMenuA(UINT nPosition,UINT nFlags,UINT nIDNewItem,const char *lpszNewItem,CBitmap *bmp);
  114. BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,wchar_t *lpszNewItem=NULL,int nIconNormal=-1);
  115. BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CImageList *il,int xoffset);
  116. BOOL InsertMenuW(UINT nPosition,UINT nFlags,UINT nIDNewItem,wchar_t *lpszNewItem,CBitmap *bmp);
  117. BOOL InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1); 
  118. BOOL InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags = MF_OWNERDRAW,UINT nID = 0,int nIconNormal = -1);  
  119. BOOL InsertODMenuA(UINT nPosition,LPCSTR lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
  120. BOOL InsertODMenuW(UINT nPosition,wchar_t *lpstrText,UINT nFlags,UINT nID,CImageList *il,int xoffset);
  121. // functions for modifying a menu option, use the ModifyODMenu call (see above define)
  122. BOOL ModifyODMenuA(const char *lpstrText,UINT nID=0,int nIconNormal=-1);
  123. BOOL ModifyODMenuA(const char *lpstrText,UINT nID,CImageList *il,int xoffset);
  124. BOOL ModifyODMenuA(const char *lpstrText,UINT nID,CBitmap *bmp);
  125. BOOL ModifyODMenuA(const char *lpstrText,const char *OptionText,int nIconNormal);
  126. BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID=0,int nIconNormal=-1);
  127. BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,CImageList *il,int xoffset);
  128. BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,CBitmap *bmp);
  129. BOOL ModifyODMenuW(wchar_t *lpstrText,wchar_t *OptionText,int nIconNormal);
  130. // use this method for adding a solid/hatched colored square beside a menu option
  131. // courtesy of Warren Stevens
  132. BOOL ModifyODMenuA(const char *lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle=-1);
  133. BOOL ModifyODMenuW(wchar_t *lpstrText,UINT nID,COLORREF fill,COLORREF border,int hatchstyle=-1);
  134. // for deleting and removing menu options
  135. BOOL RemoveMenu(UINT uiId,UINT nFlags);
  136. BOOL DeleteMenu(UINT uiId,UINT nFlags);
  137. // sPos means Seperator's position, since we have no way to find the seperator's position in the menu
  138. // we have to specify them when we call the RemoveMenu to make sure the unused seperators are removed;
  139. // sPos  = None no seperator removal;
  140. //       = Head  seperator in front of this menu item;
  141. //       = Tail  seperator right after this menu item;
  142. //       = Both  seperators at both ends;
  143. // remove the menu item based on their text, return -1 if not found, otherwise return the menu position;
  144. int RemoveMenu(char* pText, BC_Seperator sPos=BCMENU_NONE);
  145. int RemoveMenu(wchar_t* pText, BC_Seperator sPos=BCMENU_NONE);
  146. // Destoying
  147. virtual BOOL DestroyMenu();
  148. // function for retrieving and setting a menu options text (use this function
  149. // because it is ownerdrawn)
  150. BOOL GetMenuText(UINT id,CString &string,UINT nFlags = MF_BYPOSITION);
  151. BOOL SetMenuText(UINT id,CString string, UINT nFlags = MF_BYPOSITION);
  152. // Getting a submenu from it's name or position
  153. CMenu* GetSubMenu (LPCTSTR lpszSubMenuName);
  154. CMenu* GetSubMenu (int nPos);
  155. int GetMenuPosition(char* pText);
  156. int GetMenuPosition(wchar_t* pText);
  157. // Drawing: 
  158. virtual void DrawItem( LPDRAWITEMSTRUCT);  // Draw an item
  159. virtual void MeasureItem( LPMEASUREITEMSTRUCT );  // Measure an item
  160. // Static functions used for handling menu's in the mainframe
  161. static void UpdateMenu(CMenu *pmenu);
  162. static BOOL IsMenu(CMenu *submenu);
  163. static BOOL IsMenu(HMENU submenu);
  164. static LRESULT FindKeyboardShortcut(UINT nChar,UINT nFlags,CMenu *pMenu);
  165. // Function to set how menu is drawn, either original or XP style
  166. static void SetMenuDrawMode(UINT mode){
  167. BCMenu::original_drawmode=mode;
  168. BCMenu::xp_drawmode=mode;
  169. };
  170. // Function to set how disabled items are drawn (mode=FALSE means they are not drawn selected)
  171. static void SetSelectDisableMode(BOOL mode){
  172. BCMenu::original_select_disabled=mode;
  173. BCMenu::xp_select_disabled=mode;
  174. };
  175. static int BCMenu::GetMenuDrawMode(void);
  176. // Customizing:
  177. // Set icon size
  178. void SetIconSize (int, int); 
  179. // set the color in the bitmaps that is the background transparent color
  180. void SetBitmapBackground(COLORREF color);
  181. void UnSetBitmapBackground(void);
  182. // obsolete functions for setting how menu images are dithered for disabled menu options
  183. BOOL GetDisableOldStyle(void);
  184. void SetDisableOldStyle(void);
  185. void UnSetDisableOldStyle(void);
  186. // Miscellaneous Protected Member functions
  187. protected:
  188. static BOOL IsNewShell(void);
  189. BCMenuData *BCMenu::FindMenuItem(UINT nID);
  190. BCMenu *FindMenuOption(int nId,int& nLoc);
  191. BCMenu *FindAnotherMenuOption(int nId,int& nLoc,CArray<BCMenu*,BCMenu*>&bcsubs,
  192.   CArray<int,int&>&bclocs);
  193. BCMenuData *FindMenuOption(wchar_t *lpstrText);
  194. void InsertSpaces(void);
  195. void DrawCheckMark(CDC *pDC,int x,int y,COLORREF color);
  196. void DrawRadioDot(CDC *pDC,int x,int y,COLORREF color);
  197. BCMenuData *NewODMenu(UINT pos,UINT nFlags,UINT nID,CString string);
  198. void SynchronizeMenu(void);
  199. void BCMenu::InitializeMenuList(int value);
  200. void BCMenu::DeleteMenuList(void);
  201. BCMenuData *BCMenu::FindMenuList(UINT nID);
  202. void DrawItem_Win9xNT2000 (LPDRAWITEMSTRUCT lpDIS);
  203. void DrawItem_WinXP (LPDRAWITEMSTRUCT lpDIS);
  204. BOOL Draw3DCheckmark(CDC *dc, const CRect& rc,BOOL bSelected,HBITMAP hbmCheck);
  205. BOOL DrawXPCheckmark(CDC *dc, const CRect& rc, HBITMAP hbmCheck,COLORREF &colorout);
  206. void DitherBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, 
  207. int nHeight, HBITMAP hbm, int nXSrc, int nYSrc,COLORREF bgcolor);
  208. void DitherBlt2(CDC *drawdc, int nXDest, int nYDest, int nWidth, 
  209. int nHeight, CBitmap &bmp, int nXSrc, int nYSrc,COLORREF bgcolor);
  210. BOOL GetBitmapFromImageList(CDC* pDC,CImageList *imglist,int nIndex,CBitmap &bmp);
  211. BOOL ImageListDuplicate(CImageList *il,int xoffset,CImageList *newlist);
  212. static COLORREF LightenColor(COLORREF col,double factor);
  213. static WORD NumBitmapColors(LPBITMAPINFOHEADER lpBitmap);
  214. void ColorBitmap(CDC* pDC, CBitmap& bmp,CSize size,COLORREF fill,COLORREF border,int hatchstyle=-1);
  215. // Member Variables
  216. protected:
  217. CTypedPtrArray<CPtrArray, BCMenuData*> m_MenuList;  // Stores list of menu items 
  218. // When loading an owner-drawn menu using a Resource, BCMenu must keep track of
  219. // the popup menu's that it creates. Warning, this list *MUST* be destroyed
  220. // last item first :)
  221. CTypedPtrArray<CPtrArray, HMENU>  m_SubMenus;  // Stores list of sub-menus 
  222. // Stores a list of all BCMenu's ever created 
  223. static CTypedPtrArray<CPtrArray, HMENU>  m_AllSubMenus;
  224. int m_iconX,m_iconY;
  225. COLORREF m_bitmapBackground;
  226. BOOL m_bitmapBackgroundFlag;
  227. BOOL disable_old_style;
  228. static UINT original_drawmode,xp_drawmode;
  229. static BOOL xp_select_disabled,original_select_disabled;
  230. CImageList *checkmaps;
  231. BOOL checkmapsshare;
  232. int m_selectcheck;
  233. int m_unselectcheck;
  234. BOOL m_bDynIcons;
  235. }; 
  236. #define BCMENU_USE_MEMDC
  237. #ifdef BCMENU_USE_MEMDC
  238. //////////////////////////////////////////////////
  239. // BCMenuMemDC - memory DC
  240. //
  241. // Author: Keith Rule
  242. // Email:  keithr@europa.com
  243. // Copyright 1996-1997, Keith Rule
  244. //
  245. // You may freely use or modify this code provided this
  246. // Copyright is included in all derived versions.
  247. //
  248. // History - 10/3/97 Fixed scrolling bug.
  249. //                   Added print support.
  250. //           25 feb 98 - fixed minor assertion bug
  251. //
  252. // This class implements a memory Device Context
  253. class BCMenuMemDC : public CDC
  254. {
  255. public:
  256.     // constructor sets up the memory DC
  257.     BCMenuMemDC(CDC* pDC,LPCRECT lpSrcRect) : CDC()
  258.     {
  259.         ASSERT(pDC != NULL);
  260. m_rect.CopyRect(lpSrcRect);
  261.         m_pDC = pDC;
  262.         m_pOldBitmap = NULL;
  263.         m_bMemDC = !pDC->IsPrinting();
  264.               
  265.         if (m_bMemDC)    // Create a Memory DC
  266.         {
  267.             CreateCompatibleDC(pDC);
  268.             m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
  269.             m_pOldBitmap = SelectObject(&m_bitmap);
  270.             SetWindowOrg(m_rect.left, m_rect.top);
  271.         }
  272.         else        // Make a copy of the relevent parts of the current DC for printing
  273.         {
  274.             m_bPrinting = pDC->m_bPrinting;
  275.             m_hDC       = pDC->m_hDC;
  276.             m_hAttribDC = pDC->m_hAttribDC;
  277.         }
  278.     }
  279.     
  280.     // Destructor copies the contents of the mem DC to the original DC
  281.     ~BCMenuMemDC()
  282.     {
  283.         if (m_bMemDC) 
  284.         {    
  285.             // Copy the offscreen bitmap onto the screen.
  286.             m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
  287.                           this, m_rect.left, m_rect.top, SRCCOPY);
  288.             //Swap back the original bitmap.
  289.             SelectObject(m_pOldBitmap);
  290.         } else {
  291.             // All we need to do is replace the DC with an illegal value,
  292.             // this keeps us from accidently deleting the handles associated with
  293.             // the CDC that was passed to the constructor.
  294.             m_hDC = m_hAttribDC = NULL;
  295.         }
  296.     }
  297.     // Allow usage as a pointer
  298.     BCMenuMemDC* operator->() {return this;}
  299.         
  300.     // Allow usage as a pointer
  301.     operator BCMenuMemDC*() {return this;}
  302. private:
  303.     CBitmap  m_bitmap;      // Offscreen bitmap
  304.     CBitmap* m_pOldBitmap;  // bitmap originally found in BCMenuMemDC
  305.     CDC*     m_pDC;         // Saves CDC passed in constructor
  306.     CRect    m_rect;        // Rectangle of drawing area.
  307.     BOOL     m_bMemDC;      // TRUE if CDC really is a Memory DC.
  308. };
  309. #endif
  310. #endif
  311. //*************************************************************************