SkinListCtrl.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. #include "Stdafx.h"
  2. #include "SkinListCtrl.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //排序信息
  5. struct tagSortInfo
  6. {
  7. bool bAscendSort; //升序标志
  8. WORD wColumnIndex; //列表索引
  9. CSkinListCtrl * pSkinListCtrl; //列表控件
  10. };
  11. //////////////////////////////////////////////////////////////////////////////////
  12. BEGIN_MESSAGE_MAP(CSkinHeaderCtrl, CHeaderCtrl)
  13. ON_WM_PAINT()
  14. ON_WM_ERASEBKGND()
  15. ON_WM_DESTROY()
  16. ON_WM_LBUTTONDOWN()
  17. ON_WM_LBUTTONUP()
  18. ON_MESSAGE(HDM_LAYOUT, OnLayout)
  19. END_MESSAGE_MAP()
  20. BEGIN_MESSAGE_MAP(CSkinListCtrl, CListCtrl)
  21. ON_WM_CREATE()
  22. ON_WM_DESTROY()
  23. ON_WM_ERASEBKGND()
  24. ON_WM_LBUTTONDOWN()
  25. ON_WM_MEASUREITEM_REFLECT()
  26. ON_WM_MOUSEMOVE()
  27. END_MESSAGE_MAP()
  28. //////////////////////////////////////////////////////////////////////////////////
  29. //默认属性
  30. #define LIST_STYTE LVS_EX_SUBITEMIMAGES|LVS_EX_FULLROWSELECT|LVS_EX_INFOTIP|LVS_EX_ONECLICKACTIVATE
  31. //////////////////////////////////////////////////////////////////////////////////
  32. //构造函数
  33. CSkinHeaderCtrl::CSkinHeaderCtrl()
  34. {
  35. //设置变量
  36. m_uLockCount=0L;
  37. m_uItemHeight=130;
  38. m_pBackImg = m_pPressImg = m_pGridImg = NULL;
  39. m_bPress = false;
  40. return;
  41. }
  42. //析构函数
  43. CSkinHeaderCtrl::~CSkinHeaderCtrl()
  44. {
  45. }
  46. //控件绑定
  47. VOID CSkinHeaderCtrl::PreSubclassWindow()
  48. {
  49. __super::PreSubclassWindow();
  50. ////创建字体
  51. //CFont Font;
  52. //Font.CreatePointFont(m_uItemHeight,TEXT("宋体"));
  53. ////设置字体
  54. //SetFont(&Font);
  55. return;
  56. }
  57. //控件消息
  58. BOOL CSkinHeaderCtrl::OnChildNotify(UINT uMessage, WPARAM wParam, LPARAM lParam, LRESULT * pLResult)
  59. {
  60. //变量定义
  61. NMHEADER * pNMHearder=(NMHEADER*)lParam;
  62. //拖动消息
  63. if ((pNMHearder->hdr.code==HDN_BEGINTRACKA)||(pNMHearder->hdr.code==HDN_BEGINTRACKW))
  64. {
  65. //禁止拖动
  66. if (pNMHearder->iItem<(INT)m_uLockCount)
  67. {
  68. *pLResult=TRUE;
  69. return TRUE;
  70. }
  71. }
  72. return __super::OnChildNotify(uMessage,wParam,lParam,pLResult);
  73. }
  74. //设置锁定
  75. VOID CSkinHeaderCtrl::SetLockCount(UINT uLockCount)
  76. {
  77. //设置变量
  78. m_uLockCount=uLockCount;
  79. return;
  80. }
  81. //设置列高
  82. VOID CSkinHeaderCtrl::SetItemHeight(UINT uItemHeight)
  83. {
  84. //设置变量
  85. m_uItemHeight=uItemHeight;
  86. ////设置控件
  87. //if (m_hWnd!=NULL)
  88. //{
  89. // //创建字体
  90. // CFont Font;
  91. // Font.CreatePointFont(m_uItemHeight,TEXT("宋体"));
  92. // //设置字体
  93. // SetFont(&Font);
  94. //}
  95. return;
  96. }
  97. //重画函数
  98. VOID CSkinHeaderCtrl::OnPaint()
  99. {
  100. CPaintDC dc(this);
  101. //获取位置
  102. CRect rcRect;
  103. GetClientRect(&rcRect);
  104. CMemoryDC BufferDC(&dc,rcRect);
  105. //设置 DC
  106. BufferDC.SetBkMode(TRANSPARENT);
  107. BufferDC.SetTextColor(m_colNormalText);
  108. BufferDC.SelectObject(GetCtrlFont());
  109. //绘画背景
  110. if (m_pBackImg != NULL && !m_pBackImg->IsNull())
  111. m_pBackImg->Draw(&BufferDC,rcRect);
  112. if (m_pPressImg != NULL && !m_pPressImg->IsNull() && m_bPress)
  113. {
  114. CRect rcItem;
  115. GetItemRect(m_uActiveItem,&rcItem);
  116. m_pPressImg->Draw(&BufferDC,rcItem);
  117. }
  118. //绘画子项
  119. CRect rcItem;
  120. HDITEM HDItem;
  121. TCHAR szBuffer[64];
  122. for (INT i=0;i<GetItemCount();i++)
  123. {
  124. //构造变量
  125. HDItem.mask=HDI_TEXT;
  126. HDItem.pszText=szBuffer;
  127. HDItem.cchTextMax=CountArray(szBuffer);
  128. //获取信息
  129. GetItem(i,&HDItem);
  130. GetItemRect(i,&rcItem);
  131. if (m_pGridImg != NULL && !m_pGridImg->IsNull())
  132. m_pGridImg->DrawImage(&BufferDC,(rcItem.right-m_pGridImg->GetWidth()),(rcItem.Height()-m_pGridImg->GetHeight())/2);
  133. //绘画标题
  134. rcItem.DeflateRect(3,1,3,1);
  135. BufferDC.DrawText(szBuffer,lstrlen(szBuffer),&rcItem,DT_END_ELLIPSIS|DT_SINGLELINE|DT_VCENTER|DT_CENTER);
  136. }
  137. return;
  138. }
  139. //背景函数
  140. BOOL CSkinHeaderCtrl::OnEraseBkgnd(CDC * pDC)
  141. {
  142. //刷新界面
  143. // Invalidate(FALSE);
  144. // UpdateWindow();
  145. return TRUE;
  146. }
  147. BOOL CSkinHeaderCtrl::SetBackImage( LPCTSTR lpNormal,CONST LPRECT lprcNinePart/*=NULL*/ )
  148. {
  149. RenderEngine->RemoveImage(m_pBackImg);
  150. m_pBackImg = RenderEngine->GetImage(lpNormal);
  151. if (NULL == m_pBackImg)
  152. return FALSE;
  153. else
  154. {
  155. m_pBackImg->SetNinePart(lprcNinePart);
  156. return TRUE;
  157. }
  158. }
  159. BOOL CSkinHeaderCtrl::SetPressImage( LPCTSTR lpNormal,CONST LPRECT lprcNinePart/*=NULL*/ )
  160. {
  161. RenderEngine->RemoveImage(m_pPressImg);
  162. m_pPressImg = RenderEngine->GetImage(lpNormal);
  163. if (NULL == m_pPressImg)
  164. return FALSE;
  165. else
  166. {
  167. m_pPressImg->SetNinePart(lprcNinePart);
  168. return TRUE;
  169. }
  170. }
  171. BOOL CSkinHeaderCtrl::SetGridImage( LPCTSTR lpNormal)
  172. {
  173. RenderEngine->RemoveImage(m_pGridImg);
  174. m_pGridImg = RenderEngine->GetImage(lpNormal);
  175. if (NULL == m_pGridImg)
  176. return FALSE;
  177. else
  178. {
  179. return TRUE;
  180. }
  181. }
  182. void CSkinHeaderCtrl::OnDestroy()
  183. {
  184. __super::OnDestroy();
  185. RenderEngine->RemoveImage(m_pBackImg);
  186. RenderEngine->RemoveImage(m_pPressImg);
  187. RenderEngine->RemoveImage(m_pGridImg);
  188. }
  189. LRESULT CSkinHeaderCtrl::OnLayout( WPARAM wParam, LPARAM lParam )
  190. {
  191. LRESULT lResult = CHeaderCtrl::DefWindowProc(HDM_LAYOUT, 0, lParam);
  192. HD_LAYOUT &hdl = *( HD_LAYOUT * ) lParam;
  193. RECT *prc = hdl.prc;
  194. WINDOWPOS *pwpos = hdl.pwpos;
  195. int nHeight = 28;
  196. pwpos->cy = nHeight;
  197. prc->top = nHeight;
  198. return lResult;
  199. }
  200. void CSkinHeaderCtrl::OnLButtonDown( UINT nFlags, CPoint point )
  201. {
  202. CRect rcItem;
  203. for (INT i=0;i<GetItemCount();i++)
  204. {
  205. GetItemRect(i,&rcItem);
  206. if ( PtInRect(&rcItem,point) )
  207. {
  208. m_bPress = true;
  209. m_uActiveItem = i;
  210. break;
  211. }
  212. }
  213. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  214. __super::OnLButtonDown(nFlags, point);
  215. }
  216. void CSkinHeaderCtrl::OnLButtonUp( UINT nFlags, CPoint point )
  217. {
  218. m_bPress = false;
  219. RedrawWindow(NULL,NULL,RDW_FRAME|RDW_INVALIDATE|RDW_ERASE|RDW_ERASENOW);
  220. __super::OnLButtonUp(nFlags, point);
  221. }
  222. //////////////////////////////////////////////////////////////////////////////////
  223. //构造函数
  224. CSkinListCtrl::CSkinListCtrl()
  225. {
  226. //设置变量
  227. m_bAscendSort=false;
  228. m_nHeightItem = 0;
  229. m_uActiveItem = 0;
  230. m_pHovenImg = m_pSelectImg = NULL;
  231. m_pCheckImg = m_pUnCheckImg = NULL;
  232. m_colBack=RGB(255,255,255);
  233. return;
  234. }
  235. //析构函数
  236. CSkinListCtrl::~CSkinListCtrl()
  237. {
  238. }
  239. //控件绑定
  240. VOID CSkinListCtrl::PreSubclassWindow()
  241. {
  242. __super::PreSubclassWindow();
  243. m_SkinHeaderCtrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
  244. return;
  245. }
  246. //绘画函数
  247. VOID CSkinListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
  248. {
  249. //变量定义
  250. CRect rcItem=lpDrawItemStruct->rcItem;
  251. CDC * pDC=CDC::FromHandle(lpDrawItemStruct->hDC);
  252. CMemoryDC BufferDC(pDC,rcItem);
  253. //获取属性
  254. INT nItemID=lpDrawItemStruct->itemID;
  255. INT nColumnCount=m_SkinHeaderCtrl.GetItemCount();
  256. //绘画区域
  257. CRect rcClipBox;
  258. BufferDC.GetClipBox(&rcClipBox);
  259. //设置环境
  260. BufferDC.SetBkMode(TRANSPARENT);
  261. BufferDC.SetTextColor(m_colNormalText);
  262. BufferDC.SelectObject(GetCtrlFont());
  263. BufferDC->FillSolidRect(&rcItem,m_colBack);
  264. //绘画焦点
  265. if (lpDrawItemStruct->itemState&ODS_SELECTED)
  266. {
  267. if (m_pSelectImg != NULL && !m_pSelectImg->IsNull())
  268. m_pSelectImg->Draw(&BufferDC,rcItem);
  269. }
  270. else if ( m_uActiveItem == nItemID )
  271. {
  272. if (m_pHovenImg != NULL && !m_pHovenImg->IsNull())
  273. m_pHovenImg->Draw(&BufferDC,rcItem);
  274. }
  275. //绘画子项
  276. for (INT i=0;i<nColumnCount;i++)
  277. {
  278. //获取位置
  279. CRect rcSubItem;
  280. GetSubItemRect(nItemID,i,LVIR_BOUNDS,rcSubItem);
  281. //绘画判断
  282. if (rcSubItem.left>rcClipBox.right) break;
  283. if (rcSubItem.right<rcClipBox.left) continue;
  284. //绘画数据
  285. DrawReportItem(&BufferDC,nItemID,rcSubItem,i);
  286. }
  287. return;
  288. }
  289. //建立消息
  290. INT CSkinListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  291. {
  292. if (__super::OnCreate(lpCreateStruct)==-1) return -1;
  293. m_SkinHeaderCtrl.SubclassWindow(GetHeaderCtrl()->GetSafeHwnd());
  294. return 0;
  295. }
  296. //绘画数据
  297. VOID CSkinListCtrl::DrawReportItem(CDC * pDC, INT nItem, CRect & rcSubItem, INT nColumnIndex)
  298. {
  299. //获取文字
  300. TCHAR szString[256]=TEXT("");
  301. GetItemText(nItem,nColumnIndex,szString,CountArray(szString));
  302. //绘画文字
  303. rcSubItem.left+=5;
  304. //绘制CheckButton
  305. if( nColumnIndex == 0 )
  306. {
  307. if ((m_pCheckImg != NULL && !m_pCheckImg->IsNull()) && (m_pUnCheckImg != NULL && !m_pUnCheckImg->IsNull()))
  308. {
  309. if( GetCheck(nItem) )
  310. m_pCheckImg->DrawImage(pDC,rcSubItem.left+2,rcSubItem.top+(rcSubItem.Height()-m_pCheckImg->GetHeight())/2);
  311. else
  312. m_pUnCheckImg->DrawImage(pDC,rcSubItem.left+2,rcSubItem.top+(rcSubItem.Height()-m_pUnCheckImg->GetHeight())/2);
  313. rcSubItem.left+=(8+m_pCheckImg->GetWidth());
  314. }
  315. CItemImgArray::iterator iter = m_ItemImgArray.begin();
  316. for (;iter != m_ItemImgArray.end(); ++iter )
  317. {
  318. if ( iter->nItem == nItem )
  319. {
  320. CImageEx *pImage = iter->pImage;
  321. if (pImage != NULL && !pImage->IsNull())
  322. {
  323. pImage->DrawImage(pDC,rcSubItem.left+2,rcSubItem.top+(rcSubItem.Height()-pImage->GetHeight())/2);
  324. rcSubItem.left+=(8+pImage->GetWidth());
  325. }
  326. break;
  327. }
  328. }
  329. }
  330. pDC->DrawText(szString,lstrlen(szString),&rcSubItem,DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS);
  331. return;
  332. }
  333. BOOL CSkinListCtrl::OnEraseBkgnd( CDC* pDC )
  334. {
  335. CRect rcClient;
  336. GetClientRect(&rcClient);
  337. //只绘制客户区内item之外的区域
  338. int nWidth = 0;
  339. int nHeight = 0;
  340. CRect rcHead;
  341. for (int i=0;i<m_SkinHeaderCtrl.GetItemCount();i++)
  342. {
  343. m_SkinHeaderCtrl.GetItemRect(i,&rcHead);
  344. nWidth+= rcHead.Width();
  345. nHeight = rcHead.Height();
  346. }
  347. rcClient.left = nWidth;
  348. rcClient.top = nHeight;
  349. pDC->FillSolidRect(&rcClient,m_colBack);
  350. return TRUE;
  351. }
  352. void CSkinListCtrl::SetItemHeight( int nHeight )
  353. {
  354. m_nHeightItem = nHeight;
  355. CRect rcWin;
  356. GetWindowRect(&rcWin);
  357. WINDOWPOS wp;
  358. wp.hwnd = m_hWnd;
  359. wp.cx = rcWin.Width();
  360. wp.cy = rcWin.Height();
  361. wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
  362. SendMessage(WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp);
  363. }
  364. void CSkinListCtrl::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
  365. {
  366. if (m_nHeightItem>0)
  367. {
  368. lpMeasureItemStruct->itemHeight = m_nHeightItem;
  369. }
  370. }
  371. void CSkinListCtrl::OnDestroy()
  372. {
  373. __super::OnDestroy();
  374. RenderEngine->RemoveImage(m_pHovenImg);
  375. RenderEngine->RemoveImage(m_pSelectImg);
  376. RenderEngine->RemoveImage(m_pCheckImg);
  377. RenderEngine->RemoveImage(m_pUnCheckImg);
  378. CItemImgArray::iterator iter = m_ItemImgArray.begin();
  379. for (;iter != m_ItemImgArray.end(); ++iter)
  380. {
  381. RenderEngine->RemoveImage(iter->pImage);
  382. }
  383. m_ItemImgArray.clear();
  384. RemoveScorll();
  385. }
  386. BOOL CSkinListCtrl::SetHovenImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
  387. {
  388. RenderEngine->RemoveImage(m_pHovenImg);
  389. m_pHovenImg = RenderEngine->GetImage(lpszFileName);
  390. if (NULL == m_pHovenImg)
  391. return FALSE;
  392. else
  393. {
  394. m_pHovenImg->SetNinePart(lprcNinePart);
  395. return TRUE;
  396. }
  397. }
  398. BOOL CSkinListCtrl::SetSelectImage( LPCTSTR lpszFileName,CONST LPRECT lprcNinePart/*=NULL*/ )
  399. {
  400. RenderEngine->RemoveImage(m_pSelectImg);
  401. m_pSelectImg = RenderEngine->GetImage(lpszFileName);
  402. if (NULL == m_pSelectImg)
  403. return FALSE;
  404. else
  405. {
  406. m_pSelectImg->SetNinePart(lprcNinePart);
  407. return TRUE;
  408. }
  409. }
  410. BOOL CSkinListCtrl::SetCheckImage( LPCTSTR lpszCheckName,LPCTSTR lpszUnCheckName )
  411. {
  412. RenderEngine->RemoveImage(m_pCheckImg);
  413. RenderEngine->RemoveImage(m_pUnCheckImg);
  414. m_pCheckImg = RenderEngine->GetImage(lpszCheckName);
  415. m_pUnCheckImg = RenderEngine->GetImage(lpszUnCheckName);
  416. if (NULL == m_pCheckImg || NULL == m_pUnCheckImg)
  417. return FALSE;
  418. else
  419. return TRUE;
  420. }
  421. BOOL CSkinListCtrl::InsertImage( int nItem,LPCTSTR lpszFileName )
  422. {
  423. CItemImgArray::iterator iter = m_ItemImgArray.begin();
  424. for (;iter != m_ItemImgArray.end(); ++iter )
  425. {
  426. if ( iter->nItem == nItem )
  427. {
  428. //当该节点存在图片时,我们更新新的图片资源
  429. if( iter->pImage != NULL )
  430. {
  431. RenderEngine->RemoveImage(iter->pImage);
  432. iter->pImage = RenderEngine->GetImage(lpszFileName);
  433. return TRUE;
  434. }
  435. }
  436. }
  437. tagItemImage ItemImage;
  438. //设置数据
  439. ItemImage.nItem = nItem;
  440. ItemImage.pImage = RenderEngine->GetImage(lpszFileName);
  441. if (NULL == ItemImage.pImage)
  442. return FALSE;
  443. else
  444. {
  445. m_ItemImgArray.push_back(ItemImage);
  446. return TRUE;
  447. }
  448. }
  449. void CSkinListCtrl::OnMouseMove( UINT nFlags, CPoint point )
  450. {
  451. CRect rcItem;
  452. static UINT uOldActiveItem = -1;
  453. for (int i=0;i<GetItemCount();i++)
  454. {
  455. GetItemRect(i,rcItem,LVIR_BOUNDS);
  456. if ( PtInRect(&rcItem,point) )
  457. {
  458. m_uActiveItem = i;
  459. if( uOldActiveItem != m_uActiveItem )
  460. {
  461. uOldActiveItem = m_uActiveItem;
  462. Invalidate(FALSE);
  463. }
  464. break;
  465. }
  466. }
  467. __super::OnMouseMove(nFlags, point);
  468. }
  469. void CSkinListCtrl::OnLButtonDown( UINT nFlags, CPoint point )
  470. {
  471. if (m_pCheckImg != NULL && !m_pCheckImg->IsNull())
  472. {
  473. CRect rcSubItem,rcIcon;
  474. for (int i=0;i<GetItemCount();i++)
  475. {
  476. GetItemRect(i,rcSubItem,LVIR_BOUNDS);
  477. rcIcon.left = rcSubItem.left+7;
  478. rcIcon.top = rcSubItem.top+(rcSubItem.Height()-m_pCheckImg->GetHeight())/2;
  479. rcIcon.right = rcIcon.left + m_pCheckImg->GetWidth();
  480. rcIcon.bottom = rcIcon.top + m_pCheckImg->GetHeight();
  481. if ( PtInRect(&rcIcon,point) )
  482. {
  483. SetCheck(i,!GetCheck(i));
  484. SetItemState(i, LVIS_FOCUSED | LVIS_SELECTED,LVIS_FOCUSED | LVIS_SELECTED);
  485. SetSelectionMark(i);
  486. Invalidate(FALSE);
  487. break;
  488. }
  489. }
  490. }
  491. __super::OnLButtonDown(nFlags, point);
  492. }
  493. int CSkinListCtrl::InsertItem( const LVITEM* pItem )
  494. {
  495. int nResult = __super::InsertItem(pItem);
  496. SetCheck(pItem->iItem,FALSE);
  497. return nResult;
  498. }
  499. int CSkinListCtrl::InsertItem( int nItem, LPCTSTR lpszItem )
  500. {
  501. int nResult = __super::InsertItem(nItem,lpszItem);
  502. SetCheck(nItem,FALSE);
  503. return nResult;
  504. }
  505. int CSkinListCtrl::InsertItem( int nItem, LPCTSTR lpszItem, int nImage )
  506. {
  507. int nResult = __super::InsertItem(nItem,lpszItem,nImage);
  508. SetCheck(nItem,FALSE);
  509. return nResult;
  510. }
  511. int CSkinListCtrl::InsertItem( UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState,UINT nStateMask, int nImage, LPARAM lParam )
  512. {
  513. int nResult = __super::InsertItem(nMask,nItem,lpszItem,nState,nStateMask,nImage,lParam);
  514. SetCheck(nItem,FALSE);
  515. return nResult;
  516. }
  517. DWORD CSkinListCtrl::SetExtendedStyle( DWORD dwNewStyle )
  518. {
  519. if ( dwNewStyle & LVS_EX_CHECKBOXES )
  520. {
  521. dwNewStyle &=~LVS_EX_CHECKBOXES;
  522. dwNewStyle &=~LVS_EX_GRIDLINES;
  523. }
  524. return __super::SetExtendedStyle(dwNewStyle);
  525. }
  526. void CSkinListCtrl::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  527. {
  528. ISkinControl::SetAttribute(pstrName,pstrValue);
  529. if( _tcscmp(pstrName, _T("scrollimage")) == 0 )
  530. {
  531. SetScrollImage(this,pstrValue);
  532. }
  533. else if( _tcscmp(pstrName, _T("itemheight")) == 0 )
  534. {
  535. SetItemHeight(_ttoi(pstrValue));
  536. }
  537. }
  538. void CSkinListCtrl::ParseItem( CXmlNode *root )
  539. {
  540. if( root == NULL ) return;
  541. int nAttributes = root->GetAttributeCount();
  542. LPCTSTR pstrClass = NULL;
  543. LPCTSTR pstrName = NULL;
  544. LPCTSTR pstrValue = NULL;
  545. for( int i = 0; i < nAttributes; i++ )
  546. {
  547. pstrClass = root->GetName();
  548. pstrName = root->GetAttributeName(i);
  549. pstrValue = root->GetAttributeValue(i);
  550. if( _tcscmp(pstrClass, _T("headbkimage")) == 0 )
  551. {
  552. if( _tcscmp(pstrName, _T("value")) == 0 ) m_SkinHeaderCtrl.SetBackImage(pstrValue);
  553. else if( _tcscmp(pstrName, _T("ninepart")) == 0 )
  554. {
  555. LPTSTR pstr = NULL;
  556. CRect rc;
  557. rc.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  558. rc.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  559. rc.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  560. rc.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  561. // if (m_pBackImgN != NULL)
  562. // m_pBackImgN->SetNinePart(&rc);
  563. if (m_SkinHeaderCtrl.m_pBackImg != NULL)
  564. m_SkinHeaderCtrl.m_pBackImg->SetNinePart(&rc);
  565. }
  566. }
  567. else if( _tcscmp(pstrClass, _T("headpressimage")) == 0 )
  568. {
  569. if( _tcscmp(pstrName, _T("value")) == 0 ) m_SkinHeaderCtrl.SetPressImage(pstrValue);
  570. else if( _tcscmp(pstrName, _T("ninepart")) == 0 )
  571. {
  572. LPTSTR pstr = NULL;
  573. CRect rc;
  574. rc.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  575. rc.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  576. rc.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  577. rc.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  578. if (m_SkinHeaderCtrl.m_pPressImg != NULL)
  579. m_SkinHeaderCtrl.m_pPressImg->SetNinePart(&rc);
  580. }
  581. }
  582. else if( _tcscmp(pstrClass, _T("headgirdimage")) == 0 )
  583. {
  584. if( _tcscmp(pstrName, _T("value")) == 0 ) m_SkinHeaderCtrl.SetGridImage(pstrValue);
  585. }
  586. else if( _tcscmp(pstrClass, _T("hovenimage")) == 0 )
  587. {
  588. if( _tcscmp(pstrName, _T("value")) == 0 ) SetHovenImage(pstrValue);
  589. else if( _tcscmp(pstrName, _T("ninepart")) == 0 )
  590. {
  591. LPTSTR pstr = NULL;
  592. CRect rc;
  593. rc.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  594. rc.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  595. rc.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  596. rc.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  597. if (m_pHovenImg != NULL)
  598. m_pHovenImg->SetNinePart(&rc);
  599. }
  600. }
  601. else if( _tcscmp(pstrClass, _T("selectimage")) == 0 )
  602. {
  603. if( _tcscmp(pstrName, _T("value")) == 0 ) SetSelectImage(pstrValue);
  604. else if( _tcscmp(pstrName, _T("ninepart")) == 0 )
  605. {
  606. LPTSTR pstr = NULL;
  607. CRect rc;
  608. rc.left = _tcstol(pstrValue, &pstr, 10); ASSERT(pstr);
  609. rc.top = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  610. rc.right = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  611. rc.bottom = _tcstol(pstr + 1, &pstr, 10); ASSERT(pstr);
  612. if (m_pSelectImg != NULL)
  613. m_pSelectImg->SetNinePart(&rc);
  614. }
  615. }
  616. else if( _tcscmp(pstrClass, _T("checkimage")) == 0 )
  617. {
  618. if( _tcscmp(pstrName, _T("value1")) == 0 )
  619. {
  620. RenderEngine->RemoveImage(m_pCheckImg);
  621. m_pCheckImg = RenderEngine->GetImage(pstrValue);
  622. }
  623. else if( _tcscmp(pstrName, _T("value2")) == 0 )
  624. {
  625. RenderEngine->RemoveImage(m_pUnCheckImg);
  626. m_pUnCheckImg = RenderEngine->GetImage(pstrValue);
  627. }
  628. }
  629. }
  630. }
  631. BOOL CSkinListCtrl::CreateControl( CWnd* pParentWnd )
  632. {
  633. if( !Create(WS_CHILD|WS_VISIBLE|LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP ,CRect(0,0,0,0),pParentWnd,0) )
  634. return FALSE;
  635. SetFont(CFont::FromHandle(RenderEngine->GetDeaultFont()));
  636. m_pOwnWnd = this;
  637. return TRUE;
  638. }
  639. //////////////////////////////////////////////////////////////////////////////////