SkinMenu.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #ifndef SKIN_MENU_HEAD_FILE
  2. #define SKIN_MENU_HEAD_FILE
  3. #pragma once
  4. #include "SkinUI.h"
  5. #include "ISkinControl.h"
  6. //////////////////////////////////////////////////////////////////////////////////
  7. //子项类型
  8. enum enMenuItemType
  9. {
  10. MenuItemType_String, //字符类型
  11. MenuItemType_Separator, //拆分类型
  12. };
  13. //////////////////////////////////////////////////////////////////////////////////
  14. //菜单子项
  15. class CSkinMenuItem
  16. {
  17. //变量定义
  18. public:
  19. const enMenuItemType m_MenuItemType; //子项类型
  20. HMENU m_hSubMenu; //子菜单
  21. //函数定义
  22. public:
  23. //构造函数
  24. CSkinMenuItem(enMenuItemType MenuItemType) : m_MenuItemType(MenuItemType) {m_hSubMenu = NULL;}
  25. //析构函数
  26. virtual ~CSkinMenuItem() {}
  27. };
  28. //字符菜单
  29. class CSkinMenuString : public CSkinMenuItem
  30. {
  31. //变量定义
  32. public:
  33. CString m_strString; //菜单字符
  34. CImageEx *m_pImageN; //图像句柄
  35. CImageEx *m_pImageH; //图像句柄
  36. //函数定义
  37. public:
  38. //构造函数
  39. CSkinMenuString() : CSkinMenuItem(MenuItemType_String) {m_pImageN=m_pImageH=NULL;}
  40. //析构函数
  41. virtual ~CSkinMenuString() {}
  42. };
  43. //拆分菜单
  44. class CSkinMenuSeparator : public CSkinMenuItem
  45. {
  46. //函数定义
  47. public:
  48. //构造函数
  49. CSkinMenuSeparator() : CSkinMenuItem(MenuItemType_Separator) {}
  50. //析构函数
  51. virtual ~CSkinMenuSeparator() {}
  52. };
  53. //////////////////////////////////////////////////////////////////////////////////
  54. //数组说明
  55. typedef CArray<CSkinMenuItem *,CSkinMenuItem *> CMenuItemArray; //子项数组
  56. typedef CArray<CSkinMenuString *,CSkinMenuString *> CMenuStringArray; //子项数组
  57. typedef CArray<CSkinMenuSeparator *,CSkinMenuSeparator *> CMenuSeparatorArray; //子项数组
  58. //////////////////////////////////////////////////////////////////////////////////
  59. //菜单内核
  60. class SKINUI_CLASS CSkinMenu : public CMenu,public ISkinControl
  61. {
  62. //图片资源
  63. protected:
  64. CImageEx *m_pMenuBar;
  65. CImageEx *m_pMenuBack;
  66. CImageEx *m_pMenuHoven;
  67. CImageEx *m_pSeparator;
  68. CImageEx *m_pCheck;
  69. CImageEx *m_pArrow;
  70. //内核变量
  71. protected:
  72. CMenuItemArray m_MenuItemActive; //子项数组
  73. //静态变量
  74. protected:
  75. static CMenuStringArray m_MenuItemString; //字符子项
  76. static CMenuSeparatorArray m_MenuItemSeparator; //拆分子项
  77. static HHOOK m_hMenuHook;
  78. protected:
  79. COLORREF m_crSeparator;
  80. int m_nItemHeight;
  81. //函数定义
  82. public:
  83. //构造函数
  84. CSkinMenu();
  85. //析构函数
  86. virtual ~CSkinMenu();
  87. //重载函数
  88. public:
  89. //绘画函数
  90. virtual VOID DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
  91. //测量位置
  92. virtual VOID MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
  93. //管理函数
  94. public:
  95. //创建菜单
  96. bool CreatePopupMenu();
  97. //销毁菜单
  98. BOOL DestroyMenu();
  99. //弹出菜单
  100. bool TrackPopupMenu(CWnd * pWnd);
  101. //弹出菜单
  102. bool TrackPopupMenu(INT nXPos, INT nYPos, CWnd * pWnd);
  103. //资源设置
  104. public:
  105. //设置资源
  106. BOOL SetMenuBarImage(LPCTSTR lpszFileName,CONST LPRECT lprcNinePart=NULL);
  107. //设置资源
  108. BOOL SetMenuBackImage(LPCTSTR lpszFileName,CONST LPRECT lprcNinePart=NULL);
  109. //设置资源
  110. BOOL SetMenuHovenImage(LPCTSTR lpszFileName,CONST LPRECT lprcNinePart=NULL);
  111. //设置资源
  112. BOOL SetSeparatorImage(LPCTSTR lpszFileName,CONST LPRECT lprcNinePart=NULL);
  113. //设置资源
  114. BOOL SetCheckImage(LPCTSTR lpszFileName);
  115. //设置资源
  116. BOOL SetArrowImage(LPCTSTR lpszFileName);
  117. //设置高度
  118. void SetItemHeight(int nHeight){ m_nItemHeight = nHeight; }
  119. //增加函数
  120. public:
  121. //插入拆分
  122. bool AppendSeparator();
  123. //插入字符
  124. bool AppendMenu(UINT nMenuID, LPCTSTR pszString, LPCTSTR lpszIconN=NULL, LPCTSTR lpszIconH=NULL, UINT nFlags=0);
  125. //插入函数
  126. public:
  127. //插入拆分
  128. bool InsertSeparator(UINT nPosition);
  129. //插入字符
  130. bool InsertMenu(UINT nMenuID, LPCTSTR pszString, UINT nPosition, LPCTSTR lpszIconN=NULL, LPCTSTR lpszIconH=NULL, UINT nFlags=0);
  131. //修改函数
  132. public:
  133. //删除菜单
  134. bool RemoveMenu(UINT nPosition, UINT nFlags);
  135. //修改菜单
  136. bool ModifyMenu(UINT nMenuID, LPCTSTR pszString, UINT nPosition, LPCTSTR lpszIconN=NULL, LPCTSTR lpszIconH=NULL, UINT nFlags=0);
  137. //内部函数
  138. private:
  139. //拆分数量
  140. int GetSeparatorCount();
  141. //释放子项
  142. VOID FreeMenuItem(CSkinMenuItem * pSkinMenuItem);
  143. //获取子项
  144. CSkinMenuItem * AcitveMenuItem(enMenuItemType MenuItemType);
  145. static LRESULT CALLBACK WindowsHook(int code,WPARAM wParam,LPARAM lParam);
  146. };
  147. //////////////////////////////////////////////////////////////////////////////////
  148. #endif