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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSkinManagerSchema.cpp: implementation of the CXTPSkinManagerSchema 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/Tmschema.h"
  22. #include "Common/XTPVC50Helpers.h"
  23. #include "Common/XTPVC80Helpers.h"
  24. #include "Common/XTPDrawHelpers.h"
  25. #include "XTPSkinManagerSchema.h"
  26. #include "XTPSkinManagerResource.h"
  27. #include "XTPSkinManager.h"
  28. #include "XTPSkinImage.h"
  29. #include "XTPSkinObjectFrame.h"
  30. #include "XTPSkinDrawTools.h"
  31. #ifdef _DEBUG
  32. #undef THIS_FILE
  33. static char THIS_FILE[]=__FILE__;
  34. #define new DEBUG_NEW
  35. #endif
  36. #ifndef OIC_WINLOGO
  37. #define OIC_WINLOGO         32517
  38. #endif
  39. #ifndef LAYOUT_BITMAPORIENTATIONPRESERVED
  40. #define LAYOUT_BITMAPORIENTATIONPRESERVED 0x00000008
  41. #endif
  42. void InflateBorders(CRect& rcBorders, int cxFrame, int cyFrame)
  43. {
  44. rcBorders.left += cxFrame;
  45. rcBorders.right +=  cxFrame;
  46. rcBorders.top += cyFrame;
  47. rcBorders.bottom +=  cyFrame;
  48. }
  49. CXTPSkinManagerSchemaProperty::CXTPSkinManagerSchemaProperty()
  50. {
  51. propType = XTP_SKINPROPERTY_UNKNOWN;
  52. nPropertyCode = 0;
  53. ZeroMemory(&rcVal, sizeof(RECT));
  54. }
  55. CXTPSkinManagerSchemaProperty::~CXTPSkinManagerSchemaProperty()
  56. {
  57. ClearProperty();
  58. }
  59. void CXTPSkinManagerSchemaProperty::ClearProperty()
  60. {
  61. if (propType == XTP_SKINPROPERTY_STRING)
  62. delete[] lpszVal;
  63. if (propType == XTP_SKINPROPERTY_FONT)
  64. delete lfVal;
  65. propType = XTP_SKINPROPERTY_UNKNOWN;
  66. }
  67. void CXTPSkinManagerSchemaProperty::SetPropertyColor(LPCTSTR lpszValue)
  68. {
  69. ClearProperty();
  70. int r = 0, g = 0, b = 0;
  71. SCANF_S(lpszValue, _T("%i %i %i"), &r, &g, &b);
  72. clrVal = RGB(r, g, b);
  73. }
  74. void CXTPSkinManagerSchemaProperty::SetPropertyString(LPCTSTR lpszValue)
  75. {
  76. ClearProperty();
  77. int nLen = (int)_tcslen(lpszValue);
  78. lpszVal = new TCHAR[nLen + 1];
  79. STRCPY_S(lpszVal, nLen + 1, lpszValue);
  80. propType = XTP_SKINPROPERTY_STRING;
  81. }
  82. void CXTPSkinManagerSchemaProperty::SetPropertyBool(LPCTSTR lpszValue)
  83. {
  84. ClearProperty();
  85. bVal = _tcsicmp(lpszValue, _T("TRUE")) == 0;
  86. }
  87. void CXTPSkinManagerSchemaProperty::SetPropertyInt(LPCTSTR lpszValue)
  88. {
  89. ClearProperty();
  90. iVal = _ttoi(lpszValue);
  91. }
  92. void CXTPSkinManagerSchemaProperty::SetPropertyEnum(int nEnumValue)
  93. {
  94. ClearProperty();
  95. iVal = nEnumValue;
  96. }
  97. void CXTPSkinManagerSchemaProperty::SetPropertySize(LPCTSTR lpszValue)
  98. {
  99. ClearProperty();
  100. SCANF_S(lpszValue, _T("%i,%i"), &szVal.cx, &szVal.cy);
  101. }
  102. void CXTPSkinManagerSchemaProperty::SetPropertyRect(LPCTSTR lpszValue)
  103. {
  104. ClearProperty();
  105. SCANF_S(lpszValue, _T("%ld,%ld,%ld,%ld"), &rcVal.left, &rcVal.right, &rcVal.top, &rcVal.bottom);
  106. }
  107. void CXTPSkinManagerSchemaProperty::SetPropertyFont(LPCTSTR lpszValue)
  108. {
  109. ClearProperty();
  110. lfVal = new LOGFONT;
  111. ZeroMemory(lfVal, sizeof(LOGFONT));
  112. CWindowDC dc (NULL);
  113. lfVal->lfCharSet = (BYTE)::GetTextCharsetInfo (dc, NULL, 0);
  114. TCHAR chBold[50];
  115. chBold[0] = 0;
  116. SCANF_S(lpszValue, _T("%[^,], %ld, %s"), SCANF_PARAM_S(lfVal->lfFaceName, LF_FACESIZE), &lfVal->lfHeight, SCANF_PARAM_S(chBold, 50));
  117. lfVal->lfWeight = _tcsicmp(chBold, _T("BOLD")) != 0?  FW_NORMAL: FW_BOLD;
  118. int ppi = dc.GetDeviceCaps(LOGPIXELSY);
  119. lfVal->lfHeight = - MulDiv(lfVal->lfHeight, ppi, 72);
  120. }
  121. BOOL CXTPSkinManagerSchemaProperty::operator==(const CXTPSkinManagerSchemaProperty& prop) const
  122. {
  123. if (&prop == this)
  124. return TRUE;
  125. if (prop.propType != propType)
  126. return FALSE;
  127. switch (propType)
  128. {
  129. case XTP_SKINPROPERTY_COLOR:    return clrVal == prop.clrVal;
  130. case XTP_SKINPROPERTY_STRING:   return _tcsicmp(lpszVal, prop.lpszVal) == 0;
  131. case XTP_SKINPROPERTY_BOOL:     return bVal == prop.bVal;
  132. case XTP_SKINPROPERTY_RECT:     return ::EqualRect(&prop.rcVal, &rcVal);
  133. case XTP_SKINPROPERTY_INT:      return iVal == prop.iVal;
  134. case XTP_SKINPROPERTY_POSITION: return (szVal.cx == prop.szVal.cx) && (szVal.cy == prop.szVal.cy);
  135. case XTP_SKINPROPERTY_ENUM:     return iVal == prop.iVal;
  136. case XTP_SKINPROPERTY_FONT:     return memcmp(lfVal, prop.lfVal, sizeof(LOGFONT)) == 0;
  137. }
  138. return FALSE;
  139. }
  140. //////////////////////////////////////////////////////////////////////
  141. // Construction/Destruction
  142. //////////////////////////////////////////////////////////////////////
  143. CXTPSkinManagerSchema::CXTPSkinManagerSchema(CXTPSkinManager* pManager)
  144. : m_pManager(pManager)
  145. {
  146. m_bPreMultiplyImages = TRUE;
  147. m_nGlobalClassId = GetClassCode(_T("GLOBALS"));
  148. m_nWindowClassId = GetClassCode(_T("WINDOW"));
  149. m_mapProperties.InitHashTable(199, FALSE);
  150. }
  151. CXTPSkinManagerSchema::~CXTPSkinManagerSchema()
  152. {
  153. RemoveAllProperties();
  154. }
  155. void CXTPSkinManagerSchema::RemoveAllProperties()
  156. {
  157. POSITION pos = m_mapProperties.GetStartPosition();
  158. UINT nProperty;
  159. CXTPSkinManagerSchemaProperty* pProperty;
  160. while (pos != NULL)
  161. {
  162. m_mapProperties.GetNextAssoc( pos, nProperty, pProperty);
  163. delete pProperty;
  164. }
  165. m_mapProperties.RemoveAll();
  166. }
  167. UINT CXTPSkinManagerSchema::GetClassCode(LPCTSTR lpszClass)
  168. {
  169. if (_tcsicmp(_T("Globals"), lpszClass) == 0) return 1;
  170. if (_tcsicmp(_T("Documentation"), lpszClass) == 0) return 2;
  171. if (_tcsicmp(_T("SysMetrics"), lpszClass) == 0) return 3;
  172. if (_tcsicmp(_T("ListBox"), lpszClass) == 0) return 4;
  173. if (_tcsicmp(_T("Dialog"), lpszClass) == 0) return 5;
  174. if (_tcsicmp(_T("Menu"), lpszClass) == 0) return 0;
  175. UINT nClass = 5;
  176. #include "XTPSkinManagerSchema.inc"
  177. #undef BEGIN_TM_CLASS_PARTS
  178. #define BEGIN_TM_CLASS_PARTS(name)            nClass++; if (_tcsicmp(_T(#name), lpszClass) == 0) return nClass;
  179. #include "Common/Tmschema.h"
  180. TRACE(_T("Warning: %s class not supported"), lpszClass);
  181. return 0; // Not supported
  182. }
  183. int CXTPSkinManagerSchema::GetEnumCode(LPCTSTR lpszProperty, LPCTSTR lpszValue)
  184. {
  185. #include "XTPSkinManagerSchema.inc"
  186. #undef BEGIN_TM_ENUM
  187. #undef TM_ENUM
  188. #undef END_TM_ENUM
  189. #define BEGIN_TM_ENUM(name)            if (_tcsicmp(_T(#name), lpszProperty) == 0) {
  190. #define TM_ENUM(val, prefix, name)     if (_tcsicmp(_T(#name), lpszValue) == 0) return val;
  191. #define END_TM_ENUM()                      }
  192. #include "Common/Tmschema.h"
  193. return -1;
  194. }
  195. UINT CXTPSkinManagerSchema::GetClassPartCode(LPCTSTR lpszClass, LPCTSTR lpszClassPart)
  196. {
  197. #include "XTPSkinManagerSchema.inc"
  198. #undef BEGIN_TM_CLASS_PARTS
  199. #undef TM_PART
  200. #undef END_TM_CLASS_PARTS
  201. #define BEGIN_TM_CLASS_PARTS(name)          if (_tcsicmp(_T(#name), lpszClass) == 0) {
  202. #define TM_PART(val, prefix, name)          if (_tcsicmp(_T(#name), lpszClassPart) == 0) return val;
  203. #define END_TM_CLASS_PARTS()                }
  204. #include "Common/Tmschema.h"
  205. return 0;
  206. }
  207. UINT CXTPSkinManagerSchema::GetStateCode(LPCTSTR lpszClassPart, LPCTSTR lpszState)
  208. {
  209. #include "XTPSkinManagerSchema.inc"
  210. #undef BEGIN_TM_PART_STATES
  211. #undef TM_STATE
  212. #undef END_TM_PART_STATES
  213. #define BEGIN_TM_PART_STATES(name)          if (_tcsicmp(_T(#name), lpszClassPart) == 0) {
  214. #define TM_STATE(val, prefix, name)         if (_tcsicmp(_T(#name), lpszState) == 0) return val;
  215. #define END_TM_PART_STATES()                }
  216. #include "Common/Tmschema.h"
  217. return 0;
  218. }
  219. UINT CXTPSkinManagerSchema::GetPropertyCode(LPCTSTR lpszProperty, XTPSkinManagerProperty& nPropertyType)
  220. {
  221. #include "XTPSkinManagerSchema.inc"
  222. #undef TM_PROP
  223. #define TM_PROP(val, prefix, name, primval)   if (_tcsicmp(_T(#name), lpszProperty) == 0) { nPropertyType = XTP_SKINPROPERTY_##primval; return val; }
  224. #include "Common/Tmschema.h"
  225. return 0;
  226. }
  227. UINT CXTPSkinManagerSchema::CalculatePropertyCode(UINT iClassId, int iPartId, int iStateId, int iPropId)
  228. {
  229. return iPropId + ((iClassId + ((iPartId + (iStateId << 6 )) << 6)) << 14);
  230. }
  231. UINT CXTPSkinManagerSchema::GetSchemaPartCode(CString strSchemaPart)
  232. {
  233. if (strSchemaPart.Find(_T(':')) != -1)
  234. return 0; // Not Supported;
  235. REMOVE_S(strSchemaPart, _T(' '));
  236. CString strClass, strClassPart, strState;
  237. int nStateIndex = strSchemaPart.Find(_T('('));
  238. if (nStateIndex != -1)
  239. {
  240. strState = strSchemaPart.Mid(nStateIndex + 1, strSchemaPart.GetLength() - nStateIndex - 2);
  241. strSchemaPart = strSchemaPart.Left(nStateIndex);
  242. }
  243. int nClassPartIndex = strSchemaPart.Find(_T('.'));
  244. if (nClassPartIndex != -1)
  245. {
  246. strClass = strSchemaPart.Left(nClassPartIndex);
  247. strClassPart = strSchemaPart.Mid(nClassPartIndex + 1);
  248. }
  249. else
  250. {
  251. strClass = strSchemaPart;
  252. }
  253. int nClassPartCode = 0;
  254. if (!strClassPart.IsEmpty())
  255. {
  256. nClassPartCode = GetClassPartCode(strClass, strClassPart);
  257. if (nClassPartCode == 0)
  258. {
  259. ASSERT(FALSE);
  260. return 0;
  261. }
  262. }
  263. int nStateCode = 0;
  264. if (!strState.IsEmpty())
  265. {
  266. nStateCode = GetStateCode(strClassPart.IsEmpty()? strClass: strClassPart, strState);
  267. if (nStateCode == 0)
  268. {
  269. ASSERT(FALSE);
  270. return 0;
  271. }
  272. }
  273. int nClassCode = GetClassCode(strClass);
  274. if (nClassCode == 0)
  275. return 0;
  276. return CalculatePropertyCode(nClassCode, nClassPartCode, nStateCode, 0);
  277. }
  278. CXTPSkinManagerSchemaProperty* CXTPSkinManagerSchema::CreateProperty(LPCTSTR lpszProperty, XTPSkinManagerProperty nPropertyType, LPCTSTR lpszValue)
  279. {
  280. CXTPSkinManagerSchemaProperty* pProperty = new CXTPSkinManagerSchemaProperty();
  281. switch (nPropertyType)
  282. {
  283. case XTP_SKINPROPERTY_COLOR:    pProperty->SetPropertyColor(lpszValue); break;
  284. case XTP_SKINPROPERTY_STRING:   pProperty->SetPropertyString(lpszValue); break;
  285. case XTP_SKINPROPERTY_BOOL:     pProperty->SetPropertyBool(lpszValue); break;
  286. case XTP_SKINPROPERTY_RECT:     pProperty->SetPropertyRect(lpszValue); break;
  287. case XTP_SKINPROPERTY_INT:      pProperty->SetPropertyInt(lpszValue); break;
  288. case XTP_SKINPROPERTY_POSITION: pProperty->SetPropertySize(lpszValue); break;
  289. case XTP_SKINPROPERTY_ENUM:     pProperty->SetPropertyEnum(GetEnumCode(lpszProperty, lpszValue)); break;
  290. case XTP_SKINPROPERTY_FONT:     pProperty->SetPropertyFont(lpszValue); break;
  291. default:
  292. delete pProperty;
  293. return NULL;
  294. }
  295. pProperty->propType = nPropertyType;
  296. return pProperty;
  297. }
  298. HRESULT CXTPSkinManagerSchema::ReadProperties(CXTPSkinManagerResourceFile* pResourceFile)
  299. {
  300. RemoveAllProperties();
  301. CString str, strSchemaPart;
  302. UINT nSchemaPart = 0;
  303. while (pResourceFile->ReadString(str))
  304. {
  305. str.TrimLeft();
  306. int nCommentIndex = str.Find(_T(';'));
  307. if (nCommentIndex == 0)
  308. continue;
  309. if (nCommentIndex > 0)
  310. {
  311. str = str.Left(nCommentIndex);
  312. }
  313. if (str.IsEmpty())
  314. continue;
  315. str.MakeUpper();
  316. if (str[0] == _T('['))
  317. {
  318. strSchemaPart = str.Mid(1, str.GetLength() - 2);
  319. nSchemaPart = GetSchemaPartCode(strSchemaPart);
  320. }
  321. else if (nSchemaPart)
  322. {
  323. int nPos = str.Find(_T('='));
  324. if (nPos <= 0)
  325. continue;
  326. CString strProperty = str.Left(nPos);
  327. strProperty.TrimRight();
  328. strProperty.MakeUpper();
  329. XTPSkinManagerProperty nPropertyType = XTP_SKINPROPERTY_UNKNOWN;
  330. UINT nPropertyCode = GetPropertyCode(strProperty, nPropertyType);
  331. if (nPropertyCode == 0 || nPropertyType == XTP_SKINPROPERTY_UNKNOWN)
  332. {
  333. continue;
  334. }
  335. CString strValue = str.Mid(nPos + 1);
  336. strValue.TrimLeft();
  337. strValue.TrimRight();
  338. strValue.MakeUpper();
  339. CXTPSkinManagerSchemaProperty* pProperty = 0;
  340. if (m_mapProperties.Lookup(nSchemaPart + nPropertyCode, pProperty))
  341. {
  342. m_mapProperties.RemoveKey(nSchemaPart + nPropertyCode);
  343. delete pProperty;
  344. }
  345. pProperty = CreateProperty(strProperty, nPropertyType, strValue);
  346. if (pProperty == 0)
  347. {
  348. continue;
  349. }
  350. pProperty->nPropertyCode = nPropertyCode;
  351. m_mapProperties.SetAt(nSchemaPart + nPropertyCode, pProperty);
  352. }
  353. }
  354. int nAlpha = 0;
  355. if (SUCCEEDED(GetIntProperty(GetClassCode(_T("DOCUMENTATION")), 0, 0, TMT_ALPHALEVEL, nAlpha)) && nAlpha == 255)
  356. {
  357. m_bPreMultiplyImages = FALSE;
  358. }
  359. return S_OK;
  360. }
  361. CXTPSkinManagerSchemaProperty* CXTPSkinManagerSchema::GetProperty(UINT iClassId, int iPartId, int iStateId, int iPropId)
  362. {
  363. CXTPSkinManagerSchemaProperty* pProperty;
  364. if (iStateId)
  365. {
  366. if (m_mapProperties.Lookup(CalculatePropertyCode(iClassId, iPartId, iStateId, iPropId), pProperty))
  367. return pProperty;
  368. }
  369. if (m_mapProperties.Lookup(CalculatePropertyCode(iClassId, iPartId, 0, iPropId), pProperty))
  370. return pProperty;
  371. if (m_mapProperties.Lookup(CalculatePropertyCode(iClassId, 0, 0, iPropId), pProperty))
  372. return pProperty;
  373. if (m_mapProperties.Lookup(CalculatePropertyCode(m_nGlobalClassId, 0, 0, iPropId), pProperty))
  374. return pProperty;
  375. return NULL;
  376. }
  377. HRESULT CXTPSkinManagerSchema::GetStringProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, CString& str)
  378. {
  379. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  380. if (!pProperty)
  381. return E_FAIL;
  382. if (pProperty->propType != XTP_SKINPROPERTY_STRING)
  383. return E_INVALIDARG;
  384. str = pProperty->lpszVal;
  385. return S_OK;
  386. }
  387. HRESULT CXTPSkinManagerSchema::GetRectProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, CRect& rc)
  388. {
  389. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  390. if (!pProperty)
  391. return E_FAIL;
  392. if (pProperty->propType != XTP_SKINPROPERTY_RECT)
  393. return E_INVALIDARG;
  394. rc = pProperty->rcVal;
  395. return S_OK;
  396. }
  397. HRESULT CXTPSkinManagerSchema::GetIntProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, int& iVal)
  398. {
  399. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  400. if (!pProperty)
  401. return E_FAIL;
  402. if (pProperty->propType != XTP_SKINPROPERTY_INT)
  403. return E_INVALIDARG;
  404. iVal = pProperty->iVal;
  405. return S_OK;
  406. }
  407. HRESULT CXTPSkinManagerSchema::GetBoolProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, BOOL& bVal)
  408. {
  409. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  410. if (!pProperty)
  411. return E_FAIL;
  412. if (pProperty->propType != XTP_SKINPROPERTY_BOOL)
  413. return E_INVALIDARG;
  414. bVal = pProperty->bVal;
  415. return S_OK;
  416. }
  417. HRESULT CXTPSkinManagerSchema::GetColorProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, COLORREF& clrVal)
  418. {
  419. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  420. if (!pProperty)
  421. return E_FAIL;
  422. if (pProperty->propType != XTP_SKINPROPERTY_COLOR)
  423. return E_INVALIDARG;
  424. clrVal = pProperty->clrVal;
  425. GetSkinManager()->ApplyColorFilter(clrVal);
  426. return S_OK;
  427. }
  428. HRESULT CXTPSkinManagerSchema::GetEnumProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, int& nVal)
  429. {
  430. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  431. if (!pProperty)
  432. return E_FAIL;
  433. if (pProperty->propType != XTP_SKINPROPERTY_ENUM)
  434. return E_INVALIDARG;
  435. nVal = pProperty->iVal;
  436. return S_OK;
  437. }
  438. HRESULT CXTPSkinManagerSchema::GetFontProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, LOGFONT& lfVal)
  439. {
  440. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  441. if (!pProperty)
  442. return E_FAIL;
  443. if (pProperty->propType != XTP_SKINPROPERTY_FONT)
  444. return E_INVALIDARG;
  445. lfVal = *pProperty->lfVal;
  446. return S_OK;
  447. }
  448. HRESULT CXTPSkinManagerSchema::GetSizeProperty(UINT iClassId, int iPartId, int iStateId, int iPropId, CSize& szVal)
  449. {
  450. CXTPSkinManagerSchemaProperty* pProperty = GetProperty(iClassId, iPartId, iStateId, iPropId);
  451. if (!pProperty)
  452. return E_FAIL;
  453. if (pProperty->propType != XTP_SKINPROPERTY_POSITION)
  454. return E_INVALIDARG;
  455. szVal = pProperty->szVal;
  456. return S_OK;
  457. }
  458. //////////////////////////////////////////////////////////////////////////
  459. // CXTPSkinManagerSchemaDefault
  460. CXTPSkinManagerSchemaDefault::CXTPSkinManagerSchemaDefault(CXTPSkinManager* pManager)
  461. : CXTPSkinManagerSchema(pManager)
  462. {
  463. m_strSchemaName = _T("Default");
  464. m_nFrameButtonOffset = 0;
  465. }
  466. CXTPSkinManagerSchemaDefault::~CXTPSkinManagerSchemaDefault()
  467. {
  468. FreeFrameRegions();
  469. }
  470. int CXTPSkinManagerSchema::FindBestImageGlyphSize(CXTPSkinManagerClass* pClass, int iPartId, int iStateId, const CRect& rcDest, int nImageCount, BOOL bHorizontalImageLayout)
  471. {
  472. int nImageFile = TMT_IMAGEFILE5;
  473. CString strImageFile;
  474. while (nImageFile >= TMT_IMAGEFILE1)
  475. {
  476. strImageFile = pClass->GetThemeString(iPartId, iStateId, nImageFile);
  477. if (!strImageFile.IsEmpty())
  478. {
  479. CSize sz = pClass->GetImages()->GetExtent(m_pManager->GetResourceFile(), strImageFile);
  480. if (sz == CSize(0))
  481. return -1;
  482. if (bHorizontalImageLayout) sz.cx /= nImageCount; else sz.cy /= nImageCount;
  483. if ((nImageFile == TMT_IMAGEFILE1) || (rcDest.Height() >= sz.cy && rcDest.Width() >= sz.cx))
  484. return nImageFile;
  485. }
  486. nImageFile--;
  487. }
  488. return nImageFile;
  489. }
  490. BOOL CXTPSkinManagerSchema::DrawThemeBackgroundGlyph(CDC* pDC, CXTPSkinManagerClass* pClass, int iPartId, int iStateId, const RECT *pRect)
  491. {
  492. int nImageFile = TMT_GLYPHIMAGEFILE;
  493. int nImageCount = pClass->GetThemeInt(iPartId, iStateId, TMT_IMAGECOUNT, 1);
  494. if (nImageCount < 1)
  495. nImageCount = 1;
  496. BOOL bHorizontalImageLayout = pClass->GetThemeEnumValue(iPartId, iStateId, TMT_IMAGELAYOUT, IL_HORIZONTAL) == IL_HORIZONTAL;
  497. CRect rcDest(pRect);
  498. CRect rcContentMargins = pClass->GetThemeRect(iPartId, iStateId, TMT_CONTENTMARGINS);
  499. rcDest.DeflateRect(rcContentMargins);
  500. if (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_IMAGESELECTTYPE) == IST_SIZE)
  501. {
  502. nImageFile = FindBestImageGlyphSize(pClass, iPartId, iStateId, rcDest, nImageCount, bHorizontalImageLayout);
  503. if (nImageFile == -1)
  504. return FALSE;
  505. }
  506. CString strImageFile = pClass->GetThemeString(iPartId, iStateId, nImageFile);
  507. if (strImageFile.IsEmpty())
  508. return FALSE;
  509. CXTPSkinImage* pImage = pClass->GetImages()->LoadFile(m_pManager->GetResourceFile(), strImageFile);
  510. if (!pImage)
  511. {
  512. return FALSE;
  513. }
  514. CSize sz(pImage->GetWidth(), pImage->GetHeight());
  515. if (bHorizontalImageLayout) sz.cx /= nImageCount; else sz.cy /= nImageCount;
  516. BOOL bTransparent = pImage->IsAlphaImage()? FALSE: pClass->GetThemeBool(iPartId, iStateId, TMT_GLYPHTRANSPARENT);
  517. CPoint ptTopLeft((rcDest.left + rcDest.right - sz.cx)/2, (rcDest.top + rcDest.bottom - sz.cy)/2);
  518. if (ptTopLeft.y < rcDest.top)
  519. ptTopLeft.y  = rcDest.top;
  520. CRect rcGlyph(ptTopLeft, sz);
  521. CRect rcSrcImage = bHorizontalImageLayout? CRect((iStateId - 1) * sz.cx,  0, iStateId * sz.cx, sz.cy):
  522. CRect(0, (iStateId - 1) * sz.cy, sz.cx, iStateId * sz.cy);
  523. if (nImageCount <= iStateId - 1)
  524. rcSrcImage = CRect(0, 0, sz.cx, sz.cy);
  525. COLORREF clrTransparent = COLORREF_NULL;
  526. if (bTransparent)
  527. {
  528. clrTransparent = pClass->GetThemeColor(iPartId, iStateId, TMT_TRANSPARENTCOLOR, RGB(0xFF, 0, 0xFF));
  529. }
  530. pImage->DrawImage(pDC, rcGlyph, rcSrcImage, CRect(0, 0, 0, 0), clrTransparent, ST_TRUESIZE, FALSE);
  531. return TRUE;
  532. }
  533. BOOL CXTPSkinManagerSchema::DrawThemeBackgroundBorder(CDC* pDC, CXTPSkinManagerClass* pClass, int iPartId, int iStateId, const RECT *pRect)
  534. {
  535. int nBorderSize = pClass->GetThemeInt(iPartId, iStateId, TMT_BORDERSIZE, 1);
  536. COLORREF clrBorderColor = pClass->GetThemeColor(iPartId, iStateId, TMT_BORDERCOLOR);
  537. COLORREF clrFillColor = pClass->GetThemeColor(iPartId, iStateId, TMT_FILLCOLOR);
  538. BOOL bBorderOnly = pClass->GetThemeBool(iPartId, iStateId, TMT_BORDERONLY, FALSE);
  539. CRect rc(pRect);
  540. if ((nBorderSize > 0) && (clrBorderColor != COLORREF_NULL))
  541. {
  542. pDC->FillSolidRect(rc.left, rc.top, rc.Width(), nBorderSize, clrBorderColor);
  543. pDC->FillSolidRect(rc.left, rc.bottom - nBorderSize, rc.Width(), nBorderSize, clrBorderColor);
  544. pDC->FillSolidRect(rc.left, rc.top + nBorderSize, nBorderSize, rc.Height() - nBorderSize * 2, clrBorderColor);
  545. pDC->FillSolidRect(rc.right - nBorderSize, rc.top + nBorderSize, nBorderSize, rc.Height() - nBorderSize * 2, clrBorderColor);
  546. rc.DeflateRect(nBorderSize, nBorderSize);
  547. }
  548. if ((clrFillColor != COLORREF_NULL) && (!bBorderOnly))
  549. {
  550. pDC->FillSolidRect(rc, clrFillColor);
  551. }
  552. return TRUE;
  553. }
  554. BOOL CXTPSkinManagerSchemaDefault::DrawThemeBackground(CDC* pDC, CXTPSkinManagerClass* pClass, int iPartId, int iStateId, const RECT *pRect)
  555. {
  556. int nBackgroundType = pClass->GetThemeEnumValue(iPartId, iStateId, TMT_BGTYPE, BT_IMAGEFILE);
  557. if (nBackgroundType == BT_BORDERFILL)
  558. {
  559. return DrawThemeBackgroundBorder(pDC, pClass, iPartId, iStateId, pRect);
  560. }
  561. if (nBackgroundType != BT_IMAGEFILE)
  562. return TRUE;
  563. int nImageFile = (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_IMAGESELECTTYPE) != IST_NONE) &&
  564. (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_GLYPHTYPE, GT_NONE) == GT_NONE) ?
  565. TMT_IMAGEFILE1: TMT_IMAGEFILE;
  566. CString strImageFile = pClass->GetThemeString(iPartId, iStateId, nImageFile);
  567. if (strImageFile.IsEmpty())
  568. {
  569. if (nImageFile != TMT_IMAGEFILE1)
  570. return FALSE;
  571. strImageFile = pClass->GetThemeString(iPartId, iStateId, TMT_IMAGEFILE);
  572. if (strImageFile.IsEmpty())
  573. return FALSE;
  574. }
  575. CRect rcSizingMargins = pClass->GetThemeRect(iPartId, iStateId, TMT_SIZINGMARGINS);
  576. CXTPSkinImage* pImage = pClass->GetImages()->LoadFile(m_pManager->GetResourceFile(), strImageFile);
  577. if (!pImage)
  578. {
  579. return FALSE;
  580. }
  581. int nImageCount = pClass->GetThemeInt(iPartId, iStateId, TMT_IMAGECOUNT, 1);
  582. if (nImageCount < 1)
  583. nImageCount = 1;
  584. BOOL bHorizontalImageLayout = pClass->GetThemeEnumValue(iPartId, iStateId, TMT_IMAGELAYOUT, IL_HORIZONTAL) == IL_HORIZONTAL;
  585. CSize sz(pImage->GetWidth(), pImage->GetHeight());
  586. if (bHorizontalImageLayout) sz.cx /= nImageCount; else sz.cy /= nImageCount;
  587. BOOL bTransparent = pImage->IsAlphaImage()? FALSE: pClass->GetThemeBool(iPartId, iStateId, TMT_TRANSPARENT);
  588. CRect rcImage(*pRect);
  589. int nSizingType = pClass->GetThemeEnumValue(iPartId, iStateId, TMT_SIZINGTYPE, ST_STRETCH);
  590. if (nSizingType == ST_TRUESIZE)
  591. {
  592. CSize szDest(sz);
  593. if (pClass->GetThemeInt(iPartId, iStateId, TMT_TRUESIZESTRETCHMARK) > 0)
  594. {
  595. if (szDest.cx > rcImage.Width())
  596. {
  597. szDest.cx = rcImage.Width();
  598. }
  599. if (szDest.cy > rcImage.Height())
  600. {
  601. szDest.cy = rcImage.Height();
  602. }
  603. }
  604. CPoint ptTopLeft((rcImage.left + rcImage.right - szDest.cx)/2, (rcImage.top + rcImage.bottom - szDest.cy)/2);
  605. if (ptTopLeft.y < rcImage.top)
  606. ptTopLeft.y = rcImage.top;
  607. if (ptTopLeft.x < rcImage.left)
  608. ptTopLeft.x = rcImage.left;
  609. if (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_VALIGN) == VA_BOTTOM)
  610. rcImage = CRect(CPoint(ptTopLeft.x, rcImage.bottom - szDest.cy), szDest);
  611. else
  612. rcImage = CRect(ptTopLeft, szDest);
  613. rcSizingMargins = CRect(0, 0, 0, 0);
  614. }
  615. CRect rcSrcImage = bHorizontalImageLayout? CRect((iStateId - 1) * sz.cx,  0, iStateId * sz.cx, sz.cy):
  616. CRect(0, (iStateId - 1) * sz.cy, sz.cx, iStateId * sz.cy);
  617. if ((nImageCount <= iStateId - 1) || (iStateId == 0))
  618. rcSrcImage = CRect(0, 0, sz.cx, sz.cy);
  619. COLORREF clrTransparent = COLORREF_NULL;
  620. if (bTransparent)
  621. {
  622. clrTransparent = pClass->GetThemeColor(iPartId, iStateId, TMT_TRANSPARENTCOLOR, RGB(0xFF, 0, 0xFF));
  623. }
  624. BOOL bBorderOnly = pClass->GetThemeBool(iPartId, iStateId, TMT_BORDERONLY);
  625. if (pClass->GetClassCode() == m_nWindowClassId && (iPartId >= WP_FRAMELEFT && iPartId <= WP_SMALLFRAMEBOTTOM))
  626. bBorderOnly = FALSE;
  627. pImage->m_bMirrorImage =  pClass->GetThemeBool(iPartId, iStateId, TMT_MIRRORIMAGE, TRUE);
  628. pImage->CreateSolidRectArray(nImageCount, bHorizontalImageLayout, rcSizingMargins);
  629. pImage->DrawImage(pDC, rcImage, rcSrcImage, rcSizingMargins, clrTransparent, nSizingType, bBorderOnly);
  630. if (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_GLYPHTYPE) == GT_IMAGEGLYPH)
  631. {
  632. DrawThemeBackgroundGlyph(pDC, pClass, iPartId, iStateId, pRect);
  633. }
  634. return TRUE;
  635. }
  636. CSize CXTPSkinManagerSchemaDefault::GetCaptionButtonSize(CXTPSkinManagerClass* pClass, int yButton)
  637. {
  638. int iPartId = WP_CLOSEBUTTON, iStateId = 1;
  639. if (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_BGTYPE) != BT_IMAGEFILE)
  640. return CSize(yButton, yButton);
  641. int nImageFile = (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_IMAGESELECTTYPE) != IST_NONE) &&
  642. (pClass->GetThemeEnumValue(iPartId, iStateId, TMT_GLYPHTYPE, GT_NONE) == GT_NONE) ?
  643. TMT_IMAGEFILE1: TMT_IMAGEFILE;
  644. CString strImageFile = pClass->GetThemeString(iPartId, iStateId, nImageFile);
  645. if (strImageFile.IsEmpty())
  646. {
  647. if (nImageFile != TMT_IMAGEFILE1)
  648. return CSize(yButton, yButton);
  649. strImageFile = pClass->GetThemeString(iPartId, iStateId, TMT_IMAGEFILE);
  650. if (strImageFile.IsEmpty())
  651. return CSize(yButton, yButton);
  652. }
  653. CXTPSkinImage* pImage = pClass->GetImages()->LoadFile(m_pManager->GetResourceFile(), strImageFile);
  654. if (!pImage)
  655. {
  656. return CSize(yButton, yButton);
  657. }
  658. int nImageCount = pClass->GetThemeInt(iPartId, iStateId, TMT_IMAGECOUNT, 1);
  659. if (nImageCount < 1)
  660. nImageCount = 1;
  661. BOOL bHorizontalImageLayout = pClass->GetThemeEnumValue(iPartId, iStateId, TMT_IMAGELAYOUT, IL_HORIZONTAL) == IL_HORIZONTAL;
  662. CSize sz(pImage->GetWidth(), pImage->GetHeight());
  663. if (bHorizontalImageLayout) sz.cx /= nImageCount; else sz.cy /= nImageCount;
  664. int xButton = MulDiv(sz.cx, yButton, sz.cy) + MulDiv(sz.cx - sz.cy, 4, sz.cy);
  665. return CSize(xButton, yButton);
  666. }
  667. int CXTPSkinManagerSchemaDefault::DrawThemeFrameButtons(CDC* pDC, CXTPSkinObjectFrame* pFrame)
  668. {
  669. CXTPWindowRect rc(pFrame);
  670. rc.OffsetRect(-rc.TopLeft());
  671. CRect rcBorders = pFrame->GetBorders();
  672. int nCaptionHeight = rcBorders.top;
  673. LONG lStyle = pFrame->GetStyle();
  674. DWORD dwExStyle = pFrame->GetExStyle();
  675. int cBorders = GetWindowBorders(lStyle, dwExStyle, TRUE, FALSE);
  676. int cxFrame = cBorders * m_pManager->GetMetrics()->m_cxBorder;
  677. int nTop = 0;
  678. if (dwExStyle & WS_EX_WINDOWEDGE)
  679. nTop++;
  680. else if (dwExStyle & WS_EX_STATICEDGE)
  681. nTop++;
  682. if (lStyle & WS_SIZEBOX)
  683. nTop += (1 + m_pManager->GetMetrics()->m_nBorderSize) / 2;
  684. int yButton = nCaptionHeight - 5 - cxFrame + m_nFrameButtonOffset;
  685. if (dwExStyle & WS_EX_CLIENTEDGE)
  686. {
  687. yButton -= 2;
  688. nTop -= 1;
  689. }
  690. CXTPSkinManagerClass* pClass = m_pManager->GetSkinClass(_T("WINDOW"));
  691. CSize szButton = dwExStyle & WS_EX_TOOLWINDOW ? CSize(yButton, yButton) : GetCaptionButtonSize(pClass, yButton);
  692. CRect rcButton = CRect(CPoint(rc.right - szButton.cx - cBorders - 2, nTop + (nCaptionHeight - szButton.cy)/2), szButton);
  693. CXTPSkinObjectFrame::CCaptionButtons* pButtons = pFrame->GetCaptionButtons();
  694. for (int i = 0; i < (int)pButtons->GetSize(); i++)
  695. {
  696. CXTPSkinObjectFrame::CCaptionButton* pButton = pButtons->GetAt(i);
  697. pButton->m_rcButton = rcButton;
  698. pButton->Draw(pDC, pFrame->IsActive());
  699. rcButton.OffsetRect(-rcButton.Width() - 2, 0);
  700. }
  701. return rcButton.right + 2;
  702. }
  703. void CXTPSkinManagerSchema::DrawNonClientRect(CDC* pDC, CRect rcFrame, CXTPSkinObjectFrame* pFrame)
  704. {
  705. DWORD dwExStyle = pFrame->GetExStyle();
  706. DWORD dwStyle = pFrame->GetStyle();
  707. if (dwExStyle & WS_EX_WINDOWEDGE)
  708. {
  709. DrawEdge(pDC->GetSafeHdc(), &rcFrame, EDGE_RAISED, BF_RECT | BF_ADJUST);
  710. }
  711. else if (dwExStyle & WS_EX_STATICEDGE)
  712. {
  713. DrawEdge(pDC->GetSafeHdc(), &rcFrame, BDR_SUNKENOUTER, BF_RECT | BF_ADJUST);
  714. }
  715. if ((dwStyle & WS_CAPTION) || (dwExStyle & WS_EX_DLGMODALFRAME))
  716. {
  717. COLORREF clr = GetColor((dwExStyle & (WS_EX_CLIENTEDGE | WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_STATICEDGE))
  718. || (dwStyle & WS_DLGFRAME) ? COLOR_3DFACE : COLOR_WINDOWFRAME);
  719. pDC->Draw3dRect(rcFrame, clr, clr);
  720. rcFrame.DeflateRect(1, 1);
  721. }
  722. if (dwStyle & WS_SIZEBOX)
  723. {
  724. int nSize = m_pManager->GetMetrics()->m_nBorderSize;
  725. XTPSkinFrameworkDrawFrame(pDC->GetSafeHdc(), rcFrame, nSize, GetColor(COLOR_3DFACE));
  726. rcFrame.DeflateRect(nSize, nSize);
  727. }
  728. if (dwExStyle & WS_EX_CLIENTEDGE)
  729. {
  730. DrawClientEdge(pDC, rcFrame, pFrame);
  731. }
  732. }
  733. void CXTPSkinManagerSchema::DrawClientEdge(CDC* pDC, const CRect& rcFrame, CXTPSkinObjectFrame* pFrame)
  734. {
  735. CRect rc = rcFrame;
  736. CXTPSkinManagerClass* pClass = m_pManager->GetSkinClass(pFrame->GetClassName());
  737. if (pClass->GetThemeEnumValue(0, 0, TMT_BGTYPE) == BT_BORDERFILL)
  738. {
  739. COLORREF clrBorderColor = pClass->GetThemeColor(0, 0, TMT_BORDERCOLOR);
  740. pDC->Draw3dRect(rc, clrBorderColor, clrBorderColor);
  741. rc.DeflateRect(1, 1);
  742. HBRUSH hBrush = pFrame->GetClientBrush(pDC);
  743. XTPSkinFrameworkDrawFrame(pDC->GetSafeHdc(), &rc, 1, hBrush);
  744. }
  745. else
  746. {
  747. pDC->Draw3dRect(rc, m_pManager->GetMetrics()->m_clrEdgeShadow, m_pManager->GetMetrics()->m_clrEdgeHighLight);
  748. rc.DeflateRect(1, 1);
  749. pDC->Draw3dRect(rc, m_pManager->GetMetrics()->m_clrEdgeDkShadow, m_pManager->GetMetrics()->m_clrEdgeLight);
  750. rc.DeflateRect(1, 1);
  751. }
  752. }
  753. HICON GetFrameSmIcon(CXTPSkinObjectFrame* pFrame)
  754. {
  755. DWORD dwStyle = pFrame->GetStyle();
  756. DWORD dwExStyle = pFrame->GetExStyle();
  757. if (dwExStyle & WS_EX_TOOLWINDOW)
  758. return NULL;
  759. if ((dwStyle & WS_SYSMENU) == 0)
  760. return NULL;
  761. HICON hIcon = (HICON)(DWORD_PTR)::SendMessage(pFrame->m_hWnd, WM_GETICON, ICON_SMALL, 0);
  762. if (hIcon)
  763. return hIcon;
  764. hIcon = (HICON)(DWORD_PTR)::GetClassLongPtr(pFrame->m_hWnd, GCLP_HICONSM);
  765. if (hIcon)
  766. return hIcon;
  767. if (((dwStyle & (WS_BORDER | WS_DLGFRAME)) != WS_DLGFRAME) && ((dwExStyle & WS_EX_DLGMODALFRAME) == 0))
  768. {
  769. ULONG_PTR dwResult;
  770. if (SendMessageTimeout(pFrame->GetSafeHwnd(),
  771. WM_QUERYDRAGICON,
  772. 0,
  773. 0,
  774. SMTO_NORMAL,
  775. 100,
  776. &dwResult))
  777. {
  778. hIcon = (HICON)dwResult;
  779. }
  780. if (hIcon == NULL)
  781. {
  782. hIcon = AfxGetApp()->LoadOEMIcon(OIC_WINLOGO);
  783. }
  784. }
  785. return hIcon;
  786. }
  787. void CXTPSkinManagerSchemaDefault::DrawThemeFrame(CDC* pDC, CXTPSkinObjectFrame* pFrame)
  788. {
  789. CXTPWindowRect rc(pFrame);
  790. rc.OffsetRect(-rc.TopLeft());
  791. DWORD dwStyle = pFrame->GetStyle();
  792. DWORD dwExStyle = pFrame->GetExStyle();
  793. if ((dwStyle & WS_CAPTION) != WS_CAPTION)
  794. {
  795. DrawNonClientRect(pDC, rc, pFrame);
  796. return;
  797. }
  798. BOOL bToolWindow = (dwExStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW;
  799. CRect rcBorders = pFrame->GetBorders();
  800. if (dwExStyle & WS_EX_CLIENTEDGE)
  801. {
  802. DrawClientEdge(pDC, CRect(rcBorders.left - 2, rcBorders.top - 2, rc.Width() - rcBorders.right + 2,
  803. rc.Height() - rcBorders.bottom + 2), pFrame);
  804. InflateBorders(rcBorders, -2, -2);
  805. }
  806. CRect rcCaption(0, 0, rc.right, rcBorders.top);
  807. CRect rcFrame(0, rcBorders.top, rc.Width(), rc.Height());
  808. CXTPSkinManagerClass* pClassWindow = m_pManager->GetSkinClass(_T("WINDOW"));
  809. int nFrameState = pFrame->IsActive()? FS_ACTIVE: FS_INACTIVE;
  810. pClassWindow->DrawThemeBackground(pDC, bToolWindow? WP_SMALLFRAMELEFT: WP_FRAMELEFT, nFrameState,
  811. CRect(rcFrame.left, rcFrame.top, rcFrame.left + rcBorders.left, rcFrame.bottom - rcBorders.bottom));
  812. pClassWindow->DrawThemeBackground(pDC, bToolWindow? WP_SMALLFRAMERIGHT: WP_FRAMERIGHT, nFrameState,
  813. CRect(rcFrame.right - rcBorders.right, rcFrame.top, rcFrame.right , rcFrame.bottom - rcBorders.bottom));
  814. pClassWindow->DrawThemeBackground(pDC, bToolWindow? WP_SMALLFRAMEBOTTOM: WP_FRAMEBOTTOM, nFrameState,
  815. CRect(rcFrame.left, rcFrame.bottom - rcBorders.bottom, rcFrame.right , rcFrame.bottom));
  816. {
  817. CXTPLockGuard lock(m_csDraw);
  818. CXTPBufferDC dc(*pDC, rcCaption);
  819. pClassWindow->DrawThemeBackground(&dc, bToolWindow? WP_SMALLCAPTION: WP_CAPTION, nFrameState, rcCaption);
  820. CSize szIcon(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON));
  821. int nTextLeft = rcBorders.left;
  822. HICON hIcon = GetFrameSmIcon(pFrame);
  823. int cBorders = GetWindowBorders(dwStyle, dwExStyle, TRUE, FALSE) - m_pManager->GetMetrics()->m_cyBorder;
  824. if (hIcon)
  825. {
  826. int cxySlot = rcBorders.top - cBorders;
  827. int nTop = cBorders  + (cxySlot  - szIcon.cy)/2;
  828. CRect rcButn(rcBorders.left + 2, nTop, rcBorders.left + 2 + szIcon.cx, nTop + szIcon.cy);
  829. DWORD dwLayout = XTPDrawHelpers()->IsContextRTL(&dc);
  830. if (dwLayout & LAYOUT_RTL)
  831. XTPDrawHelpers()->SetContextRTL(&dc, dwLayout | LAYOUT_BITMAPORIENTATIONPRESERVED);
  832. DrawIconEx(dc.m_hDC, rcButn.left, rcButn.top,hIcon,
  833. rcButn.Width(), rcButn.Height(), 0, NULL, DI_NORMAL);
  834. if (dwLayout & LAYOUT_RTL)
  835. XTPDrawHelpers()->SetContextRTL(&dc, dwLayout);
  836. nTextLeft = 2 + szIcon.cx + rcBorders.left;
  837. }
  838. int nTextRight = DrawThemeFrameButtons(&dc, pFrame);
  839. dc.SetTextColor(m_pManager->GetThemeSysColor(pFrame->IsActive() ? TMT_CAPTIONTEXT : TMT_INACTIVECAPTIONTEXT));
  840. CFont* pOldFont = dc.SelectObject(bToolWindow ? &m_pManager->GetMetrics()->m_fntSmCaption : &m_pManager->GetMetrics()->m_fntCaption);
  841. CString strCaption;
  842. CXTPDrawHelpers::GetWindowCaption(pFrame->GetSafeHwnd(), strCaption);
  843. CRect rcText(nTextLeft, 1 + cBorders, nTextRight, rcBorders.top);
  844. pClassWindow->DrawThemeText(&dc, bToolWindow ?  WP_SMALLCAPTION : WP_CAPTION, pFrame->IsActive() ? CS_ACTIVE : CS_INACTIVE,
  845. strCaption, DT_VCENTER | DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX
  846. | (dwExStyle & WS_EX_RTLREADING ? DT_RTLREADING : 0) | (dwExStyle & WS_EX_RIGHT ? DT_RIGHT : 0), rcText);
  847. dc.SelectObject(pOldFont);
  848. }
  849. }
  850. int CXTPSkinManagerSchemaDefault::GetWindowBorders(LONG lStyle, DWORD dwExStyle, BOOL fWindow, BOOL fClient)
  851. {
  852. int cBorders = 0;
  853. if (fWindow)
  854. {
  855. if (dwExStyle & WS_EX_WINDOWEDGE)
  856. cBorders += 2;
  857. else if (dwExStyle & WS_EX_STATICEDGE)
  858. cBorders++;
  859. if ((lStyle & WS_CAPTION) || (dwExStyle & WS_EX_DLGMODALFRAME))
  860. cBorders++;
  861. if (lStyle & WS_SIZEBOX)
  862. cBorders += m_pManager->GetMetrics()->m_nBorderSize;
  863. }
  864. if (fClient)
  865. {
  866. if (dwExStyle & WS_EX_CLIENTEDGE)
  867. cBorders += 2;
  868. }
  869. return(cBorders);
  870. }
  871. CRect CXTPSkinManagerSchemaDefault::CalcFrameBorders(CXTPSkinObjectFrame* pFrame)
  872. {
  873. DWORD dwExStyle = pFrame->GetExStyle();
  874. DWORD dwStyle = pFrame->GetStyle();
  875. return CalcFrameBorders(dwStyle, dwExStyle);
  876. }
  877. CRect CXTPSkinManagerSchemaDefault::CalcFrameBorders(DWORD dwStyle, DWORD dwExStyle)
  878. {
  879. BOOL bToolWindow = (dwExStyle & WS_EX_TOOLWINDOW) == WS_EX_TOOLWINDOW;
  880. CXTPSkinManagerMetrics* pMetrics = m_pManager->GetMetrics();
  881. if (((dwStyle & (WS_CAPTION | WS_MAXIMIZE)) == (WS_CAPTION | WS_MAXIMIZE) && ((dwStyle & WS_CHILD) == 0)))
  882. {
  883. int nCaptionHeight = bToolWindow ? pMetrics->m_cySmallCaption: pMetrics->m_cyCaption;
  884. CRect rc(0, 0, 100, 100);
  885. AdjustWindowRectEx(rc, dwStyle, FALSE, dwExStyle);
  886. int nBorder = -rc.left;
  887. return CRect(nBorder, nBorder + nCaptionHeight, nBorder, nBorder);
  888. }
  889. CRect rcBorders(0, 0, 0, 0);
  890. if ((dwStyle & WS_CAPTION) == WS_CAPTION)
  891. {
  892. int nCaptionHeight = bToolWindow ? pMetrics->m_cySmallCaption: pMetrics->m_cyCaption;
  893. rcBorders.top += nCaptionHeight;
  894. }
  895. int cBorders = GetWindowBorders(dwStyle, dwExStyle, TRUE, FALSE);
  896. InflateBorders(rcBorders, cBorders * pMetrics->m_cxBorder, cBorders * pMetrics->m_cyBorder);
  897. if ((dwExStyle & WS_EX_CLIENTEDGE) == WS_EX_CLIENTEDGE)
  898. {
  899. InflateBorders(rcBorders, pMetrics->m_cxEdge, pMetrics->m_cyEdge);
  900. }
  901. return rcBorders;
  902. }
  903. AFX_INLINE void IncludeRgnPart(CRgn* pRgn, int x1, int y, int x2)
  904. {
  905. if (x1 < x2)
  906. {
  907. if (pRgn->GetSafeHandle() == NULL)
  908. {
  909. pRgn->CreateRectRgn(0, 0, 0, 0);
  910. }
  911. CRgn rgnExclude;
  912. rgnExclude.CreateRectRgn(x1, y, x2, y + 1);
  913. pRgn->CombineRgn(pRgn, &rgnExclude, RGN_OR);
  914. }
  915. }
  916. void CXTPSkinManagerSchemaDefault::RegionFromBitmap(CDC* pDC, CRgn* pRgnLeft, CRgn* pRgnRight, int& nRgnFrameCenter, const CRect& rc, const CRect& rcSizingMargins, COLORREF clrTransparent)
  917. {
  918. CSize sz = rc.Size();
  919. nRgnFrameCenter = 0;
  920. BOOL bCheckCenter = TRUE;
  921. for (int y = 0; y < sz.cy; y++)
  922. {
  923. int x = 0;
  924. while (pDC->GetPixel(x, y) == clrTransparent && x < rcSizingMargins.left)
  925. {
  926. x++;
  927. }
  928. if (x > 0)
  929. {
  930. IncludeRgnPart(pRgnLeft, 0, y, x);
  931. }
  932. x = sz.cx - 1;
  933. int nOffset = sz.cx - rcSizingMargins.right;
  934. while (x >= nOffset)
  935. {
  936. int x0 = x;
  937. while (x >= nOffset && pDC->GetPixel(x, y) == clrTransparent)
  938. {
  939. x--;
  940. }
  941. if (x != x0)
  942. {
  943. IncludeRgnPart(pRgnRight, x - nOffset + 1, y, x0 - nOffset + 1);
  944. }
  945. while (x >= nOffset && pDC->GetPixel(x, y) != clrTransparent)
  946. {
  947. x--;
  948. }
  949. if (x == x0)
  950. break;
  951. }
  952. if (bCheckCenter)
  953. {
  954. x = rcSizingMargins.left;
  955. while (pDC->GetPixel(x, y) == clrTransparent && x < sz.cx - rcSizingMargins.right)
  956. {
  957. x++;
  958. }
  959. if (x == sz.cx - rcSizingMargins.right)
  960. {
  961. nRgnFrameCenter++;
  962. }
  963. else
  964. {
  965. bCheckCenter = FALSE;
  966. }
  967. }
  968. }
  969. }
  970. CXTPSkinManagerSchemaDefault::FRAMEREGION* CXTPSkinManagerSchemaDefault::CreateFrameRegion(CXTPSkinObjectFrame* pFrame, CSize szDest)
  971. {
  972. int nCaptionHeight = pFrame->GetBorders().top;
  973. BOOL bToolWindow = pFrame->GetExStyle() & WS_EX_TOOLWINDOW;
  974. for (int i = 0; i < m_arrFrameRegions.GetSize(); i++)
  975. {
  976. FRAMEREGION* pRegion = m_arrFrameRegions[i];
  977. if (nCaptionHeight == pRegion->nCaptionHeight && bToolWindow == pRegion->bToolWindow)
  978. {
  979. if (szDest.cx < pRegion->rcFrameSizingMargins.left + pRegion->rcFrameSizingMargins.right)
  980. break;
  981. return pRegion;
  982. }
  983. }
  984. int iPartId = bToolWindow ? WP_SMALLCAPTION : WP_CAPTION;
  985. CXTPSkinManagerClass* pClass = m_pManager->GetSkinClass(_T("WINDOW"));
  986. CString strImageFile = pClass->GetThemeString(iPartId, FS_ACTIVE, TMT_IMAGEFILE);
  987. if (strImageFile.IsEmpty())
  988. return  NULL;
  989. CSize sz = pClass->GetImages()->GetExtent(m_pManager->GetResourceFile(), strImageFile);
  990. if (sz == CSize(0))
  991. return  NULL;
  992. CXTPSkinImage* pImage = pClass->GetImages()->LoadFile(m_pManager->GetResourceFile(), strImageFile);
  993. if (!pImage)
  994. return NULL;
  995. int nImageCount = pClass->GetThemeInt(iPartId, FS_ACTIVE, TMT_IMAGECOUNT, 1);
  996. ASSERT(nImageCount >= 1);
  997. if (nImageCount < 1)
  998. return NULL;
  999. FRAMEREGION* pRegion = new FRAMEREGION();
  1000. pRegion->bAutoDelete = FALSE;
  1001. pRegion->rcFrameSizingMargins.SetRectEmpty();
  1002. CWindowDC dcWindow(pFrame);
  1003. CDC dc;
  1004. dc.CreateCompatibleDC(&dcWindow);
  1005. CRect rcSrc(0, 0, sz.cx, sz.cy / nImageCount);
  1006. CRect rcDest(0, 0, sz.cx, nCaptionHeight);
  1007. CBitmap bmp;
  1008. bmp.CreateCompatibleBitmap(&dcWindow, rcDest.Width(), rcDest.Height());
  1009. CBitmap* pOldBitmap = dc.SelectObject(&bmp);
  1010. BOOL bTransparent = pImage->IsAlphaImage()? FALSE: pClass->GetThemeBool(iPartId, FS_ACTIVE, TMT_TRANSPARENT);
  1011. COLORREF clrTransparent = COLORREF_NULL;
  1012. if (bTransparent)
  1013. {
  1014. clrTransparent = pClass->GetThemeColor(iPartId, FS_ACTIVE, TMT_TRANSPARENTCOLOR, RGB(0xFF, 0, 0xFF));
  1015. }
  1016. dc.FillSolidRect(rcDest, clrTransparent != COLORREF_NULL ? clrTransparent : RGB(0xFF, 0, 0xFF));
  1017. CRect rcSizingMargins = pClass->GetThemeRect(iPartId, FS_ACTIVE, TMT_SIZINGMARGINS);
  1018. if (rcSizingMargins.top + rcSizingMargins.bottom > rcDest.Height())
  1019. {
  1020. rcSizingMargins.bottom = max(0, rcDest.Height() - rcSizingMargins.top);
  1021. }
  1022. CRect rcDestSizingMargins = rcSizingMargins;
  1023. if (szDest.cx < rcSizingMargins.left + rcSizingMargins.right)
  1024. {
  1025. rcDest.right = szDest.cx;
  1026. pRegion->bAutoDelete = TRUE;
  1027. rcDestSizingMargins.left = MulDiv(rcDest.Width(), rcSizingMargins.left, (rcSizingMargins.left + rcSizingMargins.right));
  1028. rcDestSizingMargins.right = rcDest.Width() - rcSizingMargins.left;
  1029. }
  1030. pImage->DrawImage(&dc, rcDest, rcSrc, rcSizingMargins, clrTransparent, ST_STRETCH, FALSE);
  1031. RegionFromBitmap(&dc, &pRegion->rgnFrameLeft, &pRegion->rgnFrameRight, pRegion->nRgnFrameCenter,
  1032. rcDest, rcDestSizingMargins, clrTransparent != COLORREF_NULL ? clrTransparent : RGB(0xFF, 0, 0xFF));
  1033. dc.SelectObject(pOldBitmap);
  1034. pRegion->rcFrameSizingMargins = rcDestSizingMargins;
  1035. pRegion->bToolWindow = bToolWindow;
  1036. pRegion->nCaptionHeight = nCaptionHeight;
  1037. if (!pRegion->bAutoDelete)
  1038. m_arrFrameRegions.Add(pRegion);
  1039. return pRegion;
  1040. }
  1041. void CXTPSkinManagerSchemaDefault::FreeFrameRegions()
  1042. {
  1043. for (int i = 0; i < m_arrFrameRegions.GetSize(); i++)
  1044. {
  1045. delete m_arrFrameRegions[i];
  1046. }
  1047. m_arrFrameRegions.RemoveAll();
  1048. }
  1049. void CXTPSkinManagerSchemaDefault::RefreshMetrcis()
  1050. {
  1051. FreeFrameRegions();
  1052. }
  1053. HRGN CXTPSkinManagerSchemaDefault::CalcFrameRegion(CXTPSkinObjectFrame* pFrame, CSize sz)
  1054. {
  1055. CRgn rgnResult;
  1056. if ((pFrame->GetStyle() & WS_MAXIMIZE) && ((pFrame->GetStyle() & WS_CHILD) == 0))
  1057. {
  1058. int nBorder = pFrame->GetBorders().left;
  1059. CRect rc = XTPMultiMonitor()->GetWorkArea(pFrame);
  1060. if (rc.Width() == sz.cx)
  1061. rgnResult.CreateRectRgn(nBorder, nBorder, sz.cx + 2 * nBorder, sz.cy + 2 * nBorder);
  1062. else
  1063. rgnResult.CreateRectRgn(nBorder, nBorder, sz.cx - nBorder, sz.cy - nBorder);
  1064. return (HRGN)rgnResult.Detach();
  1065. }
  1066. rgnResult.CreateRectRgn(0, 0, sz.cx, sz.cy);
  1067. FRAMEREGION* pRegion = CreateFrameRegion(pFrame, sz);
  1068. if (!pRegion)
  1069. {
  1070. return (HRGN)rgnResult.Detach();
  1071. }
  1072. if (pRegion->rgnFrameLeft.GetSafeHandle())
  1073. {
  1074. rgnResult.CombineRgn(&rgnResult, &pRegion->rgnFrameLeft, RGN_DIFF);
  1075. }
  1076. if (pRegion->rgnFrameRight.GetSafeHandle())
  1077. {
  1078. CRgn rgnFrameRight;
  1079. rgnFrameRight.CreateRectRgn(0, 0, 0, 0);
  1080. rgnFrameRight.CopyRgn(&pRegion->rgnFrameRight);
  1081. rgnFrameRight.OffsetRgn(sz.cx - pRegion->rcFrameSizingMargins.right, 0);
  1082. rgnResult.CombineRgn(&rgnResult, &rgnFrameRight, RGN_DIFF);
  1083. }
  1084. if (pRegion->nRgnFrameCenter > 0)
  1085. {
  1086. CRgn rgnFrameCenter;
  1087. rgnFrameCenter.CreateRectRgn(pRegion->rcFrameSizingMargins.left, 0, sz.cx - pRegion->rcFrameSizingMargins.right, pRegion->nRgnFrameCenter);
  1088. rgnResult.CombineRgn(&rgnResult, &rgnFrameCenter, RGN_DIFF);
  1089. }
  1090. if (pRegion->bAutoDelete)
  1091. delete pRegion;
  1092. return (HRGN)rgnResult.Detach();
  1093. }
  1094. COLORREF CXTPSkinManagerSchema::GetColor(int nIndex) const
  1095. {
  1096. return m_pManager->GetMetrics()->GetColor(nIndex);
  1097. }
  1098. COLORREF CXTPSkinManagerSchema::GetScrollBarSizeBoxColor(CXTPSkinObjectFrame* /*pFrame*/)
  1099. {
  1100. return GetColor(COLOR_3DFACE);
  1101. }
  1102. void CXTPSkinManagerSchemaDefault::DrawThemeScrollBar(CDC* pDC, CXTPSkinObjectFrame* pFrame, XTP_SKINSCROLLBARPOSINFO* pSBInfo)
  1103. {
  1104. #define ABS_UPACTIVE  17
  1105. #define ABS_DOWNACTIVE 18
  1106. #define ABS_LEFTACTIVE 19
  1107. #define ABS_RIGHTACTIVE 20
  1108. #define GETPARTSTATE(ht, pressed, hot, normal, disabled, active) 
  1109. (!bEnabled ? disabled : nPressetHt == ht ? pressed : 
  1110. nHotHt == ht ? hot : bActive ? (active) : normal)
  1111. XTP_SKINSCROLLBARTRACKINFO* pSBTrack = pFrame->GetScrollBarTrackInfo();
  1112. BOOL nPressetHt = pSBTrack && pSBTrack->pSBInfo == pSBInfo ?
  1113. (pSBTrack->bTrackThumb || pSBTrack->fHitOld ? pSBInfo->ht : -1) : -1;
  1114. BOOL nHotHt = pSBTrack ? -1 : pSBInfo->ht;
  1115. BOOL bActive = (pSBTrack && pSBTrack->pSBInfo == pSBInfo) || nHotHt  > 0 ;
  1116. int cWidth = (pSBInfo->pxRight - pSBInfo->pxLeft);
  1117. BOOL fVert = pSBInfo->fVert;
  1118. if (cWidth <= 0)
  1119. {
  1120. return;
  1121. }
  1122. HBRUSH hBrush = pFrame->GetClientBrush(pDC);
  1123. FillRect(pDC->GetSafeHdc(), &pSBInfo->rc, hBrush);
  1124. BOOL bEnabled = pSBInfo->posMax - pSBInfo->posMin - pSBInfo->page + 1 > 0;
  1125. if (bEnabled && pSBInfo->nBar == SB_CTL)
  1126. bEnabled = (pFrame->GetStyle() & WS_DISABLED) == 0;
  1127. CXTPSkinManagerClass* pClassScrollBar = m_pManager->GetSkinClass(_T("SCROLLBAR"));
  1128. int nBtnTrackSize =   pSBInfo->pxThumbBottom - pSBInfo->pxThumbTop;
  1129. int nBtnTrackPos = pSBInfo->pxThumbTop - pSBInfo->pxUpArrow;
  1130. if (!bEnabled || pSBInfo->pxThumbBottom > pSBInfo->pxDownArrow)
  1131. nBtnTrackPos = nBtnTrackSize = 0;
  1132. int nStateCount = pClassScrollBar->GetThemeInt(SBP_ARROWBTN, 0, TMT_IMAGECOUNT, 16);
  1133. if (!fVert)
  1134. {
  1135. CRect rcHScroll(pSBInfo->rc);
  1136. CRect rcArrowLeft(rcHScroll.left, rcHScroll.top, pSBInfo->pxUpArrow, rcHScroll.bottom);
  1137. CRect rcArrowRight(pSBInfo->pxDownArrow, rcHScroll.top, rcHScroll.right, rcHScroll.bottom);
  1138. pClassScrollBar->DrawThemeBackground(pDC, SBP_ARROWBTN, GETPARTSTATE(XTP_HTSCROLLUP,
  1139. ABS_LEFTPRESSED, ABS_LEFTHOT, ABS_LEFTNORMAL, ABS_LEFTDISABLED, nStateCount == 20 ? ABS_LEFTACTIVE : ABS_LEFTNORMAL),  rcArrowLeft);
  1140. pClassScrollBar->DrawThemeBackground(pDC, SBP_ARROWBTN, GETPARTSTATE(XTP_HTSCROLLDOWN,
  1141. ABS_RIGHTPRESSED, ABS_RIGHTHOT, ABS_RIGHTNORMAL, ABS_RIGHTDISABLED, nStateCount == 20 ? ABS_RIGHTACTIVE : ABS_RIGHTNORMAL),  rcArrowRight);
  1142. CRect rcTrack(rcArrowLeft.right, rcHScroll.top, rcArrowRight.left, rcHScroll.bottom);
  1143. if (!rcTrack.IsRectEmpty())
  1144. {
  1145. CRect rcLowerTrack(rcTrack.left, rcTrack.top, rcTrack.left + nBtnTrackPos, rcTrack.bottom);
  1146. CRect rcBtnTrack(rcLowerTrack.right, rcTrack.top, rcLowerTrack.right + nBtnTrackSize, rcTrack.bottom);
  1147. CRect rcUpperTrack(rcBtnTrack.right, rcTrack.top, rcTrack.right, rcTrack.bottom);
  1148. if (!rcLowerTrack.IsRectEmpty())
  1149. pClassScrollBar->DrawThemeBackground(pDC, SBP_LOWERTRACKHORZ, GETPARTSTATE(XTP_HTSCROLLUPPAGE, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcLowerTrack);
  1150. if (!rcBtnTrack.IsRectEmpty())
  1151. {
  1152. pClassScrollBar->DrawThemeBackground(pDC, SBP_THUMBBTNHORZ, GETPARTSTATE(XTP_HTSCROLLTHUMB, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcBtnTrack);
  1153. if (rcBtnTrack.Width() > 9)
  1154. pClassScrollBar->DrawThemeBackground(pDC, SBP_GRIPPERHORZ, GETPARTSTATE(XTP_HTSCROLLTHUMB, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcBtnTrack);
  1155. }
  1156. if (!rcUpperTrack.IsRectEmpty())
  1157. pClassScrollBar->DrawThemeBackground(pDC, SBP_UPPERTRACKHORZ, GETPARTSTATE(XTP_HTSCROLLDOWNPAGE, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcUpperTrack);
  1158. }
  1159. }
  1160. else
  1161. {
  1162. CRect rcVScroll(pSBInfo->rc);
  1163. CRect rcArrowUp(rcVScroll.left, rcVScroll.top, rcVScroll.right, pSBInfo->pxUpArrow);
  1164. CRect rcArrowDown(rcVScroll.left, pSBInfo->pxDownArrow, rcVScroll.right, rcVScroll.bottom);
  1165. pClassScrollBar->DrawThemeBackground(pDC, SBP_ARROWBTN, GETPARTSTATE(XTP_HTSCROLLUP,
  1166. ABS_UPPRESSED, ABS_UPHOT, ABS_UPNORMAL, ABS_UPDISABLED,  nStateCount == 20 ? ABS_UPACTIVE : ABS_UPNORMAL),  rcArrowUp);
  1167. pClassScrollBar->DrawThemeBackground(pDC, SBP_ARROWBTN, GETPARTSTATE(XTP_HTSCROLLDOWN,
  1168. ABS_DOWNPRESSED, ABS_DOWNHOT, ABS_DOWNNORMAL, ABS_DOWNDISABLED, nStateCount == 20 ? ABS_DOWNACTIVE : ABS_DOWNNORMAL),  rcArrowDown);
  1169. CRect rcTrack(rcVScroll.left, rcArrowUp.bottom, rcVScroll.right, rcArrowDown.top);
  1170. if (!rcTrack.IsRectEmpty())
  1171. {
  1172. CRect rcLowerTrack(rcTrack.left, rcTrack.top, rcTrack.right, rcTrack.top + nBtnTrackPos);
  1173. CRect rcBtnTrack(rcTrack.left, rcLowerTrack.bottom, rcTrack.right, rcLowerTrack.bottom + nBtnTrackSize);
  1174. CRect rcUpperTrack(rcTrack.left, rcBtnTrack.bottom, rcTrack.right, rcTrack.bottom);
  1175. if (!rcLowerTrack.IsRectEmpty())
  1176. pClassScrollBar->DrawThemeBackground(pDC, SBP_LOWERTRACKVERT, GETPARTSTATE(XTP_HTSCROLLUPPAGE, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcLowerTrack);
  1177. if (!rcBtnTrack.IsRectEmpty())
  1178. {
  1179. pClassScrollBar->DrawThemeBackground(pDC, SBP_THUMBBTNVERT, GETPARTSTATE(XTP_HTSCROLLTHUMB, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcBtnTrack);
  1180. if (rcBtnTrack.Height() > 13)
  1181. pClassScrollBar->DrawThemeBackground(pDC, SBP_GRIPPERVERT, GETPARTSTATE(XTP_HTSCROLLTHUMB, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcBtnTrack);
  1182. }
  1183. if (!rcUpperTrack.IsRectEmpty())
  1184. pClassScrollBar->DrawThemeBackground(pDC, SBP_UPPERTRACKVERT, GETPARTSTATE(XTP_HTSCROLLDOWNPAGE, SCRBS_PRESSED, SCRBS_HOT, SCRBS_NORMAL, SCRBS_DISABLED, SCRBS_NORMAL),  rcUpperTrack);
  1185. }
  1186. }
  1187. }