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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinDrawTools.cpp
  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/XTPVC80Helpers.h"
  22. #include "Common/XTPImageManager.h"
  23. #include "XTPSkinDrawTools.h"
  24. #include "XTPSkinObject.h"
  25. #include "XTPSkinManager.h"
  26. #ifdef _DEBUG
  27. #undef THIS_FILE
  28. static char THIS_FILE[]=__FILE__;
  29. #define new DEBUG_NEW
  30. #endif
  31. BOOL XTPFillSolidRect(HDC hdc, int x, int y, int cx, int cy, COLORREF clr)
  32. {
  33. COLORREF clrOld = ::SetBkColor(hdc, clr);
  34. ::ExtTextOut(hdc, 0, 0, ETO_OPAQUE, CRect(x, y, x + cx, y + cy), NULL, 0, NULL);
  35. ::SetBkColor(hdc, clrOld);
  36. return TRUE;
  37. }
  38. BOOL XTPFillSolidRect(HDC hdc, LPRECT lprc, COLORREF clr)
  39. {
  40. COLORREF clrOld = ::SetBkColor(hdc, clr);
  41. ::ExtTextOut(hdc, 0, 0, ETO_OPAQUE, lprc, NULL, 0, NULL);
  42. ::SetBkColor(hdc, clrOld);
  43. return TRUE;
  44. }
  45. void XTPFillSolidRect(HDC hdc, int x, int y, int cx, int cy, HBRUSH hBrush)
  46. {
  47. ::FillRect(hdc, CRect(x, y, x + cx, y + cy), hBrush);
  48. }
  49. void AFX_CDECL XTPSkinFrameworkDrawFrame(HDC hdc, LPRECT lprc, int nSize, COLORREF clr)
  50. {
  51. XTPFillSolidRect(hdc, lprc->left, lprc->top, lprc->right - lprc->left - nSize, nSize, clr);
  52. XTPFillSolidRect(hdc, lprc->left, lprc->top, nSize, lprc->bottom - lprc->top - nSize, clr);
  53. XTPFillSolidRect(hdc, lprc->right, lprc->top, -nSize, lprc->bottom - lprc->top, clr);
  54. XTPFillSolidRect(hdc, lprc->left, lprc->bottom, lprc->right - lprc->left, -nSize, clr);
  55. }
  56. void AFX_CDECL XTPSkinFrameworkDrawFrame(HDC hdc, LPRECT lprc, int nSize, HBRUSH hBrush)
  57. {
  58. XTPFillSolidRect(hdc, lprc->left, lprc->top, lprc->right - lprc->left - nSize, nSize, hBrush);
  59. XTPFillSolidRect(hdc, lprc->left, lprc->top, nSize, lprc->bottom - lprc->top - nSize, hBrush);
  60. XTPFillSolidRect(hdc, lprc->right - nSize, lprc->top, nSize, lprc->bottom - lprc->top, hBrush);
  61. XTPFillSolidRect(hdc, lprc->left, lprc->bottom - nSize, lprc->right - lprc->left, nSize, hBrush);
  62. }
  63. DWORD DrawDiagonalLine(
  64. HDC    hdc,
  65. LPRECT lprc,
  66. int    iDirection,
  67. int    iThickness,
  68. UINT   flags,
  69. COLORREF clr)
  70. {
  71. RECT    rc;
  72. LPLONG  py;
  73. int     cx;
  74. int     cy;
  75. int     dx;
  76. int     dy;
  77. LPINT   pc;
  78. CXTPSkinManagerMetrics* pMetrics = XTPSkinManager()->GetMetrics();
  79. if (IsRectEmpty(lprc))
  80. return 0L;
  81. rc = *lprc;
  82. iThickness--;
  83. cy = rc.bottom - rc.top;
  84. cx = rc.right - rc.left;
  85. if (!flags && (cy != cx))
  86. cy -= iThickness * pMetrics->m_cyBorder;
  87. if (cy >= cx)
  88. {
  89. cy /= cx;
  90. pc = &cy;
  91. cx = pMetrics->m_cxBorder;
  92. }
  93. else
  94. {
  95. cx /= cy;
  96. pc = &cx;
  97. cy = pMetrics->m_cyBorder;
  98. }
  99. dx = cx;
  100. dy = iDirection * cy;
  101. *pc = (*pc + iThickness) * pMetrics->m_cyBorder;
  102. rc.right  -= cx;
  103. rc.bottom -= cy;
  104. py = ((iDirection < 0) ? &rc.top : &rc.bottom);
  105. while ((rc.left <= rc.right) && (rc.top <= rc.bottom))
  106. {
  107. if (!(flags & BF_MIDDLE))
  108. {
  109. XTPFillSolidRect(hdc, rc.left, *py, cx, cy, clr);
  110. }
  111. else
  112. {
  113. if (cy > pMetrics->m_cyBorder)
  114. {
  115. if (flags & BF_LEFT)
  116. XTPFillSolidRect(hdc, rc.left, lprc->top, cx, *py - lprc->top + cy, clr);
  117. else
  118. XTPFillSolidRect(hdc, rc.left, *py, cx, lprc->bottom - *py, clr);
  119. }
  120. else
  121. {
  122. if (flags & BF_TOP)
  123. XTPFillSolidRect(hdc, rc.left, *py, lprc->right - rc.left, cy, clr);
  124. else
  125. XTPFillSolidRect(hdc, lprc->left, *py, rc.left - lprc->left + cx, cy, clr);
  126. }
  127. }
  128. rc.left += dx;
  129. *py     -= dy;
  130. }
  131. return MAKELONG(cx, cy);
  132. }
  133. BOOL DrawDiagonal(HDC hdc, LPRECT lprc, COLORREF clrTopLeft, COLORREF clrBottomRight, UINT flags)
  134. {
  135. int nDirection = 1;
  136. switch (flags & (BF_RECT | BF_DIAGONAL))
  137. {
  138. case BF_DIAGONAL_ENDTOPLEFT:
  139. case BF_DIAGONAL_ENDBOTTOMRIGHT:
  140. nDirection = -1;
  141. break;
  142. }
  143. DWORD dAdjust = DrawDiagonalLine(hdc, lprc, nDirection, 1, (flags & ~BF_MIDDLE),
  144. ((flags & BF_BOTTOM) ? clrBottomRight : clrTopLeft));
  145. if (flags & BF_TOP)
  146. lprc->left += LOWORD(dAdjust);
  147. else
  148. lprc->right -= LOWORD(dAdjust);
  149. if (flags & BF_RIGHT)
  150. lprc->top += HIWORD(dAdjust);
  151. else
  152. lprc->bottom -= HIWORD(dAdjust);
  153. return TRUE;
  154. }
  155. #ifndef BDR_OUTER
  156. #define BDR_OUTER       0x0003
  157. #endif
  158. #ifndef BDR_INNER
  159. #define BDR_INNER       0x000c
  160. #endif
  161. BOOL WINAPI XTRSkinFrameworkDrawEdge(HDC hdc, LPRECT lprc, UINT edge, UINT flags)
  162. {
  163. COLORREF clrTopLeft;
  164. COLORREF clrBottomRight;
  165. BOOL fResult = TRUE;
  166. if (flags & BF_MONO)
  167. flags |= BF_FLAT;
  168. RECT rc = *lprc;
  169. UINT bdrType = (edge & BDR_OUTER);
  170. CXTPSkinManagerMetrics* pMetrics = XTPSkinManager()->GetMetrics();
  171. if (bdrType)
  172. {
  173. DrawBorder:
  174. if (flags & BF_FLAT)
  175. {
  176. if (flags & BF_MONO)
  177. clrBottomRight = (bdrType & BDR_OUTER) ? pMetrics->GetColor(COLOR_WINDOWFRAME) : pMetrics->GetColor(COLOR_WINDOW);
  178. else
  179. clrBottomRight = (bdrType & BDR_OUTER) ? pMetrics->m_clrEdgeShadow : pMetrics->GetColor(COLOR_3DFACE);
  180. clrTopLeft = clrBottomRight;
  181. }
  182. else
  183. {
  184. switch (bdrType)
  185. {
  186. case BDR_RAISEDOUTER:
  187. clrTopLeft = ((flags & BF_SOFT) ? pMetrics->m_clrEdgeHighLight : pMetrics->GetColor(COLOR_3DLIGHT));
  188. clrBottomRight = pMetrics->m_clrEdgeDkShadow;
  189. break;
  190. case BDR_RAISEDINNER:
  191. clrTopLeft = ((flags & BF_SOFT) ? pMetrics->GetColor(COLOR_3DLIGHT) : pMetrics->m_clrEdgeHighLight);
  192. clrBottomRight = pMetrics->m_clrEdgeShadow;
  193. break;
  194. case BDR_SUNKENOUTER:
  195. clrTopLeft = ((flags & BF_SOFT) ? pMetrics->m_clrEdgeDkShadow : pMetrics->m_clrEdgeShadow);
  196. clrBottomRight = pMetrics->m_clrEdgeHighLight;
  197. break;
  198. case BDR_SUNKENINNER:
  199. clrTopLeft = ((flags & BF_SOFT) ? pMetrics->m_clrEdgeShadow : pMetrics->m_clrEdgeDkShadow);
  200. clrBottomRight = pMetrics->GetColor(COLOR_3DLIGHT);
  201. break;
  202. default:
  203. return FALSE;
  204. }
  205. }
  206. if (flags & BF_DIAGONAL)
  207. {
  208. fResult = DrawDiagonal(hdc, &rc, clrTopLeft, clrBottomRight, flags);
  209. }
  210. else
  211. {
  212. if (flags & BF_RIGHT)
  213. {
  214. rc.right -= pMetrics->m_cxBorder;
  215. XTPFillSolidRect(hdc, rc.right, rc.top, pMetrics->m_cxBorder, rc.bottom - rc.top, clrBottomRight);
  216. }
  217. if (flags & BF_BOTTOM)
  218. {
  219. rc.bottom -= pMetrics->m_cyBorder;
  220. XTPFillSolidRect(hdc, rc.left, rc.bottom,  rc.right - rc.left, pMetrics->m_cyBorder, clrBottomRight);
  221. }
  222. if (flags & BF_LEFT)
  223. {
  224. XTPFillSolidRect(hdc, rc.left, rc.top, pMetrics->m_cxBorder, rc.bottom - rc.top, clrTopLeft);
  225. rc.left += pMetrics->m_cxBorder;
  226. }
  227. if (flags & BF_TOP)
  228. {
  229. XTPFillSolidRect(hdc, rc.left, rc.top, rc.right - rc.left, pMetrics->m_cyBorder, clrTopLeft);
  230. rc.top += pMetrics->m_cyBorder;
  231. }
  232. fResult = TRUE;
  233. }
  234. }
  235. bdrType = (edge & BDR_INNER);
  236. if (bdrType)
  237. {
  238. edge &= ~BDR_INNER;
  239. goto DrawBorder;
  240. }
  241. if (flags & BF_MIDDLE)
  242. {
  243. if (flags & BF_DIAGONAL)
  244. fResult = FALSE; // TODO!
  245. else
  246. fResult = XTPFillSolidRect(hdc, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, ((flags & BF_MONO) ? pMetrics->GetColor(COLOR_WINDOW) : pMetrics->GetColor(COLOR_3DFACE)));
  247. }
  248. if (flags & BF_ADJUST)
  249. *lprc = rc;
  250. return fResult;
  251. }
  252. int AFX_CDECL XTPGetParentDCClipBox(HWND   pwnd, HDC    hdc, LPRECT lprc)
  253. {
  254. if (GetClipBox(hdc, lprc) == NULLREGION)
  255. return FALSE;
  256. if ((GetClassLongPtr(pwnd, GCL_STYLE) & CS_PARENTDC) == 0)
  257. return TRUE;
  258. RECT rc;
  259. ::GetClientRect(pwnd, &rc);
  260. return IntersectRect(lprc, lprc, &rc);
  261. }
  262. BOOL WINAPI XTRSkinFrameworkDrawFrameControl(HDC hdc, LPRECT lprc,  UINT uType,  UINT uState)
  263. {
  264. CXTPSkinManager* pManager = XTPSkinManager();
  265. if (uType == DFC_SCROLL && uState == DFCS_SCROLLSIZEGRIP)
  266. {
  267. XTPFillSolidRect(hdc, lprc, pManager->GetMetrics()->GetColor(COLOR_3DFACE));
  268. CXTPSkinManagerClass* pClassScrollBar = pManager->GetSkinClass(_T("SCROLLBAR"));
  269. pClassScrollBar->DrawThemeBackground(CDC::FromHandle(hdc), SBP_SIZEBOX, SZB_RIGHTALIGN, lprc);
  270. return TRUE;
  271. }
  272. int nType = uState & 0xF;
  273. if (uType == DFC_BUTTON && ((uState | DFCS_PUSHED | BF_ADJUST)  == (DFCS_BUTTONPUSH | DFCS_PUSHED | BF_ADJUST)))
  274. {
  275. RECT rc = *lprc;
  276. XTRSkinFrameworkDrawEdge(hdc, &rc,
  277. (uState & (DFCS_PUSHED | DFCS_CHECKED)) ? EDGE_SUNKEN : EDGE_RAISED,
  278. (UINT)(BF_ADJUST | BF_RECT));
  279. XTPFillSolidRect(hdc, &rc,  pManager->GetMetrics()->GetColor(COLOR_3DFACE));
  280. if (uState & BF_ADJUST)
  281. *lprc = rc;
  282. return TRUE;
  283. }
  284. if ((uType == DFC_SCROLL) && (nType == DFCS_SCROLLLEFT || nType == DFCS_SCROLLRIGHT ||
  285. nType == DFCS_SCROLLUP ||  nType == DFCS_SCROLLDOWN))
  286. {
  287. int nState = 1;
  288. if (uState & DFCS_PUSHED) nState = 3;
  289. if (uState & DFCS_INACTIVE) nState = 4;
  290. CXTPSkinManagerClass* pClassScrollBar = pManager->GetSkinClass(_T("SCROLLBAR"));
  291. pClassScrollBar->DrawThemeBackground(CDC::FromHandle(hdc), SBP_ARROWBTN, nType * 4 + nState, lprc);
  292. return TRUE;
  293. }
  294. return FALSE;
  295. }
  296. void AFX_CDECL XTPSkinFrameworkGetIconSize(HICON hImage, int* pcx, int* pcy)
  297. {
  298. *pcx = 32;
  299. *pcy = 32;
  300. ICONINFO iconInfo;
  301. if (!GetIconInfo(hImage, &iconInfo))
  302. return;
  303. BITMAP bm;
  304. if (!GetObject(iconInfo.hbmMask, sizeof(BITMAP), &bm))
  305. return;
  306. *pcx = bm.bmWidth;
  307. *pcy = bm.bmHeight;
  308. if (!iconInfo.hbmColor)
  309. {
  310. *pcy /= 2;
  311. }
  312. if (iconInfo.hbmColor) DeleteObject(iconInfo.hbmColor);
  313. if (iconInfo.hbmMask) DeleteObject(iconInfo.hbmMask);
  314. }
  315. HPALETTE XTPSkinFrameworkCreatePaletteFromDIBitmap(LPBITMAPINFO pbmi)
  316. {
  317. DWORD nNumColors = pbmi->bmiHeader.biClrUsed;
  318. if (!nNumColors && pbmi->bmiHeader.biBitCount <= 8)
  319. nNumColors = 1 << pbmi->bmiHeader.biBitCount;
  320. if (!nNumColors)
  321. return NULL;
  322. PLOGPALETTE pLogPalette = (PLOGPALETTE)malloc(sizeof(LOGPALETTE) + nNumColors * sizeof(PALETTEENTRY));
  323. if (!pLogPalette)
  324. return NULL;
  325. pLogPalette->palNumEntries = (WORD)nNumColors;
  326. pLogPalette->palVersion = 0x300;
  327. for (WORD i = 0; i < nNumColors; i++)
  328. {
  329. pLogPalette->palPalEntry[i].peBlue = pbmi->bmiColors[i].rgbBlue;
  330. pLogPalette->palPalEntry[i].peRed = pbmi->bmiColors[i].rgbRed;
  331. pLogPalette->palPalEntry[i].peGreen = pbmi->bmiColors[i].rgbGreen;
  332. pLogPalette->palPalEntry[i].peFlags = 0;
  333. }
  334. HPALETTE hPalette = CreatePalette(pLogPalette);
  335. free(pLogPalette);
  336. return hPalette;
  337. }
  338. HBITMAP XTPSkinFrameworkCreateDDBFromPackedDIBitmap(LPBITMAPINFO pbmi, HPALETTE hPalette)
  339. {
  340. // Find out how big the bmiColors is
  341. int nNumColors = (int)pbmi->bmiHeader.biClrUsed;
  342. if (!nNumColors && pbmi->bmiHeader.biBitCount <= 8)
  343. nNumColors = 1 << pbmi->bmiHeader.biBitCount;
  344. LPVOID lpBits = &pbmi->bmiColors[nNumColors];
  345. HDC hDC = GetDC(NULL);
  346. HPALETTE hOldPal = SelectPalette(hDC, hPalette, FALSE);
  347. HBITMAP hBitmap = CreateDIBitmap(hDC, &pbmi->bmiHeader, CBM_INIT, lpBits, pbmi, DIB_RGB_COLORS);
  348. SelectPalette(hDC, hOldPal, FALSE);
  349. ReleaseDC(NULL, hDC);
  350. return hBitmap;
  351. }
  352. HBITMAP AFX_CDECL XTPSkinFrameworkLoadBitmap(HMODULE hModule, LPCTSTR lpszResourceName, BOOL& bAlpha)
  353. {
  354. if (CXTPImageManagerIcon::IsPngBitmapResource(hModule, lpszResourceName))
  355. {
  356. return CXTPImageManagerIcon::LoadBitmapFromResource(hModule, lpszResourceName, &bAlpha);
  357. }
  358. #define BitmapWidth(cx, bpp)  (((((cx) * (bpp)) + 31) & ~31) >> 3)
  359. HRSRC hResource = FindResource(hModule, lpszResourceName, RT_BITMAP);
  360. if (hResource == NULL)
  361. return NULL;
  362. HGLOBAL hGlobal = LoadResource(hModule, hResource);
  363. if (hGlobal == NULL)
  364. return NULL;
  365. LPBITMAPINFO pResourceInfo = (LPBITMAPINFO)::LockResource(hGlobal);
  366. if (!pResourceInfo)
  367. return NULL;
  368. int biSizeImage = BitmapWidth(pResourceInfo->bmiHeader.biWidth,
  369. pResourceInfo->bmiHeader.biBitCount) * pResourceInfo->bmiHeader.biHeight;
  370. bAlpha = pResourceInfo->bmiHeader.biBitCount == 32;
  371. HBITMAP hbmResult = NULL;
  372. if (SizeofResource(hModule, hResource) >= int(biSizeImage + sizeof(BITMAPINFOHEADER)))
  373. {
  374. CDC dcSrc;
  375. dcSrc.CreateCompatibleDC(NULL);
  376. if (pResourceInfo->bmiHeader.biBitCount >= 24)
  377. {
  378. PBITMAPINFO pBitmapInfo = (PBITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + sizeof(COLORREF) * 3);
  379. ASSERT(pBitmapInfo != NULL);
  380. if (!pBitmapInfo)
  381. return NULL;
  382. MEMCPY_S(pBitmapInfo, &pResourceInfo->bmiHeader, sizeof(BITMAPINFOHEADER));
  383. pBitmapInfo->bmiHeader.biSizeImage = biSizeImage;
  384. BYTE* pDestBits = NULL;
  385. HBITMAP hBmp = CreateDIBSection(dcSrc, pBitmapInfo, DIB_RGB_COLORS, (void**)&pDestBits, NULL, 0);
  386. if (hBmp && pDestBits)
  387. {
  388. MEMCPY_S(pDestBits, &pResourceInfo->bmiColors, biSizeImage);
  389. hbmResult = hBmp;
  390. }
  391. free(pBitmapInfo);
  392. }
  393. else
  394. {
  395. HPALETTE hPalette = XTPSkinFrameworkCreatePaletteFromDIBitmap(pResourceInfo);
  396. hbmResult = XTPSkinFrameworkCreateDDBFromPackedDIBitmap(pResourceInfo, hPalette);
  397. if (hPalette)
  398. {
  399. DeleteObject(hPalette);
  400. }
  401. }
  402. }
  403. UnlockResource(hGlobal);
  404. FreeResource(hGlobal);
  405. return hbmResult ;
  406. }