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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinImage.cpp: implementation of the CXTPSkinImage 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/XTPImageManager.h"
  22. #include "Common/XTPColorManager.h"
  23. #include "Common/XTPDrawHelpers.h"
  24. #include "Common/tmschema.h"
  25. #include "Common/XTPVC80Helpers.h"
  26. #include "XTPSkinImage.h"
  27. #include "XTPSkinManagerResource.h"
  28. #include "XTPSkinManager.h"
  29. #include "XTPSkinDrawTools.h"
  30. #ifdef _DEBUG
  31. #undef THIS_FILE
  32. static char THIS_FILE[]=__FILE__;
  33. #define new DEBUG_NEW
  34. #endif
  35. #define TILE_VERTICAL     1
  36. #define TILE_HORIZONTAL   2
  37. #define TILE_ALL          3
  38. //////////////////////////////////////////////////////////////////////
  39. // CXTPSkinImage
  40. CXTPSkinImage::CXTPSkinImage()
  41. {
  42. m_hBitmap = NULL;
  43. m_bAlpha = FALSE;
  44. m_bFiltered = FALSE;
  45. m_bInvert = FALSE;
  46. m_bMirrorImage = TRUE;
  47. m_bOptimized = FALSE;
  48. }
  49. CXTPSkinImage::~CXTPSkinImage()
  50. {
  51. if (m_hBitmap != NULL)
  52. {
  53. DeleteObject(m_hBitmap);
  54. }
  55. }
  56. void CXTPSkinImage::SetBitmap(HBITMAP hBitmap, BOOL bAlpha /*= FALSE*/)
  57. {
  58. ASSERT(m_hBitmap == NULL);
  59. m_hBitmap = hBitmap;
  60. m_bAlpha = bAlpha;
  61. m_bOptimized = FALSE;
  62. m_arrSolidRects.RemoveAll();
  63. m_szBitmap = _GetExtent();
  64. }
  65. #define FREE(hHandle) if (hHandle) { free(hHandle); hHandle = 0; }
  66. BOOL CXTPSkinImage::CheckBitmapRect(LPBYTE pBits, CRect rcCheck, CSize sz)
  67. {
  68. if (rcCheck.left >= rcCheck.right || rcCheck.top >= rcCheck.bottom)
  69. return FALSE;
  70. BOOL bFirst = TRUE;
  71. COLORREF clrTransparent = COLORREF_NULL;
  72. for (int x = rcCheck.left; x < rcCheck.right; x++)
  73. for (int y = rcCheck.top; y < rcCheck.bottom; y++)
  74. {
  75. COLORREF clr = ((LPDWORD)pBits)[x + (sz.cy - y - 1) * sz.cx];
  76. if (bFirst)
  77. clrTransparent = clr;
  78. else if (clrTransparent != clr)
  79. return FALSE;
  80. bFirst = FALSE;
  81. }
  82. SOLIDRECT sr;
  83. sr.rc = rcCheck;
  84. sr.clr = RGB(GetBValue(clrTransparent), GetGValue(clrTransparent), GetRValue(clrTransparent));
  85. if (m_bAlpha)
  86. sr.clr |= (clrTransparent & 0xFF000000);
  87. m_arrSolidRects.Add(sr);
  88. return TRUE;
  89. }
  90. void CXTPSkinImage::CreateSolidRectArray(int nBitmaps, BOOL bHorizontalImage, const CRect& rcSizingMargins)
  91. {
  92. ASSERT(nBitmaps >= 1);
  93. if (!m_hBitmap || nBitmaps < 1)
  94. return;
  95. if (m_bOptimized || m_bFiltered)
  96. return;
  97. if (nBitmaps == 1)
  98. bHorizontalImage = FALSE;
  99. CSize sz(GetExtent());
  100. m_bOptimized = TRUE;
  101. m_arrSolidRects.RemoveAll();
  102. HBITMAP hbm = NULL;
  103. LPBYTE pBits = NULL;
  104. CDC dcSrc;
  105. dcSrc.CreateCompatibleDC(NULL);
  106. TRY
  107. {
  108. if (!m_bAlpha)
  109. {
  110. hbm = CXTPImageManager::Create32BPPDIBSection(dcSrc, sz.cx, sz.cy, &pBits);
  111. {
  112. CXTPCompatibleDC dc(NULL, hbm);
  113. dc.DrawState(CPoint(0, 0), sz, m_hBitmap, 0, NULL);
  114. }
  115. }
  116. else
  117. {
  118. PBITMAPINFO pBitmapInfo = 0;
  119. UINT nSize;
  120. if (!CXTPImageManagerIcon::GetBitmapBits(dcSrc, m_hBitmap, pBitmapInfo, (LPVOID&)pBits, nSize))
  121. return;
  122. FREE(pBitmapInfo);
  123. }
  124. if (!pBits)
  125. return;
  126. if (!bHorizontalImage)
  127. {
  128. int nSpriteHeight = sz.cy / nBitmaps;
  129. for (int i = 0; i < nBitmaps; i++)
  130. {
  131. CRect rcSprite(0, i * nSpriteHeight, sz.cx, (i + 1) * nSpriteHeight);
  132. if (CheckBitmapRect(pBits, rcSprite, sz))
  133. continue;
  134. if (rcSizingMargins.IsRectNull())
  135. continue;
  136. CheckBitmapRect(pBits, CRect(rcSprite.left, rcSprite.top + rcSizingMargins.top,
  137. rcSprite.left + rcSizingMargins.left, rcSprite.bottom - rcSizingMargins.bottom), sz);
  138. CheckBitmapRect(pBits, CRect(rcSprite.left + rcSizingMargins.left, rcSprite.top,
  139. rcSprite.right - rcSizingMargins.right, rcSprite.top + rcSizingMargins.top), sz);
  140. CheckBitmapRect(pBits, CRect(rcSprite.right - rcSizingMargins.right , rcSprite.top + rcSizingMargins.top,
  141. rcSprite.right, rcSprite.bottom - rcSizingMargins.bottom), sz);
  142. CheckBitmapRect(pBits, CRect(rcSprite.left + rcSizingMargins.left, rcSprite.bottom - rcSizingMargins.bottom,
  143. rcSprite.right - rcSizingMargins.right, rcSprite.bottom), sz);
  144. CheckBitmapRect(pBits, CRect(rcSprite.left + rcSizingMargins.left, rcSprite.top + rcSizingMargins.top,
  145. rcSprite.right - rcSizingMargins.right, rcSprite.bottom - rcSizingMargins.bottom), sz);
  146. }
  147. }
  148. }
  149. CATCH (CMemoryException, e)
  150. {
  151. TRACE(_T("Failed -- Memory exception thrown."));
  152. }
  153. END_CATCH
  154. if (hbm && !m_bAlpha)
  155. {
  156. DeleteObject(hbm);
  157. }
  158. if (m_bAlpha)
  159. {
  160. FREE(pBits);
  161. }
  162. m_bOptimized = TRUE;
  163. }
  164. void CXTPSkinImage::FilterImage(COLORREF clrTransparent)
  165. {
  166. if (!m_hBitmap || m_bFiltered)
  167. return;
  168. m_bFiltered = TRUE;
  169. CXTPSkinManager* pManager =  XTPSkinManager();
  170. if (!pManager->IsColorFilterExists())
  171. return;
  172. CDC dcSrc;
  173. dcSrc.CreateCompatibleDC(NULL);
  174. if (!m_bAlpha)
  175. {
  176. BITMAPINFO bmi;
  177. HBITMAP hbm;
  178. LPBYTE pBits;
  179. BITMAP hbmInfo;
  180. GetObject(m_hBitmap, sizeof(BITMAP), &hbmInfo);
  181. // Initialize header to 0s.
  182. ZeroMemory(&bmi, sizeof(bmi));
  183. // Fill out the fields you care about.
  184. bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  185. bmi.bmiHeader.biWidth = hbmInfo.bmWidth;
  186. bmi.bmiHeader.biHeight = hbmInfo.bmHeight;
  187. bmi.bmiHeader.biPlanes = 1;
  188. bmi.bmiHeader.biBitCount = 32;
  189. bmi.bmiHeader.biCompression = BI_RGB;
  190. // Create the surface.
  191. hbm = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (LPVOID*)&pBits, NULL, 0);
  192. {
  193. CXTPCompatibleDC dc(NULL, hbm);
  194. dc.DrawState(CPoint(0, 0), CSize(hbmInfo.bmWidth, hbmInfo.bmHeight), m_hBitmap, 0, NULL);
  195. }
  196. DeleteObject(m_hBitmap);
  197. m_hBitmap = hbm;
  198. }
  199. PBYTE pBits = 0;
  200. PBITMAPINFO pBitmapInfo = 0;
  201. HBITMAP hBitmapAlpha = 0;
  202. TRY
  203. {
  204. UINT nSize;
  205. if (!CXTPImageManagerIcon::GetBitmapBits(dcSrc, m_hBitmap, pBitmapInfo, (LPVOID&)pBits, nSize))
  206. return;
  207. BYTE* pDest = NULL;
  208. hBitmapAlpha = CreateDIBSection(dcSrc, pBitmapInfo, DIB_RGB_COLORS, (void**)&pDest, NULL, 0);
  209. if (pDest == NULL || hBitmapAlpha == NULL)
  210. AfxThrowMemoryException();
  211. MEMCPY_S(pDest, pBits, nSize);
  212. for (UINT i = 0; i < nSize; i += 4)
  213. {
  214. COLORREF clr = RGB(pDest[i + 2], pDest[i + 1], pDest[i + 0]);
  215. if (clr != clrTransparent)
  216. {
  217. pManager->ApplyColorFilter(clr);
  218. pDest[i + 0] = GetBValue(clr);
  219. pDest[i + 1] = GetGValue(clr);
  220. pDest[i + 2] = GetRValue(clr);
  221. }
  222. }
  223. }
  224. CATCH (CMemoryException, e)
  225. {
  226. TRACE(_T("Failed -- Memory exception thrown."));
  227. }
  228. END_CATCH
  229. FREE(pBits);
  230. FREE(pBitmapInfo);
  231. DeleteObject(m_hBitmap);
  232. m_hBitmap = hBitmapAlpha;
  233. }
  234. BOOL CXTPSkinImage::LoadFile(LPCTSTR lpszFileName)
  235. {
  236. m_bAlpha = FALSE;
  237. BOOL bAlpha = FALSE;
  238. HBITMAP hBmp = CXTPImageManagerIcon::LoadBitmapFromFile(lpszFileName, &bAlpha);
  239. if (!hBmp)
  240. return FALSE;
  241. if (bAlpha)
  242. {
  243. if (XTPSkinManager()->GetSchema()->m_bPreMultiplyImages)
  244. {
  245. m_hBitmap = CXTPImageManagerIcon::PreMultiplyAlphaBitmap(hBmp, &m_bAlpha);
  246. DeleteObject(hBmp);
  247. }
  248. else
  249. {
  250. m_hBitmap = hBmp;
  251. m_bAlpha = TRUE;
  252. }
  253. }
  254. else
  255. {
  256. m_hBitmap = hBmp;
  257. }
  258. m_szBitmap = _GetExtent();
  259. return TRUE;
  260. }
  261. BOOL CXTPSkinImage::LoadFile(HMODULE hModule, LPCTSTR lpszBitmapFileName)
  262. {
  263. if (!hModule)
  264. return FALSE;
  265. m_bAlpha = FALSE;
  266. ASSERT(m_hBitmap == NULL);
  267. BOOL bAlpha = FALSE;
  268. HBITMAP hBmp = XTPSkinFrameworkLoadBitmap(hModule, lpszBitmapFileName, bAlpha);
  269. if (!hBmp)
  270. return FALSE;
  271. if (bAlpha)
  272. {
  273. if (XTPSkinManager()->GetSchema()->m_bPreMultiplyImages)
  274. {
  275. m_hBitmap = CXTPImageManagerIcon::PreMultiplyAlphaBitmap(hBmp, &m_bAlpha);
  276. DeleteObject(hBmp);
  277. }
  278. else
  279. {
  280. m_hBitmap = hBmp;
  281. m_bAlpha = TRUE;
  282. }
  283. }
  284. else
  285. {
  286. m_hBitmap = hBmp;
  287. }
  288. m_szBitmap = _GetExtent();
  289. return m_hBitmap != NULL;
  290. }
  291. BOOL CXTPSkinImage::DrawImagePart(CDC* pDCDest, const CRect& rcDest, CDC* pDCSrc, const CRect& rcSrc) const
  292. {
  293. if (rcDest.Width() <= 0 || rcDest.Height() <= 0 || rcSrc.Width() <= 0 || rcSrc.Height() <= 0)
  294. return TRUE;
  295. BOOL bResult = TRUE;
  296. if (m_bAlpha)
  297. {
  298. bResult = XTPImageManager()->AlphaBlend(pDCDest->GetSafeHdc(), rcDest, pDCSrc->GetSafeHdc(), rcSrc);
  299. }
  300. else if ((rcSrc.Width() == rcDest.Width()) && (rcSrc.Height() == rcDest.Height()))
  301. {
  302. bResult = pDCDest->BitBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
  303. pDCSrc, rcSrc.left, rcSrc.top, SRCCOPY);
  304. }
  305. else
  306. {
  307. bResult = pDCDest->StretchBlt(rcDest.left, rcDest.top, rcDest.Width(), rcDest.Height(),
  308. pDCSrc, rcSrc.left, rcSrc.top, rcSrc.Width(), rcSrc.Height(), SRCCOPY);
  309. }
  310. return bResult;
  311. }
  312. BOOL CXTPSkinImage::DrawImageTile(CDC* pDCDest, const CRect& rcDest, CDC* pDCSrc, const CRect& rcSrc, BOOL bTile) const
  313. {
  314. if (rcDest.Width() <= 0 || rcDest.Height() <= 0 || rcSrc.Width() <= 0 || rcSrc.Height() <= 0)
  315. return TRUE;
  316. SOLIDRECT sr;
  317. if (FindSolidRect(rcSrc, sr))
  318. {
  319. COLORREF clrFilter = sr.clr & 0xFFFFFF;
  320. XTPSkinManager()->ApplyColorFilter(clrFilter);
  321. if (!m_bAlpha)
  322. {
  323. pDCDest->FillSolidRect(rcDest, clrFilter);
  324. return TRUE;
  325. }
  326. else
  327. {
  328. if (sr.clr == 0)
  329. return TRUE;
  330. if ((sr.clr >> 24) == 0xFF)
  331. {
  332. pDCDest->FillSolidRect(rcDest, clrFilter);
  333. return  TRUE;
  334. }
  335. }
  336. }
  337. if (!bTile)
  338. {
  339. return DrawImagePart(pDCDest, rcDest, pDCSrc, rcSrc);
  340. }
  341. if (rcSrc.Width() == 1 && (rcSrc.Height() == 1 || rcSrc.Height() == rcDest.Height()))
  342. {
  343. return DrawImagePart(pDCDest, rcDest, pDCSrc, rcSrc);
  344. }
  345. if (rcSrc.Height() == 1 && (rcSrc.Width() == 1 || rcSrc.Width() == rcDest.Width()))
  346. {
  347. return DrawImagePart(pDCDest, rcDest, pDCSrc, rcSrc);
  348. }
  349. if (rcSrc.right <= rcSrc.left || rcDest.right <= rcDest.left)
  350. return TRUE;
  351. if (rcSrc.bottom <= rcSrc.top || rcDest.bottom <= rcDest.top)
  352. return TRUE;
  353. int nHeight = bTile & TILE_VERTICAL? min(rcSrc.Height(), rcDest.Height()): rcDest.Height();
  354. int nWidth = bTile & TILE_HORIZONTAL? min(rcSrc.Width(), rcDest.Width()): rcDest.Width();
  355. for (int x = rcDest.left; x < rcDest.right; x += nWidth)
  356. {
  357. for (int y = rcDest.top; y < rcDest.bottom; y += nHeight)
  358. {
  359. CRect rcDestTile(x, y, x + nWidth, y + nHeight);
  360. CRect rcSrcTile(rcSrc);
  361. if (bTile & TILE_VERTICAL)
  362. {
  363. if (rcSrcTile.Height() > rcDestTile.Height())
  364. rcSrcTile.bottom = rcSrcTile.top + rcDestTile.Height();
  365. if (rcDestTile.bottom > rcDest.bottom)
  366. {
  367. rcDestTile.bottom = rcDest.bottom;
  368. rcSrcTile.bottom = rcSrcTile.top + rcDestTile.Height();
  369. }
  370. }
  371. if (bTile & TILE_HORIZONTAL)
  372. {
  373. if (rcSrcTile.Width() > rcDestTile.Width())
  374. rcSrcTile.right = rcSrcTile.left + rcDestTile.Width();
  375. if (rcDestTile.right > rcDest.right)
  376. {
  377. rcDestTile.right = rcDest.right;
  378. rcSrcTile.right = rcSrcTile.left + rcDestTile.Width();
  379. }
  380. }
  381. DrawImagePart(pDCDest, rcDestTile, pDCSrc, rcSrcTile);
  382. }
  383. }
  384. return TRUE;
  385. }
  386. BOOL CXTPSkinImage::FindSolidRect(const CRect& rcSrc, SOLIDRECT& sr) const
  387. {
  388. for (int i = 0; i < m_arrSolidRects.GetSize(); i++)
  389. {
  390. sr = m_arrSolidRects[i];
  391. RECT rc;
  392. if (IntersectRect(&rc, &rcSrc, &sr.rc) && rcSrc == rc)
  393. {
  394. return TRUE;
  395. }
  396. }
  397. return FALSE;
  398. }
  399. void CXTPSkinImage::DrawImage(CDC* pDC, const CRect& rcDest, const CRect& rcSrc, const CRect& rcSizingMargins, COLORREF clrTransparent, int nSizingType, BOOL bBorderOnly)
  400. {
  401. if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
  402. return;
  403. SOLIDRECT sr;
  404. if (FindSolidRect(rcSrc, sr))
  405. {
  406. COLORREF clrFilter = sr.clr & 0xFFFFFF;
  407. XTPSkinManager()->ApplyColorFilter(clrFilter);
  408. if (!m_bAlpha)
  409. {
  410. if (clrFilter != clrTransparent)
  411. pDC->FillSolidRect(rcDest, clrFilter);
  412. return;
  413. }
  414. else
  415. {
  416. if (sr.clr == 0)
  417. return;
  418. if ((sr.clr >> 24) == 0xFF)
  419. {
  420. pDC->FillSolidRect(rcDest, clrFilter);
  421. return;
  422. }
  423. }
  424. }
  425. if (clrTransparent == COLORREF_NULL || m_bAlpha)
  426. {
  427. DrawImage(pDC, rcDest, rcSrc, rcSizingMargins, nSizingType, bBorderOnly);
  428. return;
  429. }
  430. FilterImage(clrTransparent);
  431. CBitmap bmp;
  432. bmp.CreateCompatibleBitmap(pDC, rcDest.Width(), rcDest.Height());
  433. CXTPCompatibleDC dc(pDC, &bmp);
  434. CRect rcDestOrig(0, 0, rcDest.Width(), rcDest.Height());
  435. dc.FillSolidRect(rcDestOrig, clrTransparent);
  436. DrawImage(&dc, rcDestOrig, rcSrc, rcSizingMargins, nSizingType, bBorderOnly);
  437. XTPImageManager()->TransparentBlt(*pDC, rcDest, dc, rcDestOrig, clrTransparent);
  438. }
  439. void CXTPSkinImage::InvertBitmap()
  440. {
  441. if (!m_bAlpha)
  442. return;
  443. HBITMAP hBitmap = m_hBitmap;
  444. m_hBitmap = CXTPImageManagerIcon::InvertAlphaBitmap(m_hBitmap);
  445. DeleteObject(hBitmap);
  446. m_bInvert = !m_bInvert;
  447. }
  448. void CXTPSkinImage::DrawImage(CDC* pDC, const CRect& rcDest, const CRect& rcSrc, const CRect& rcSizingMargins, int nSizingType, BOOL bBorderOnly)
  449. {
  450. if (m_hBitmap == NULL)
  451. return;
  452. if (rcSizingMargins.top + rcSizingMargins.bottom > rcSrc.Height())
  453. return;
  454. FilterImage(COLORREF_NULL);
  455. pDC->SetStretchBltMode(COLORONCOLOR);
  456. CRect rcDestSizingMargins = rcSizingMargins;
  457. BOOL bTile = nSizingType == ST_TILE? TILE_ALL: 0;
  458. if (rcDest.left >= rcDest.right || rcDest.top >= rcDest.bottom)
  459. return;
  460. BOOL bRtl = CXTPDrawHelpers::IsContextRTL(pDC);
  461. if (m_bAlpha && m_bMirrorImage)
  462. {
  463. if ((bRtl && !m_bInvert) || (!bRtl && m_bInvert))
  464. {
  465. InvertBitmap();
  466. }
  467. }
  468. CXTPCompatibleDC dcSrc(pDC, m_hBitmap);
  469. if (bRtl && !m_bAlpha && m_bMirrorImage)
  470. {
  471. CXTPDrawHelpers::SetContextRTL(&dcSrc, FALSE);
  472. }
  473. if (rcSizingMargins.IsRectNull())
  474. {
  475. DrawImageTile(pDC, rcDest, &dcSrc, rcSrc, bTile);
  476. return;
  477. }
  478. if ((rcDest.Height() <= rcSizingMargins.top + rcSizingMargins.bottom) || (rcSrc.Height() == rcSizingMargins.top + rcSizingMargins.bottom))
  479. {
  480. rcDestSizingMargins.top = MulDiv(rcDest.Height(), rcSizingMargins.top, (rcSizingMargins.top + rcSizingMargins.bottom));
  481. rcDestSizingMargins.bottom = rcDest.Height() - rcDestSizingMargins.top;
  482. if (rcDestSizingMargins.bottom > 0 && (rcDestSizingMargins.bottom % 2 != rcSizingMargins.bottom % 2))
  483. rcDestSizingMargins.bottom++;
  484. if (bTile) bTile -= TILE_VERTICAL;
  485. }
  486. if ((rcDest.Width() <= rcSizingMargins.left + rcSizingMargins.right) || (rcSrc.Width() == rcSizingMargins.left + rcSizingMargins.right))
  487. {
  488. rcDestSizingMargins.left = MulDiv(rcDest.Width(), rcSizingMargins.left, (rcSizingMargins.left + rcSizingMargins.right));
  489. rcDestSizingMargins.right = rcDest.Width() - rcDestSizingMargins.left;
  490. if (bTile) bTile -= TILE_HORIZONTAL;
  491. }
  492. /*if ((rcDestSizingMargins.top +  rcDestSizingMargins.bottom <
  493. rcSizingMargins.top +  rcSizingMargins.bottom)
  494. && rcDest.Width() < rcSrc.Width() + 3)
  495. {
  496. DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
  497. &dcSrc, CRect(rcSrc.left, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top));
  498. DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
  499. &dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom ));
  500. return;
  501. }*/
  502. DrawImagePart(pDC, CRect(rcDest.left, rcDest.top, rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top),
  503. &dcSrc, CRect(rcSrc.left, rcSrc.top, rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top ));
  504. DrawImageTile(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top, rcDest.right - rcDestSizingMargins.right, rcDest.top + rcDestSizingMargins.top),
  505. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top, rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top ), bTile);
  506. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.top, rcDest.right, rcDest.top + rcDestSizingMargins.top),
  507. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top , rcSrc.right, rcSrc.top + rcSizingMargins.top ));
  508. DrawImageTile(pDC, CRect(rcDest.left, rcDest.top + rcDestSizingMargins.top, rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom),
  509. &dcSrc, CRect(rcSrc.left, rcSrc.top + rcSizingMargins.top , rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom ), bTile);
  510. if (!bBorderOnly)
  511. {
  512. DrawImageTile(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.top + rcDestSizingMargins.top, rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom),
  513. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.top + rcSizingMargins.top , rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom ), bTile);
  514. }
  515. DrawImageTile(pDC, CRect(rcDest.right - rcDestSizingMargins.right , rcDest.top + rcDestSizingMargins.top, rcDest.right, rcDest.bottom - rcDestSizingMargins.bottom),
  516. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.top + rcSizingMargins.top , rcSrc.right, rcSrc.bottom - rcSizingMargins.bottom), bTile);
  517. DrawImagePart(pDC, CRect(rcDest.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.left + rcDestSizingMargins.left, rcDest.bottom),
  518. &dcSrc, CRect(rcSrc.left, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.left + rcSizingMargins.left, rcSrc.bottom ));
  519. DrawImageTile(pDC, CRect(rcDest.left + rcDestSizingMargins.left, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right - rcDestSizingMargins.right, rcDest.bottom),
  520. &dcSrc, CRect(rcSrc.left + rcSizingMargins.left, rcSrc.bottom - rcSizingMargins.bottom  , rcSrc.right - rcSizingMargins.right, rcSrc.bottom ), bTile);
  521. DrawImagePart(pDC, CRect(rcDest.right - rcDestSizingMargins.right, rcDest.bottom - rcDestSizingMargins.bottom, rcDest.right, rcDest.bottom),
  522. &dcSrc, CRect(rcSrc.right - rcSizingMargins.right, rcSrc.bottom - rcSizingMargins.bottom , rcSrc.right, rcSrc.bottom));
  523. }
  524. CSize CXTPSkinImage::GetExtent() const
  525. {
  526. return m_szBitmap;
  527. }
  528. CSize CXTPSkinImage::_GetExtent() const
  529. {
  530. if (!m_hBitmap)
  531. return CSize(0, 0);
  532. BITMAP bmpInfo;
  533. GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
  534. return CSize(bmpInfo.bmWidth, bmpInfo.bmHeight);
  535. }
  536. DWORD CXTPSkinImage::GetHeight() const
  537. {
  538. return m_szBitmap.cy;
  539. }
  540. DWORD CXTPSkinImage::GetWidth() const
  541. {
  542. return m_szBitmap.cx;
  543. }
  544. BOOL CXTPSkinImage::IsAlphaImage() const
  545. {
  546. return m_bAlpha;
  547. }
  548. CRect CXTPSkinImage::GetSource(int nState, int nCount) const
  549. {
  550. CSize szExtent = m_szBitmap;
  551. CRect rcImage(0, 0, szExtent.cx, szExtent.cy / nCount);
  552. rcImage.OffsetRect(0, nState * rcImage.Height());
  553. return rcImage;
  554. }
  555. //////////////////////////////////////////////////////////////////////////
  556. //
  557. CXTPSkinImages::CXTPSkinImages()
  558. {
  559. }
  560. CXTPSkinImages::~CXTPSkinImages()
  561. {
  562. RemoveAll();
  563. }
  564. void CXTPSkinImages::RemoveAll()
  565. {
  566. POSITION pos = m_mapImages.GetStartPosition();
  567. CString strImageFile;
  568. CXTPSkinImage* pImage;
  569. while (pos != NULL)
  570. {
  571. m_mapImages.GetNextAssoc( pos, strImageFile, (void*&)pImage);
  572. delete pImage;
  573. }
  574. m_mapImages.RemoveAll();
  575. }
  576. CXTPSkinImage* CXTPSkinImages::LoadFile(CXTPSkinManagerResourceFile* pResourceFile, LPCTSTR lpszImageFile)
  577. {
  578. if (!pResourceFile)
  579. return NULL;
  580. if (lpszImageFile == NULL)
  581. return NULL;
  582. CXTPSkinImage* pImage = 0;
  583. if (m_mapImages.Lookup(lpszImageFile, (void*&)pImage))
  584. return pImage;
  585. pImage = pResourceFile->LoadImage(lpszImageFile);
  586. if (!pImage)
  587. return NULL;
  588. m_mapImages.SetAt(lpszImageFile, pImage);
  589. return pImage;
  590. }
  591. CSize CXTPSkinImages::GetExtent(CXTPSkinManagerResourceFile* pResourceFile, LPCTSTR lpszImageFile)
  592. {
  593. CXTPSkinImage* pImage = LoadFile(pResourceFile, lpszImageFile);
  594. if (!pImage)
  595. return CSize(0, 0);
  596. return pImage->GetExtent();
  597. }