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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinObjectToolBar.cpp: implementation of the CXTPSkinObjectToolBar 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 "XTPSkinObjectToolBar.h"
  23. #include "XTPSkinDrawTools.h"
  24. #include "XTPSkinManager.h"
  25. #ifdef _DEBUG
  26. #undef THIS_FILE
  27. static char THIS_FILE[]=__FILE__;
  28. #define new DEBUG_NEW
  29. #endif
  30. //////////////////////////////////////////////////////////////////////
  31. // Construction/Destruction
  32. //////////////////////////////////////////////////////////////////////
  33. IMPLEMENT_DYNCREATE(CXTPSkinObjectToolBar, CXTPSkinObjectFrame)
  34. CXTPSkinObjectToolBar::CXTPSkinObjectToolBar()
  35. {
  36. m_strClassName = _T("TOOLBAR");
  37. }
  38. CXTPSkinObjectToolBar::~CXTPSkinObjectToolBar()
  39. {
  40. }
  41. BEGIN_MESSAGE_MAP(CXTPSkinObjectToolBar, CXTPSkinObjectFrame)
  42. //{{AFX_MSG_MAP(CXTPSkinObjectToolBar)
  43. ON_WM_PAINT()
  44. //}}AFX_MSG_MAP
  45. END_MESSAGE_MAP()
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CXTPSkinObjectToolBar message handlers
  48. void CXTPSkinObjectToolBar::OnPaint()
  49. {
  50. CXTPSkinObjectPaintDC dc(this); // device context for painting
  51. CRect rcClient;
  52. GetClientRect(&rcClient);
  53. CXTPBufferDC dcMem(dc, rcClient);
  54. dcMem.FillSolidRect(rcClient, GetColor(COLOR_3DFACE));
  55. HFONT hFont = (HFONT)SendMessage(WM_GETFONT);
  56. HFONT hOldFont = (HFONT)::SelectObject(dcMem, hFont);
  57. NMCUSTOMDRAW nm;
  58. ZeroMemory(&nm, sizeof(NMCUSTOMDRAW));
  59. nm.hdc = dcMem.GetSafeHdc();
  60. nm.dwDrawStage = CDDS_PREPAINT;
  61. nm.hdr.code = NM_CUSTOMDRAW;
  62. nm.hdr.hwndFrom = GetSafeHwnd();
  63. nm.hdr.idFrom = GetDlgCtrlID();
  64. nm.rc = rcClient;
  65. GetParent()->SendMessage(WM_NOTIFY, (WPARAM)GetDlgCtrlID(), (LPARAM)&nm);
  66. DrawToolbarH(&dcMem);
  67. ::SelectObject(dcMem, hOldFont);
  68. }
  69. #define HIML_NORMAL 0
  70. #define HIML_HOT 1
  71. #define HIML_DISABLED 2
  72. #define I_IMAGENONE (-2)
  73. HIMAGELIST CXTPSkinObjectToolBar::GetImageList(int iMode, int iIndex)
  74. {
  75. return (HIMAGELIST)SendMessage(iMode == HIML_HOT ? TB_GETHOTIMAGELIST :
  76. iMode == HIML_DISABLED ? TB_GETDISABLEDIMAGELIST : TB_GETIMAGELIST, iIndex, 0);
  77. }
  78. #ifndef BTNS_WHOLEDROPDOWN
  79. #define BTNS_WHOLEDROPDOWN 0x80
  80. #endif
  81. BOOL CXTPSkinObjectToolBar::HasSplitDropDown(LPTBBUTTON ptbb)
  82. {
  83. DWORD dwExStyle = (DWORD)SendMessage(TB_GETEXTENDEDSTYLE);
  84. BOOL fRet = ((dwExStyle & TBSTYLE_EX_DRAWDDARROWS) &&
  85. (ptbb->fsStyle & TBSTYLE_DROPDOWN) &&
  86. !(ptbb->fsStyle & BTNS_WHOLEDROPDOWN));
  87. return fRet;
  88. }
  89. BOOL CXTPSkinObjectToolBar::HasDropDownArrow(LPTBBUTTON ptbb)
  90. {
  91. DWORD dwExStyle = (DWORD)SendMessage(TB_GETEXTENDEDSTYLE);
  92. BOOL fRet = (((dwExStyle & TBSTYLE_EX_DRAWDDARROWS) &&
  93. (ptbb->fsStyle & TBSTYLE_DROPDOWN)) ||
  94.   (ptbb->fsStyle & BTNS_WHOLEDROPDOWN));
  95. return fRet;
  96. }
  97. BOOL CXTPSkinObjectToolBar::HasButtonImage(LPTBBUTTON ptbb)
  98. {
  99. int iImage = ptbb->iBitmap;
  100. if ((GetStyle() & TBSTYLE_LIST) &&
  101. (iImage == I_IMAGENONE) &&
  102. ptbb->fsStyle & TBSTYLE_AUTOSIZE)
  103. {
  104. return FALSE;
  105. }
  106. return TRUE;
  107. }
  108. #define PSDPxax     0x00B8074A
  109. struct XTP_IMAGELISTDRAWPARAMS
  110. {
  111. DWORD       cbSize;
  112. HIMAGELIST  himl;
  113. int         i;
  114. HDC         hdcDst;
  115. int         x;
  116. int         y;
  117. int         cx;
  118. int         cy;
  119. int         xBitmap;        // x offest from the upperleft of bitmap
  120. int         yBitmap;        // y offset from the upperleft of bitmap
  121. COLORREF    rgbBk;
  122. COLORREF    rgbFg;
  123. UINT        fStyle;
  124. DWORD       dwRop;
  125. };
  126. struct XTP_IMAGELISTDRAWPARAMSEX : public XTP_IMAGELISTDRAWPARAMS
  127. {
  128. DWORD       fState;
  129. DWORD       Frame;
  130. COLORREF    crEffect;
  131. };
  132. #define ILS_SATURATE            0x00000004
  133. BOOL CXTPSkinObjectToolBar::IsAlphaImageList(HIMAGELIST himl)
  134. {
  135. if (!GetSkinManager()->IsComCtlV6())
  136. return FALSE;
  137. IMAGEINFO ii;
  138. if (!ImageList_GetImageInfo(himl, 0, &ii))
  139. return FALSE;
  140. BITMAP bmp;
  141. GetObject(ii.hbmImage, sizeof(bmp), &bmp);
  142. if (bmp.bmBitsPixel != 32)
  143. return FALSE;
  144. COLORREF clr = ImageList_GetBkColor(himl);
  145. return clr == 0xFFFFFFFF;
  146. }
  147. void CXTPSkinObjectToolBar::DrawButtonImage(CDC* pDC, int x, int y, int nIndex)
  148. {
  149. CToolBarCtrl* pToolBar = (CToolBarCtrl*)this;
  150. TBBUTTON tbb;
  151. pToolBar->GetButton(nIndex, &tbb);
  152. int state = tbb.fsState;
  153. int nHot = (int)pToolBar->SendMessage(TB_GETHOTITEM);
  154. BOOL fHotTrack = nHot == nIndex;
  155. int iIndex = 0;
  156. int iImage = tbb.iBitmap;
  157. HIMAGELIST himl = 0;
  158. BOOL bMonoBitmap = FALSE;
  159. if (fHotTrack || (state & TBSTATE_CHECKED))
  160. {
  161. himl   = GetImageList(HIML_HOT, iIndex);
  162. }
  163. else if (!(state & TBSTATE_ENABLED))
  164. {
  165. himl = GetImageList(HIML_DISABLED, iIndex);
  166. bMonoBitmap = himl == NULL;
  167. }
  168. if (!himl)
  169. {
  170. himl = GetImageList(HIML_NORMAL, iIndex);
  171. }
  172. if (himl && (iImage != -1))
  173. {
  174. if (bMonoBitmap && IsAlphaImageList(himl))
  175. {
  176. XTP_IMAGELISTDRAWPARAMSEX imldp;
  177. imldp.himl = himl;
  178. imldp.cbSize = sizeof(imldp);
  179. imldp.i      = iImage;
  180. imldp.hdcDst = pDC->GetSafeHdc();
  181. imldp.x      = x;
  182. imldp.y      = y;
  183. imldp.cx     = 0;
  184. imldp.cy     = 0;
  185. imldp.xBitmap= 0;
  186. imldp.yBitmap= 0;
  187. imldp.rgbBk  = GetColor(COLOR_3DFACE);
  188. imldp.rgbFg  = CLR_DEFAULT;
  189. imldp.fStyle = ILD_TRANSPARENT;
  190. imldp.fState = ILS_SATURATE;
  191. imldp.Frame = 0;
  192. imldp.crEffect = 0;
  193. ImageList_DrawIndirect((IMAGELISTDRAWPARAMS*)&imldp);
  194. }
  195. else if (bMonoBitmap)
  196. {
  197. int iDxBitmap, iDyBitmap;
  198. ImageList_GetIconSize(himl, &iDxBitmap, &iDyBitmap);
  199. CDC dcMono;
  200. dcMono.CreateCompatibleDC(pDC);
  201. CBitmap bmp;
  202. bmp.Attach(CreateBitmap(iDxBitmap + 1, iDyBitmap + 1, 1, 1, 0));
  203. CBitmap* pOldBitmap = dcMono.SelectObject(&bmp);
  204. dcMono.SetTextColor(0L);
  205. XTP_IMAGELISTDRAWPARAMS imldp;
  206. PatBlt(dcMono, 0, 0, iDxBitmap + 1, iDyBitmap + 1, WHITENESS);
  207. imldp.cbSize = sizeof(imldp);
  208. imldp.himl   = himl;
  209. imldp.i      = iImage;
  210. imldp.hdcDst = dcMono.GetSafeHdc();
  211. imldp.x      = 0;
  212. imldp.y      = 0;
  213. imldp.cx     = 0;
  214. imldp.cy     = 0;
  215. imldp.xBitmap= 0;
  216. imldp.yBitmap= 0;
  217. imldp.rgbBk  = GetColor(COLOR_BTNFACE);
  218. imldp.rgbFg  = CLR_DEFAULT;
  219. imldp.fStyle = ILD_ROP | ILD_MASK;
  220. imldp.dwRop  = SRCCOPY;
  221. ImageList_DrawIndirect((IMAGELISTDRAWPARAMS*)&imldp);
  222. imldp.fStyle = ILD_ROP | ILD_IMAGE;
  223. imldp.rgbBk  = GetColor(COLOR_3DHILIGHT);
  224. imldp.dwRop  = SRCPAINT;
  225. ImageList_DrawIndirect((IMAGELISTDRAWPARAMS*)&imldp);
  226. pDC->SetTextColor(0L);
  227. pDC->SetBkColor(0x00FFFFFF);
  228. HBRUSH hbrOld = (HBRUSH)SelectObject(pDC->GetSafeHdc(), GetMetrics()->m_brTheme[COLOR_3DHILIGHT]);
  229. BitBlt(pDC->GetSafeHdc(), x + 1, y + 1, iDxBitmap, iDyBitmap, dcMono, 0, 0, PSDPxax);
  230. SelectObject(pDC->GetSafeHdc(), hbrOld);
  231. hbrOld = (HBRUSH)SelectObject(pDC->GetSafeHdc(), GetMetrics()->m_brTheme[COLOR_BTNSHADOW]);
  232. BitBlt(pDC->GetSafeHdc(), x, y, iDxBitmap, iDyBitmap, dcMono, 0, 0, PSDPxax);
  233. SelectObject(pDC->GetSafeHdc(), hbrOld);
  234. dcMono.SelectObject(pOldBitmap);
  235. }
  236. else
  237. {
  238. XTP_IMAGELISTDRAWPARAMS imldp;
  239. imldp.himl = himl;
  240. imldp.cbSize = sizeof(imldp);
  241. imldp.i      = iImage;
  242. imldp.hdcDst = pDC->GetSafeHdc();
  243. imldp.x      = x;
  244. imldp.y      = y;
  245. imldp.cx     = 0;
  246. imldp.cy     = 0;
  247. imldp.xBitmap= 0;
  248. imldp.yBitmap= 0;
  249. imldp.rgbBk  = GetColor(COLOR_3DFACE);
  250. imldp.rgbFg  = CLR_DEFAULT;
  251. imldp.fStyle = ILD_TRANSPARENT;
  252. ImageList_DrawIndirect((IMAGELISTDRAWPARAMS*)&imldp);
  253. }
  254. }
  255. }
  256. void CXTPSkinObjectToolBar::DrawButton(CDC* pDC, int nIndex)
  257. {
  258. CToolBarCtrl* pToolBar = (CToolBarCtrl*)this;
  259. TBBUTTON tbb;
  260. pToolBar->GetButton(nIndex, &tbb);
  261. int state = tbb.fsState;
  262. CRect rc;
  263. if (!pToolBar->GetItemRect(nIndex, rc))
  264. return;
  265. int dxText = rc.Width() - (3 * GetMetrics()->m_cxEdge);
  266. int dyText = rc.Height() - (2 * GetMetrics()->m_cyEdge);
  267. int dxFace = rc.Width()  - (2 * GetMetrics()->m_cxEdge);
  268. //int dyFace = rc.Height() - (2 * GetMetrics()->m_cyEdge);
  269. int x = rc.left + GetMetrics()->m_cxEdge;
  270. int y = rc.top + GetMetrics()->m_cyEdge;
  271. if (HasDropDownArrow(&tbb))
  272. {
  273. int iAdjust = 5;
  274. dxFace -= iAdjust;
  275. dxText -= iAdjust;
  276. }
  277. BOOL bSplit = HasSplitDropDown(&tbb);
  278. int cxMenuCheck = bSplit ? GetSystemMetrics(SM_CYMENUCHECK) : 0;
  279. LRESULT lPad = SendMessage(TB_GETPADDING);
  280. int yPad = HIWORD(lPad);
  281. int xPad = LOWORD(lPad);
  282. int yOffset = (yPad - (2 * GetMetrics()->m_cyEdge)) / 2;
  283. if (yOffset < 0)
  284. yOffset = 0;
  285. HIMAGELIST himl = GetImageList(HIML_NORMAL, 0);
  286. int iDxBitmap = 16, iDyBitmap = 16;
  287. if (himl)
  288. {
  289. ImageList_GetIconSize(himl, &iDxBitmap, &iDyBitmap);
  290. }
  291. int xCenterOffset =  (dxFace - iDxBitmap) / 2;
  292. if (GetStyle() & TBSTYLE_LIST)
  293. {
  294. xCenterOffset = xPad / 2;
  295. }
  296. else if (bSplit)
  297. {
  298. xCenterOffset = (dxFace + GetMetrics()->m_cxEdge * 2 - (iDxBitmap + cxMenuCheck)) / 2;
  299. }
  300. if (state & (TBSTATE_PRESSED | TBSTATE_CHECKED))
  301. {
  302. xCenterOffset++;
  303. }
  304. CXTPSkinManagerClass* pClass = GetSkinClass();
  305. int nHot = (int)pToolBar->SendMessage(TB_GETHOTITEM);
  306. BOOL bPressed = tbb.fsState & TBSTATE_PRESSED;
  307. BOOL fHotTrack = nHot == nIndex;
  308. BOOL bChecked = tbb.fsState & TBSTATE_CHECKED;
  309. BOOL bEnabled = tbb.fsState & TBSTATE_ENABLED;
  310. if (bSplit)
  311. {
  312. CRect rcSplit(rc), rcSplitDropDown(rc);
  313. rcSplit.right -= cxMenuCheck;
  314. rcSplitDropDown.left = rcSplit.right;
  315. pClass->DrawThemeBackground(pDC, TP_SPLITBUTTON, !bEnabled ? TS_DISABLED :
  316. bPressed ? TS_PRESSED : bChecked ? TS_CHECKED : fHotTrack ? TS_HOT : TS_NORMAL, &rcSplit);
  317. pClass->DrawThemeBackground(pDC, TP_SPLITBUTTONDROPDOWN, !bEnabled ? TS_DISABLED :
  318. bPressed ? TS_PRESSED : bChecked ? TS_CHECKED : fHotTrack ? TS_HOT : TS_NORMAL, &rcSplitDropDown);
  319. }
  320. else
  321. {
  322. pClass->DrawThemeBackground(pDC, TP_BUTTON, !bEnabled ? TS_DISABLED :
  323. bPressed ? TS_PRESSED : bChecked ? TS_CHECKED : fHotTrack ? TS_HOT : TS_NORMAL, &rc);
  324. }
  325. BOOL fImage = HasButtonImage(&tbb);
  326. if (fImage)
  327. {
  328. DrawButtonImage(pDC, x + xCenterOffset, y + yOffset, nIndex);
  329. }
  330. CString strText;
  331. SendMessage(TB_GETBUTTONTEXT, tbb.idCommand, (LPARAM)(LPTSTR)strText.GetBuffer(256));
  332. strText.ReleaseBuffer();
  333. #ifdef _UNICODE
  334. if (strText.IsEmpty() && (int)SendMessage(WM_NOTIFYFORMAT, 0, NF_QUERY) == NFR_ANSI)
  335. {
  336. char tText[256];
  337. tText[0] = 0;
  338. SendMessage(TB_GETBUTTONTEXTA, tbb.idCommand, (LPARAM)tText);
  339. strText = tText;
  340. }
  341. #endif
  342. if (!strText.IsEmpty())
  343. {
  344. if (state & (TBSTATE_PRESSED | TBSTATE_CHECKED))
  345. {
  346. x++;
  347. if (GetStyle() & TBSTYLE_LIST)
  348. y++;
  349. }
  350. if (GetStyle() & TBSTYLE_LIST)
  351. {
  352. int iListGap = (GetMetrics()->m_cxEdge * 2);
  353. if (fImage)
  354. {
  355. x += iDxBitmap + iListGap;
  356. dxText -= iDxBitmap + iListGap;
  357. }
  358. else
  359. {
  360. x += GetMetrics()->m_cxEdge;
  361. }
  362. }
  363. else
  364. {
  365. y += yOffset + iDyBitmap;
  366. dyText -= yOffset + iDyBitmap;
  367. }
  368. DWORD uiStyle = DT_END_ELLIPSIS;
  369. int nTextRows = (int)SendMessage(TB_GETTEXTROWS);
  370. if (nTextRows > 1)
  371. uiStyle |= DT_WORDBREAK | DT_EDITCONTROL;
  372. else
  373. uiStyle |= DT_SINGLELINE;
  374. if (GetStyle() & TBSTYLE_LIST)
  375. {
  376. uiStyle |= DT_LEFT | DT_VCENTER | DT_SINGLELINE;
  377. }
  378. else
  379. {
  380. uiStyle |= DT_CENTER;
  381. }
  382. pDC->SetBkMode(TRANSPARENT);
  383. pDC->SetTextColor(bEnabled ? GetColor(COLOR_BTNTEXT) :
  384. GetColor(COLOR_BTNSHADOW));
  385. CRect rcText(x + 1, y + 1, x + 1 + dxText, y + 1 + dyText);
  386. pDC->DrawText(strText, rcText, uiStyle);
  387. }
  388. if (!bSplit && HasDropDownArrow(&tbb))
  389. {
  390. CPoint pt(rc.right - 6, rc.CenterPoint().y);
  391. if (bPressed)
  392. pt.Offset(1, 1);
  393. CXTPDrawHelpers::Triangle(pDC, CPoint(pt.x - 2, pt.y - 1), CPoint(pt.x + 2, pt.y - 1), CPoint(pt.x, pt.y + 1), GetColor(COLOR_BTNTEXT));
  394. }
  395. }
  396. void CXTPSkinObjectToolBar::DrawToolbarH(CDC* pDC)
  397. {
  398. CToolBarCtrl* pToolBar = (CToolBarCtrl*)this;
  399. int nCount = pToolBar->GetButtonCount();
  400. for (int nIndex = 0; nIndex < nCount; nIndex++)
  401. {
  402. TBBUTTON tbb;
  403. if (!pToolBar->GetButton(nIndex, &tbb))
  404. continue;
  405. if (tbb.fsState & TBSTATE_HIDDEN)
  406. continue;
  407. if (tbb.fsStyle & TBSTYLE_SEP)
  408. {
  409. CXTPSkinManagerClass* pClass = GetSkinClass();
  410. CRect rc;
  411. pToolBar->GetItemRect(nIndex, &rc);
  412. pClass->DrawThemeBackground(pDC, TP_SEPARATOR,
  413. 0, &rc);
  414. }
  415. else
  416. {
  417. DrawButton(pDC, nIndex);
  418. }
  419. }
  420. }