XTPSkinObjectMenu.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:6k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinObjectMDI.cpp: implementation of the CXTPSkinObjectMDI class.
  2. //
  3. // This file is a part of the XTREME SKINFRAMEWORK MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "Common/XTPDrawHelpers.h"
  22. #include "XTPSkinObjectMenu.h"
  23. #include "XTPSkinManager.h"
  24. #include "XTPSkinDrawTools.h"
  25. #define MN_SELECTITEM 0x01E5
  26. #define MN_GETHMENU   0x01E1
  27. POINT CXTPSkinObjectFrame::m_sMenuOffset = {0, 0};
  28. #ifdef _DEBUG
  29. #undef THIS_FILE
  30. static char THIS_FILE[]=__FILE__;
  31. #define new DEBUG_NEW
  32. #endif
  33. //////////////////////////////////////////////////////////////////////
  34. // Construction/Destruction
  35. //////////////////////////////////////////////////////////////////////
  36. IMPLEMENT_DYNCREATE(CXTPSkinObjectMenu, CXTPSkinObjectFrame)
  37. CXTPSkinObjectMenu::CXTPSkinObjectMenu()
  38. {
  39. }
  40. CXTPSkinObjectMenu::~CXTPSkinObjectMenu()
  41. {
  42. }
  43. BEGIN_MESSAGE_MAP(CXTPSkinObjectMenu, CXTPSkinObjectFrame)
  44. //{{AFX_MSG_MAP(CXTPSkinObjectMenu)
  45. ON_WM_NCPAINT()
  46. ON_WM_PAINT()
  47. ON_WM_ERASEBKGND()
  48. ON_MESSAGE(WM_PRINT, OnPrint)
  49. ON_MESSAGE(WM_PRINTCLIENT, OnPrintClient)
  50. ON_MESSAGE(MN_SELECTITEM, OnSelectItem)
  51. ON_MESSAGE(WM_KEYDOWN, OnKeyDown)
  52. ON_MESSAGE(WM_SYSKEYDOWN, OnKeyDown)
  53. ON_MESSAGE(WM_CHAR, OnChar)
  54. ON_WM_WINDOWPOSCHANGING()
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. void CXTPSkinObjectMenu::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
  58. {
  59. lpwndpos->y += m_sMenuOffset.y;
  60. lpwndpos->x += m_sMenuOffset.x;
  61. CXTPSkinObjectFrame::OnWindowPosChanging(lpwndpos);
  62. }
  63. void CXTPSkinObjectMenu::OnPaint()
  64. {
  65. CXTPSkinObjectPaintDC dc(this); // device context for painting
  66. OnDraw(&dc);
  67. }
  68. #define MIIM_BITMAP      0x00000080
  69. struct MENUITEMINFO98
  70. {
  71. UINT    cbSize;
  72. UINT    fMask;
  73. UINT    fType;          // used if MIIM_TYPE (4.0) or MIIM_FTYPE (>4.0)
  74. UINT    fState;         // used if MIIM_STATE
  75. UINT    wID;            // used if MIIM_ID
  76. HMENU   hSubMenu;       // used if MIIM_SUBMENU
  77. HBITMAP hbmpChecked;    // used if MIIM_CHECKMARKS
  78. HBITMAP hbmpUnchecked;  // used if MIIM_CHECKMARKS
  79. DWORD   dwItemData;     // used if MIIM_DATA
  80. LPWSTR  dwTypeData;     // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
  81. UINT    cch;            // used if MIIM_TYPE (4.0) or MIIM_STRING (>4.0)
  82. HBITMAP hbmpItem;       // used if MIIM_BITMAP
  83. };
  84. void CXTPSkinObjectMenu::OnDraw(CDC* pDC)
  85. {
  86. /*NONCLIENTMETRICS nm;
  87. ::ZeroMemory(&nm, sizeof(NONCLIENTMETRICS));
  88. nm.cbSize = sizeof(NONCLIENTMETRICS);
  89. VERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS,
  90. sizeof(NONCLIENTMETRICS), &nm, 0));
  91. CFont fnt;
  92. fnt.CreateFontIndirect(&nm.lfMenuFont);
  93. CXTPFontDC fntDc(pDC, &fnt);
  94. TEXTMETRIC tm;
  95. pDC->GetTextMetrics(&tm);
  96. CXTPClientRect rc(this);
  97. pDC->FillSolidRect(rc, GetColor(COLOR_MENU));
  98. pDC->SetBkMode(TRANSPARENT);
  99. HMENU hMenu = (HMENU)SendMessage(MN_GETHMENU);
  100. if (!hMenu)
  101. return;
  102. int nCount = GetMenuItemCount(hMenu);
  103. int y = 0;
  104. int x = 0;
  105. for (int i = 0; i < nCount; i++)
  106. {
  107. MENUITEMINFO98 info = { sizeof(MENUITEMINFO98), MIIM_TYPE | MIIM_STATE | MIIM_BITMAP};
  108. ::GetMenuItemInfo(hMenu, i, TRUE, (MENUITEMINFO*)&info);
  109. if ((info.fType & MFT_SEPARATOR) == MFT_SEPARATOR)
  110. {
  111. int nHeight = GetSystemMetrics(SM_CYMENUSIZE) / 2;
  112. int yT = y + (nHeight / 2) - 1;
  113. RECT rcItem;
  114. rcItem.left     = x + 1;
  115. rcItem.top      = yT;
  116. rcItem.right    = rc.right - 1;
  117. rcItem.bottom   = yT + GetSystemMetrics(SM_CYEDGE);
  118. DrawEdge(pDC->GetSafeHdc(), &rcItem, BDR_SUNKENOUTER, BF_TOP | BF_BOTTOM);
  119. y += nHeight;
  120. }
  121. else
  122. {
  123. int nHeight = 0;
  124. nHeight = max(nHeight, tm.tmHeight + tm.tmExternalLeading + GetSystemMetrics(SM_CYEDGE));
  125. nHeight += 2;
  126. CRect rcItem(0, y, rc.right, y + nHeight);
  127. if (info.fState & MFS_HILITE)
  128. {
  129. pDC->FillSolidRect(rcItem, GetColor(COLOR_HIGHLIGHT));
  130. }
  131. y += nHeight;
  132. }
  133. }*/
  134. CXTPClientRect rc(this);
  135. CXTPBufferDC dc(pDC->GetSafeHdc(), rc);
  136. dc.FillSolidRect(rc, GetColor(COLOR_MENU));
  137. dc.SetBkMode(TRANSPARENT);
  138. DefWindowProc(WM_PRINTCLIENT, (WPARAM)dc.GetSafeHdc(), 0);
  139. //GetMenuBarInfo();
  140. }
  141. void CXTPSkinObjectMenu::OnDrawNonCLient(CDC* pDC)
  142. {
  143. CRect rcBorders = m_rcBorders;
  144. CXTPWindowRect rc(this);
  145. rc.OffsetRect(-rc.TopLeft());
  146. XTPSkinFrameworkDrawFrame(pDC->GetSafeHdc(), rc, 1, GetColor(COLOR_3DSHADOW));
  147. rc.DeflateRect(1, 1);
  148. XTPSkinFrameworkDrawFrame(pDC->GetSafeHdc(), rc, rcBorders.left - 1, GetColor(COLOR_MENU));
  149. }
  150. BOOL CXTPSkinObjectMenu::OnEraseBkgnd(CDC* /*pDC*/)
  151. {
  152. return TRUE;
  153. }
  154. void CXTPSkinObjectMenu::OnNcPaint()
  155. {
  156. CWindowDC dc(this);
  157. OnDrawNonCLient(&dc);
  158. }
  159. LRESULT CXTPSkinObjectMenu::OnPrint(WPARAM wParam, LPARAM lParam)
  160. {
  161. CDC* pDC = CDC::FromHandle((HDC)wParam);
  162. if (lParam & PRF_NONCLIENT)
  163. {
  164. OnDrawNonCLient(pDC);
  165. }
  166. if (lParam & PRF_CLIENT)
  167. {
  168. CPoint pt = pDC->SetWindowOrg(-m_rcBorders.left, -m_rcBorders.top);
  169. OnDraw(pDC);
  170. pDC->SetWindowOrg(pt);
  171. }
  172. return 1;
  173. }
  174. LRESULT CXTPSkinObjectMenu::OnPrintClient(WPARAM wParam, LPARAM /*lParam*/)
  175. {
  176. CDC* pDC = CDC::FromHandle((HDC)wParam);
  177. OnDraw(pDC);
  178. return 1;
  179. }
  180. LRESULT CXTPSkinObjectMenu::OnSelectItem(WPARAM /*wParam*/, LPARAM /*lParam*/)
  181. {
  182. SetRedraw(FALSE);
  183. LRESULT lResult = Default();
  184. SetRedraw(TRUE);
  185. Invalidate(FALSE);
  186. return lResult;
  187. }
  188. LRESULT CXTPSkinObjectMenu::OnKeyDown(WPARAM wParam, LPARAM /*lParam*/)
  189. {
  190. if (wParam == VK_UP || wParam == VK_DOWN)
  191. {
  192. SetRedraw(FALSE);
  193. LRESULT lResult = Default();
  194. if (IsWindow(m_hWnd))
  195. {
  196. SetRedraw(TRUE);
  197. Invalidate(FALSE);
  198. }
  199. return lResult;
  200. }
  201. else
  202. {
  203. return Default();
  204. }
  205. }
  206. LRESULT CXTPSkinObjectMenu::OnChar(WPARAM /*wParam*/, LPARAM /*lParam*/)
  207. {
  208. LRESULT lResult = Default();
  209. if (IsWindow(m_hWnd))
  210. {
  211. Invalidate(FALSE);
  212. }
  213. return lResult;
  214. }