UITreeView.cpp 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232
  1. #include "StdAfx.h"
  2. #include "UITreeView.h"
  3. #pragma warning( disable: 4251 )
  4. namespace DuiLib
  5. {
  6. //************************************
  7. // 函数名称: CTreeNodeUI
  8. // 返回类型:
  9. // 参数信息: CTreeNodeUI * _ParentNode
  10. // 函数说明:
  11. //************************************
  12. CTreeNodeUI::CTreeNodeUI( CTreeNodeUI* _ParentNode /*= NULL*/ )
  13. {
  14. m_dwItemTextColor = 0x00000000;
  15. m_dwItemHotTextColor = 0;
  16. m_dwSelItemTextColor = 0;
  17. m_dwSelItemHotTextColor = 0;
  18. pTreeView = NULL;
  19. m_bIsVisable = true;
  20. m_bIsCheckBox = false;
  21. pParentTreeNode = NULL;
  22. pHoriz = new CHorizontalLayoutUI();
  23. pFolderButton = new CCheckBoxUI();
  24. pDottedLine = new CLabelUI();
  25. pCheckBox = new CCheckBoxUI();
  26. pItemButton = new COptionUI();
  27. this->SetFixedHeight(18);
  28. this->SetFixedWidth(250);
  29. pFolderButton->SetFixedWidth(GetFixedHeight());
  30. pDottedLine->SetFixedWidth(2);
  31. pCheckBox->SetFixedWidth(GetFixedHeight());
  32. pItemButton->SetAttribute(_T("align"),_T("left"));
  33. pDottedLine->SetVisible(false);
  34. pCheckBox->SetVisible(false);
  35. pItemButton->SetMouseEnabled(false);
  36. if(_ParentNode)
  37. {
  38. if (_tcsicmp(_ParentNode->GetClass(), DUI_CTR_TREENODE) != 0)
  39. return;
  40. pDottedLine->SetVisible(_ParentNode->IsVisible());
  41. pDottedLine->SetFixedWidth(_ParentNode->GetDottedLine()->GetFixedWidth()+16);
  42. this->SetParentNode(_ParentNode);
  43. }
  44. pHoriz->Add(pDottedLine);
  45. pHoriz->Add(pFolderButton);
  46. pHoriz->Add(pCheckBox);
  47. pHoriz->Add(pItemButton);
  48. Add(pHoriz);
  49. }
  50. //************************************
  51. // 函数名称: ~CTreeNodeUI
  52. // 返回类型:
  53. // 参数信息: void
  54. // 函数说明:
  55. //************************************
  56. CTreeNodeUI::~CTreeNodeUI( void )
  57. {
  58. }
  59. //************************************
  60. // 函数名称: GetClass
  61. // 返回类型: LPCTSTR
  62. // 函数说明:
  63. //************************************
  64. LPCTSTR CTreeNodeUI::GetClass() const
  65. {
  66. return DUI_CTR_TREENODE;
  67. }
  68. //************************************
  69. // 函数名称: GetInterface
  70. // 返回类型: LPVOID
  71. // 参数信息: LPCTSTR pstrName
  72. // 函数说明:
  73. //************************************
  74. LPVOID CTreeNodeUI::GetInterface( LPCTSTR pstrName )
  75. {
  76. if( _tcscmp(pstrName, DUI_CTR_TREENODE) == 0 ) return static_cast<CTreeNodeUI*>(this);
  77. return CListContainerElementUI::GetInterface(pstrName);
  78. }
  79. //************************************
  80. // 函数名称: DoEvent
  81. // 返回类型: void
  82. // 参数信息: TEventUI & event
  83. // 函数说明:
  84. //************************************
  85. void CTreeNodeUI::DoEvent( TEventUI& event )
  86. {
  87. if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
  88. if( m_pOwner != NULL ) m_pOwner->DoEvent(event);
  89. else CContainerUI::DoEvent(event);
  90. return;
  91. }
  92. CListContainerElementUI::DoEvent(event);
  93. if( event.Type == UIEVENT_DBLCLICK )
  94. {
  95. if( IsEnabled() ) {
  96. m_pManager->SendNotify(this, DUI_MSGTYPE_ITEMDBCLICK);
  97. Invalidate();
  98. }
  99. return;
  100. }
  101. if( event.Type == UIEVENT_MOUSEENTER )
  102. {
  103. if( IsEnabled()) {
  104. if(m_bSelected && GetSelItemHotTextColor())
  105. pItemButton->SetTextColor(GetSelItemHotTextColor());
  106. else
  107. pItemButton->SetTextColor(GetItemHotTextColor());
  108. }
  109. else
  110. pItemButton->SetTextColor(pItemButton->GetDisabledTextColor());
  111. //return;
  112. }
  113. if( event.Type == UIEVENT_MOUSELEAVE )
  114. {
  115. if( IsEnabled()) {
  116. if(m_bSelected && GetSelItemTextColor())
  117. pItemButton->SetTextColor(GetSelItemTextColor());
  118. else if(!m_bSelected)
  119. pItemButton->SetTextColor(GetItemTextColor());
  120. }
  121. else
  122. pItemButton->SetTextColor(pItemButton->GetDisabledTextColor());
  123. //return;
  124. }
  125. }
  126. //************************************
  127. // 函数名称: Invalidate
  128. // 返回类型: void
  129. // 函数说明:
  130. //************************************
  131. void CTreeNodeUI::Invalidate()
  132. {
  133. if( !IsVisible() )
  134. return;
  135. if( GetParent() ) {
  136. CContainerUI* pParentContainer = static_cast<CContainerUI*>(GetParent()->GetInterface(DUI_CTR_CONTAINER));
  137. if( pParentContainer ) {
  138. RECT rc = pParentContainer->GetPos();
  139. RECT rcInset = pParentContainer->GetInset();
  140. rc.left += rcInset.left;
  141. rc.top += rcInset.top;
  142. rc.right -= rcInset.right;
  143. rc.bottom -= rcInset.bottom;
  144. CScrollBarUI* pVerticalScrollBar = pParentContainer->GetVerticalScrollBar();
  145. if( pVerticalScrollBar && pVerticalScrollBar->IsVisible() ) rc.right -= pVerticalScrollBar->GetFixedWidth();
  146. CScrollBarUI* pHorizontalScrollBar = pParentContainer->GetHorizontalScrollBar();
  147. if( pHorizontalScrollBar && pHorizontalScrollBar->IsVisible() ) rc.bottom -= pHorizontalScrollBar->GetFixedHeight();
  148. RECT invalidateRc = m_rcItem;
  149. if( !::IntersectRect(&invalidateRc, &m_rcItem, &rc) )
  150. return;
  151. CControlUI* pParent = GetParent();
  152. RECT rcTemp;
  153. RECT rcParent;
  154. while( pParent = pParent->GetParent() )
  155. {
  156. rcTemp = invalidateRc;
  157. rcParent = pParent->GetPos();
  158. if( !::IntersectRect(&invalidateRc, &rcTemp, &rcParent) )
  159. return;
  160. }
  161. if( m_pManager != NULL ) m_pManager->Invalidate(invalidateRc);
  162. }
  163. else {
  164. CContainerUI::Invalidate();
  165. }
  166. }
  167. else {
  168. CContainerUI::Invalidate();
  169. }
  170. }
  171. //************************************
  172. // 函数名称: Select
  173. // 返回类型: bool
  174. // 参数信息: bool bSelect
  175. // 函数说明:
  176. //************************************
  177. bool CTreeNodeUI::Select( bool bSelect /*= true*/, bool bTriggerEvent)
  178. {
  179. bool nRet = CListContainerElementUI::Select(bSelect, bTriggerEvent);
  180. if(m_bSelected)
  181. pItemButton->SetTextColor(GetSelItemTextColor());
  182. else
  183. pItemButton->SetTextColor(GetItemTextColor());
  184. return nRet;
  185. }
  186. //************************************
  187. // 函数名称: Add
  188. // 返回类型: bool
  189. // 参数信息: CControlUI * _pTreeNodeUI
  190. // 函数说明: 通过节点对象添加节点
  191. //************************************
  192. bool CTreeNodeUI::Add( CControlUI* _pTreeNodeUI )
  193. {
  194. if (_tcsicmp(_pTreeNodeUI->GetClass(), DUI_CTR_TREENODE) == 0)
  195. return AddChildNode((CTreeNodeUI*)_pTreeNodeUI);
  196. return CListContainerElementUI::Add(_pTreeNodeUI);
  197. }
  198. //************************************
  199. // 函数名称: AddAt
  200. // 返回类型: bool
  201. // 参数信息: CControlUI * pControl
  202. // 参数信息: int iIndex 该参数仅针对当前节点下的兄弟索引,并非列表视图索引
  203. // 函数说明:
  204. //************************************
  205. bool CTreeNodeUI::AddAt( CControlUI* pControl, int iIndex )
  206. {
  207. if(NULL == static_cast<CTreeNodeUI*>(pControl->GetInterface(DUI_CTR_TREENODE)))
  208. return false;
  209. CTreeNodeUI* pIndexNode = static_cast<CTreeNodeUI*>(mTreeNodes.GetAt(iIndex));
  210. if(!pIndexNode){
  211. if(!mTreeNodes.Add(pControl))
  212. return false;
  213. }
  214. else if(pIndexNode && !mTreeNodes.InsertAt(iIndex,pControl))
  215. return false;
  216. if(!pIndexNode && pTreeView && pTreeView->GetItemAt(GetTreeIndex()+1))
  217. pIndexNode = static_cast<CTreeNodeUI*>(pTreeView->GetItemAt(GetTreeIndex()+1)->GetInterface(DUI_CTR_TREENODE));
  218. pControl = CalLocation((CTreeNodeUI*)pControl);
  219. if(pTreeView && pIndexNode)
  220. return pTreeView->AddAt((CTreeNodeUI*)pControl,pIndexNode);
  221. else
  222. return pTreeView->Add((CTreeNodeUI*)pControl);
  223. return true;
  224. }
  225. //************************************
  226. // 函数名称: SetVisibleTag
  227. // 返回类型: void
  228. // 参数信息: bool _IsVisible
  229. // 函数说明:
  230. //************************************
  231. void CTreeNodeUI::SetVisibleTag( bool _IsVisible )
  232. {
  233. m_bIsVisable = _IsVisible;
  234. }
  235. //************************************
  236. // 函数名称: GetVisibleTag
  237. // 返回类型: bool
  238. // 函数说明:
  239. //************************************
  240. bool CTreeNodeUI::GetVisibleTag()
  241. {
  242. return m_bIsVisable;
  243. }
  244. //************************************
  245. // 函数名称: SetItemText
  246. // 返回类型: void
  247. // 参数信息: LPCTSTR pstrValue
  248. // 函数说明:
  249. //************************************
  250. void CTreeNodeUI::SetItemText( LPCTSTR pstrValue )
  251. {
  252. pItemButton->SetText(pstrValue);
  253. }
  254. //************************************
  255. // 函数名称: GetItemText
  256. // 返回类型: UiLib::CDuiString
  257. // 函数说明:
  258. //************************************
  259. CDuiString CTreeNodeUI::GetItemText()
  260. {
  261. return pItemButton->GetText();
  262. }
  263. //************************************
  264. // 函数名称: CheckBoxSelected
  265. // 返回类型: void
  266. // 参数信息: bool _Selected
  267. // 函数说明:
  268. //************************************
  269. void CTreeNodeUI::CheckBoxSelected( bool _Selected )
  270. {
  271. pCheckBox->Selected(_Selected);
  272. }
  273. //************************************
  274. // 函数名称: IsCheckBoxSelected
  275. // 返回类型: bool
  276. // 函数说明:
  277. //************************************
  278. bool CTreeNodeUI::IsCheckBoxSelected() const
  279. {
  280. return pCheckBox->IsSelected();
  281. }
  282. //************************************
  283. // 函数名称: IsHasChild
  284. // 返回类型: bool
  285. // 函数说明:
  286. //************************************
  287. bool CTreeNodeUI::IsHasChild() const
  288. {
  289. return !mTreeNodes.IsEmpty();
  290. }
  291. //************************************
  292. // 函数名称: AddChildNode
  293. // 返回类型: bool
  294. // 参数信息: CTreeNodeUI * _pTreeNodeUI
  295. // 函数说明:
  296. //************************************
  297. bool CTreeNodeUI::AddChildNode( CTreeNodeUI* _pTreeNodeUI )
  298. {
  299. if (!_pTreeNodeUI)
  300. return false;
  301. if (_tcsicmp(_pTreeNodeUI->GetClass(), DUI_CTR_TREENODE) != 0)
  302. return false;
  303. _pTreeNodeUI = CalLocation(_pTreeNodeUI);
  304. bool nRet = true;
  305. if(pTreeView){
  306. CTreeNodeUI* pNode = static_cast<CTreeNodeUI*>(mTreeNodes.GetAt(mTreeNodes.GetSize()-1));
  307. if(!pNode || !pNode->GetLastNode())
  308. nRet = pTreeView->AddAt(_pTreeNodeUI,GetTreeIndex()+1) >= 0;
  309. else nRet = pTreeView->AddAt(_pTreeNodeUI,pNode->GetLastNode()->GetTreeIndex()+1) >= 0;
  310. }
  311. if(nRet)
  312. mTreeNodes.Add(_pTreeNodeUI);
  313. return nRet;
  314. }
  315. //************************************
  316. // 函数名称: RemoveAt
  317. // 返回类型: bool
  318. // 参数信息: CTreeNodeUI * _pTreeNodeUI
  319. // 函数说明:
  320. //************************************
  321. bool CTreeNodeUI::RemoveAt( CTreeNodeUI* _pTreeNodeUI )
  322. {
  323. int nIndex = mTreeNodes.Find(_pTreeNodeUI);
  324. CTreeNodeUI* pNode = static_cast<CTreeNodeUI*>(mTreeNodes.GetAt(nIndex));
  325. if(pNode && pNode == _pTreeNodeUI)
  326. {
  327. while(pNode->IsHasChild())
  328. pNode->RemoveAt(static_cast<CTreeNodeUI*>(pNode->mTreeNodes.GetAt(0)));
  329. mTreeNodes.Remove(nIndex);
  330. if(pTreeView)
  331. pTreeView->Remove(_pTreeNodeUI);
  332. return true;
  333. }
  334. return false;
  335. }
  336. //************************************
  337. // 函数名称: SetParentNode
  338. // 返回类型: void
  339. // 参数信息: CTreeNodeUI * _pParentTreeNode
  340. // 函数说明:
  341. //************************************
  342. void CTreeNodeUI::SetParentNode( CTreeNodeUI* _pParentTreeNode )
  343. {
  344. pParentTreeNode = _pParentTreeNode;
  345. }
  346. //************************************
  347. // 函数名称: GetParentNode
  348. // 返回类型: CTreeNodeUI*
  349. // 函数说明:
  350. //************************************
  351. CTreeNodeUI* CTreeNodeUI::GetParentNode()
  352. {
  353. return pParentTreeNode;
  354. }
  355. //************************************
  356. // 函数名称: GetCountChild
  357. // 返回类型: long
  358. // 函数说明:
  359. //************************************
  360. long CTreeNodeUI::GetCountChild()
  361. {
  362. return mTreeNodes.GetSize();
  363. }
  364. //************************************
  365. // 函数名称: SetTreeView
  366. // 返回类型: void
  367. // 参数信息: CTreeViewUI * _CTreeViewUI
  368. // 函数说明:
  369. //************************************
  370. void CTreeNodeUI::SetTreeView( CTreeViewUI* _CTreeViewUI )
  371. {
  372. pTreeView = _CTreeViewUI;
  373. }
  374. //************************************
  375. // 函数名称: GetTreeView
  376. // 返回类型: CTreeViewUI*
  377. // 函数说明:
  378. //************************************
  379. CTreeViewUI* CTreeNodeUI::GetTreeView()
  380. {
  381. return pTreeView;
  382. }
  383. //************************************
  384. // 函数名称: SetAttribute
  385. // 返回类型: void
  386. // 参数信息: LPCTSTR pstrName
  387. // 参数信息: LPCTSTR pstrValue
  388. // 函数说明:
  389. //************************************
  390. void CTreeNodeUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  391. {
  392. if(_tcscmp(pstrName, _T("text")) == 0 )
  393. pItemButton->SetText(pstrValue);
  394. else if(_tcscmp(pstrName, _T("horizattr")) == 0 )
  395. pHoriz->SetAttributeList(pstrValue);
  396. else if(_tcscmp(pstrName, _T("dotlineattr")) == 0 )
  397. pDottedLine->SetAttributeList(pstrValue);
  398. else if(_tcscmp(pstrName, _T("folderattr")) == 0 )
  399. pFolderButton->SetAttributeList(pstrValue);
  400. else if(_tcscmp(pstrName, _T("checkboxattr")) == 0 )
  401. pCheckBox->SetAttributeList(pstrValue);
  402. else if(_tcscmp(pstrName, _T("itemattr")) == 0 )
  403. pItemButton->SetAttributeList(pstrValue);
  404. else if(_tcscmp(pstrName, _T("itemtextcolor")) == 0 ){
  405. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  406. LPTSTR pstr = NULL;
  407. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  408. SetItemTextColor(clrColor);
  409. }
  410. else if(_tcscmp(pstrName, _T("itemhottextcolor")) == 0 ){
  411. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  412. LPTSTR pstr = NULL;
  413. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  414. SetItemHotTextColor(clrColor);
  415. }
  416. else if(_tcscmp(pstrName, _T("selitemtextcolor")) == 0 ){
  417. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  418. LPTSTR pstr = NULL;
  419. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  420. SetSelItemTextColor(clrColor);
  421. }
  422. else if(_tcscmp(pstrName, _T("selitemhottextcolor")) == 0 ){
  423. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  424. LPTSTR pstr = NULL;
  425. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  426. SetSelItemHotTextColor(clrColor);
  427. }
  428. else CListContainerElementUI::SetAttribute(pstrName,pstrValue);
  429. }
  430. //************************************
  431. // 函数名称: GetTreeNodes
  432. // 返回类型: UiLib::CDuiPtrArray
  433. // 函数说明:
  434. //************************************
  435. CDuiPtrArray CTreeNodeUI::GetTreeNodes()
  436. {
  437. return mTreeNodes;
  438. }
  439. //************************************
  440. // 函数名称: GetChildNode
  441. // 返回类型: CTreeNodeUI*
  442. // 参数信息: int _nIndex
  443. // 函数说明:
  444. //************************************
  445. CTreeNodeUI* CTreeNodeUI::GetChildNode( int _nIndex )
  446. {
  447. return static_cast<CTreeNodeUI*>(mTreeNodes.GetAt(_nIndex));
  448. }
  449. //************************************
  450. // 函数名称: SetVisibleFolderBtn
  451. // 返回类型: void
  452. // 参数信息: bool _IsVisibled
  453. // 函数说明:
  454. //************************************
  455. void CTreeNodeUI::SetVisibleFolderBtn( bool _IsVisibled )
  456. {
  457. pFolderButton->SetVisible(_IsVisibled);
  458. }
  459. //************************************
  460. // 函数名称: GetVisibleFolderBtn
  461. // 返回类型: bool
  462. // 函数说明:
  463. //************************************
  464. bool CTreeNodeUI::GetVisibleFolderBtn()
  465. {
  466. return pFolderButton->IsVisible();
  467. }
  468. //************************************
  469. // 函数名称: SetVisibleCheckBtn
  470. // 返回类型: void
  471. // 参数信息: bool _IsVisibled
  472. // 函数说明:
  473. //************************************
  474. void CTreeNodeUI::SetVisibleCheckBtn( bool _IsVisibled )
  475. {
  476. pCheckBox->SetVisible(_IsVisibled);
  477. }
  478. //************************************
  479. // 函数名称: GetVisibleCheckBtn
  480. // 返回类型: bool
  481. // 函数说明:
  482. //************************************
  483. bool CTreeNodeUI::GetVisibleCheckBtn()
  484. {
  485. return pCheckBox->IsVisible();
  486. }
  487. //************************************
  488. // 函数名称: GetNodeIndex
  489. // 返回类型: int
  490. // 函数说明: 取得全局树视图的索引
  491. //************************************
  492. int CTreeNodeUI::GetTreeIndex()
  493. {
  494. if(!pTreeView)
  495. return -1;
  496. for(int nIndex = 0;nIndex < pTreeView->GetCount();nIndex++){
  497. if(this == pTreeView->GetItemAt(nIndex))
  498. return nIndex;
  499. }
  500. return -1;
  501. }
  502. //************************************
  503. // 函数名称: GetNodeIndex
  504. // 返回类型: int
  505. // 函数说明: 取得相对于兄弟节点的当前索引
  506. //************************************
  507. int CTreeNodeUI::GetNodeIndex()
  508. {
  509. if(!GetParentNode() && !pTreeView)
  510. return -1;
  511. if(!GetParentNode() && pTreeView)
  512. return GetTreeIndex();
  513. return GetParentNode()->GetTreeNodes().Find(this);
  514. }
  515. //************************************
  516. // 函数名称: GetLastNode
  517. // 返回类型: CTreeNodeUI*
  518. // 函数说明:
  519. //************************************
  520. CTreeNodeUI* CTreeNodeUI::GetLastNode( )
  521. {
  522. if(!IsHasChild())
  523. return this;
  524. CTreeNodeUI* nRetNode = NULL;
  525. for(int nIndex = 0;nIndex < GetTreeNodes().GetSize();nIndex++){
  526. CTreeNodeUI* pNode = static_cast<CTreeNodeUI*>(GetTreeNodes().GetAt(nIndex));
  527. if(!pNode)
  528. continue;
  529. CDuiString aa = pNode->GetItemText();
  530. if(pNode->IsHasChild())
  531. nRetNode = pNode->GetLastNode();
  532. else
  533. nRetNode = pNode;
  534. }
  535. return nRetNode;
  536. }
  537. //************************************
  538. // 函数名称: CalLocation
  539. // 返回类型: CTreeNodeUI*
  540. // 参数信息: CTreeNodeUI * _pTreeNodeUI
  541. // 函数说明: 缩进计算
  542. //************************************
  543. CTreeNodeUI* CTreeNodeUI::CalLocation( CTreeNodeUI* _pTreeNodeUI )
  544. {
  545. _pTreeNodeUI->GetDottedLine()->SetVisible(true);
  546. _pTreeNodeUI->GetDottedLine()->SetFixedWidth(pDottedLine->GetFixedWidth()+16);
  547. _pTreeNodeUI->SetParentNode(this);
  548. _pTreeNodeUI->GetItemButton()->SetGroup(pItemButton->GetGroup());
  549. _pTreeNodeUI->SetTreeView(pTreeView);
  550. return _pTreeNodeUI;
  551. }
  552. //************************************
  553. // 函数名称: SetTextColor
  554. // 返回类型: void
  555. // 参数信息: DWORD _dwTextColor
  556. // 函数说明:
  557. //************************************
  558. void CTreeNodeUI::SetItemTextColor( DWORD _dwItemTextColor )
  559. {
  560. m_dwItemTextColor = _dwItemTextColor;
  561. pItemButton->SetTextColor(m_dwItemTextColor);
  562. }
  563. //************************************
  564. // 函数名称: GetTextColor
  565. // 返回类型: DWORD
  566. // 函数说明:
  567. //************************************
  568. DWORD CTreeNodeUI::GetItemTextColor() const
  569. {
  570. return m_dwItemTextColor;
  571. }
  572. //************************************
  573. // 函数名称: SetTextHotColor
  574. // 返回类型: void
  575. // 参数信息: DWORD _dwTextHotColor
  576. // 函数说明:
  577. //************************************
  578. void CTreeNodeUI::SetItemHotTextColor( DWORD _dwItemHotTextColor )
  579. {
  580. m_dwItemHotTextColor = _dwItemHotTextColor;
  581. Invalidate();
  582. }
  583. //************************************
  584. // 函数名称: GetTextHotColor
  585. // 返回类型: DWORD
  586. // 函数说明:
  587. //************************************
  588. DWORD CTreeNodeUI::GetItemHotTextColor() const
  589. {
  590. return m_dwItemHotTextColor;
  591. }
  592. //************************************
  593. // 函数名称: SetSelItemTextColor
  594. // 返回类型: void
  595. // 参数信息: DWORD _dwSelItemTextColor
  596. // 函数说明:
  597. //************************************
  598. void CTreeNodeUI::SetSelItemTextColor( DWORD _dwSelItemTextColor )
  599. {
  600. m_dwSelItemTextColor = _dwSelItemTextColor;
  601. Invalidate();
  602. }
  603. //************************************
  604. // 函数名称: GetSelItemTextColor
  605. // 返回类型: DWORD
  606. // 函数说明:
  607. //************************************
  608. DWORD CTreeNodeUI::GetSelItemTextColor() const
  609. {
  610. return m_dwSelItemTextColor;
  611. }
  612. //************************************
  613. // 函数名称: SetSelHotItemTextColor
  614. // 返回类型: void
  615. // 参数信息: DWORD _dwSelHotItemTextColor
  616. // 函数说明:
  617. //************************************
  618. void CTreeNodeUI::SetSelItemHotTextColor( DWORD _dwSelHotItemTextColor )
  619. {
  620. m_dwSelItemHotTextColor = _dwSelHotItemTextColor;
  621. Invalidate();
  622. }
  623. //************************************
  624. // 函数名称: GetSelHotItemTextColor
  625. // 返回类型: DWORD
  626. // 函数说明:
  627. //************************************
  628. DWORD CTreeNodeUI::GetSelItemHotTextColor() const
  629. {
  630. return m_dwSelItemHotTextColor;
  631. }
  632. /*****************************************************************************/
  633. /*****************************************************************************/
  634. /*****************************************************************************/
  635. //************************************
  636. // 函数名称: CTreeViewUI
  637. // 返回类型:
  638. // 参数信息: void
  639. // 函数说明:
  640. //************************************
  641. CTreeViewUI::CTreeViewUI( void ) : m_bVisibleFolderBtn(true),m_bVisibleCheckBtn(false),m_uItemMinWidth(0)
  642. {
  643. this->GetHeader()->SetVisible(false);
  644. }
  645. //************************************
  646. // 函数名称: ~CTreeViewUI
  647. // 返回类型:
  648. // 参数信息: void
  649. // 函数说明:
  650. //************************************
  651. CTreeViewUI::~CTreeViewUI( void )
  652. {
  653. }
  654. //************************************
  655. // 函数名称: GetClass
  656. // 返回类型: LPCTSTR
  657. // 函数说明:
  658. //************************************
  659. LPCTSTR CTreeViewUI::GetClass() const
  660. {
  661. return DUI_CTR_TREEVIEW;
  662. }
  663. LPVOID CTreeViewUI::GetInterface( LPCTSTR pstrName )
  664. {
  665. if( _tcscmp(pstrName, DUI_CTR_TREEVIEW) == 0 ) return static_cast<CTreeViewUI*>(this);
  666. return CListUI::GetInterface(pstrName);
  667. }
  668. bool CTreeViewUI::Add(CControlUI* pControl)
  669. {
  670. if (!pControl) return false;
  671. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(pControl->GetInterface(DUI_CTR_TREENODE));
  672. if (pTreeNode == NULL) return false;
  673. pTreeNode->OnNotify += MakeDelegate(this,&CTreeViewUI::OnDBClickItem);
  674. pTreeNode->GetFolderButton()->OnNotify += MakeDelegate(this,&CTreeViewUI::OnFolderChanged);
  675. pTreeNode->GetCheckBox()->OnNotify += MakeDelegate(this,&CTreeViewUI::OnCheckBoxChanged);
  676. pTreeNode->SetVisibleFolderBtn(m_bVisibleFolderBtn);
  677. pTreeNode->SetVisibleCheckBtn(m_bVisibleCheckBtn);
  678. if(m_uItemMinWidth > 0) pTreeNode->SetMinWidth(m_uItemMinWidth);
  679. CListUI::Add(pTreeNode);
  680. if(pTreeNode->GetCountChild() > 0)
  681. {
  682. int nCount = pTreeNode->GetCountChild();
  683. for(int nIndex = 0;nIndex < nCount;nIndex++)
  684. {
  685. CTreeNodeUI* pNode = pTreeNode->GetChildNode(nIndex);
  686. if(pNode) Add(pNode);
  687. }
  688. }
  689. pTreeNode->SetTreeView(this);
  690. return true;
  691. }
  692. bool CTreeViewUI::AddAt(CControlUI* pControl, int iIndex)
  693. {
  694. if (!pControl) return false;
  695. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(pControl->GetInterface(DUI_CTR_TREENODE));
  696. if (pTreeNode == NULL) return false;
  697. return AddAt(pTreeNode, iIndex) >= 0;
  698. }
  699. bool CTreeViewUI::Remove(CControlUI* pControl, bool bDoNotDestroy)
  700. {
  701. if (!pControl) return false;
  702. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(pControl->GetInterface(DUI_CTR_TREENODE));
  703. if (pTreeNode == NULL) return CListUI::Remove(pControl, bDoNotDestroy);
  704. if(pTreeNode->GetCountChild() > 0)
  705. {
  706. int nCount = pTreeNode->GetCountChild();
  707. for(int nIndex = 0;nIndex < nCount;nIndex++)
  708. {
  709. CTreeNodeUI* pNode = pTreeNode->GetChildNode(nIndex);
  710. if(pNode){
  711. pTreeNode->Remove(pNode, true);
  712. }
  713. }
  714. }
  715. return CListUI::Remove(pControl, bDoNotDestroy);
  716. }
  717. bool CTreeViewUI::RemoveAt( int iIndex, bool bDoNotDestroy )
  718. {
  719. CControlUI* pControl = GetItemAt(iIndex);
  720. if (pControl == NULL) return false;
  721. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(pControl->GetInterface(DUI_CTR_TREENODE));
  722. if (pTreeNode == NULL) return CListUI::Remove(pControl, bDoNotDestroy);
  723. return Remove(pTreeNode);
  724. }
  725. void CTreeViewUI::RemoveAll()
  726. {
  727. CListUI::RemoveAll();
  728. }
  729. long CTreeViewUI::AddAt(CTreeNodeUI* pControl, int iIndex)
  730. {
  731. if (!pControl) return -1;
  732. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(pControl->GetInterface(DUI_CTR_TREENODE));
  733. if (pTreeNode == NULL) return -1;
  734. CTreeNodeUI* pParent = static_cast<CTreeNodeUI*>(GetItemAt(iIndex));
  735. if(!pParent) return -1;
  736. pTreeNode->OnNotify += MakeDelegate(this,&CTreeViewUI::OnDBClickItem);
  737. pTreeNode->GetFolderButton()->OnNotify += MakeDelegate(this,&CTreeViewUI::OnFolderChanged);
  738. pTreeNode->GetCheckBox()->OnNotify += MakeDelegate(this,&CTreeViewUI::OnCheckBoxChanged);
  739. pTreeNode->SetVisibleFolderBtn(m_bVisibleFolderBtn);
  740. pTreeNode->SetVisibleCheckBtn(m_bVisibleCheckBtn);
  741. if(m_uItemMinWidth > 0) pTreeNode->SetMinWidth(m_uItemMinWidth);
  742. CListUI::AddAt(pTreeNode,iIndex);
  743. if(pTreeNode->GetCountChild() > 0)
  744. {
  745. int nCount = pTreeNode->GetCountChild();
  746. for(int nIndex = 0;nIndex < nCount;nIndex++)
  747. {
  748. CTreeNodeUI* pNode = pTreeNode->GetChildNode(nIndex);
  749. if(pNode)
  750. return AddAt(pNode,iIndex+1);
  751. }
  752. }
  753. else
  754. return iIndex+1;
  755. return -1;
  756. }
  757. bool CTreeViewUI::AddAt( CTreeNodeUI* pControl,CTreeNodeUI* _IndexNode )
  758. {
  759. if(!_IndexNode && !pControl)
  760. return false;
  761. int nItemIndex = -1;
  762. for(int nIndex = 0;nIndex < GetCount();nIndex++){
  763. if(_IndexNode == GetItemAt(nIndex)){
  764. nItemIndex = nIndex;
  765. break;
  766. }
  767. }
  768. if(nItemIndex == -1)
  769. return false;
  770. return AddAt(pControl,nItemIndex) >= 0;
  771. }
  772. //************************************
  773. // 函数名称: Notify
  774. // 返回类型: void
  775. // 参数信息: TNotifyUI & msg
  776. // 函数说明:
  777. //************************************
  778. void CTreeViewUI::Notify( TNotifyUI& msg )
  779. {
  780. }
  781. //************************************
  782. // 函数名称: OnCheckBoxChanged
  783. // 返回类型: bool
  784. // 参数信息: void * param
  785. // 函数说明:
  786. //************************************
  787. bool CTreeViewUI::OnCheckBoxChanged( void* param )
  788. {
  789. TNotifyUI* pMsg = (TNotifyUI*)param;
  790. if(pMsg->sType == DUI_MSGTYPE_SELECTCHANGED)
  791. {
  792. CCheckBoxUI* pCheckBox = (CCheckBoxUI*)pMsg->pSender;
  793. CTreeNodeUI* pItem = (CTreeNodeUI*)pCheckBox->GetParent()->GetParent();
  794. SetItemCheckBox(pCheckBox->GetCheck(),pItem);
  795. return true;
  796. }
  797. return true;
  798. }
  799. //************************************
  800. // 函数名称: OnFolderChanged
  801. // 返回类型: bool
  802. // 参数信息: void * param
  803. // 函数说明:
  804. //************************************
  805. bool CTreeViewUI::OnFolderChanged( void* param )
  806. {
  807. TNotifyUI* pMsg = (TNotifyUI*)param;
  808. if(pMsg->sType == DUI_MSGTYPE_SELECTCHANGED)
  809. {
  810. CCheckBoxUI* pFolder = (CCheckBoxUI*)pMsg->pSender;
  811. CTreeNodeUI* pItem = (CTreeNodeUI*)pFolder->GetParent()->GetParent();
  812. pItem->SetVisibleTag(!pFolder->GetCheck());
  813. SetItemExpand(!pFolder->GetCheck(),pItem);
  814. return true;
  815. }
  816. return true;
  817. }
  818. //************************************
  819. // 函数名称: OnDBClickItem
  820. // 返回类型: bool
  821. // 参数信息: void * param
  822. // 函数说明:
  823. //************************************
  824. bool CTreeViewUI::OnDBClickItem( void* param )
  825. {
  826. TNotifyUI* pMsg = (TNotifyUI*)param;
  827. if(pMsg->sType == DUI_MSGTYPE_ITEMDBCLICK)
  828. {
  829. CTreeNodeUI* pItem = static_cast<CTreeNodeUI*>(pMsg->pSender);
  830. CCheckBoxUI* pFolder = pItem->GetFolderButton();
  831. pFolder->Selected(!pFolder->IsSelected());
  832. pItem->SetVisibleTag(!pFolder->GetCheck());
  833. SetItemExpand(!pFolder->GetCheck(),pItem);
  834. return true;
  835. }
  836. return false;
  837. }
  838. //************************************
  839. // 函数名称: SetItemCheckBox
  840. // 返回类型: bool
  841. // 参数信息: bool _Selected
  842. // 参数信息: CTreeNodeUI * _TreeNode
  843. // 函数说明:
  844. //************************************
  845. bool CTreeViewUI::SetItemCheckBox( bool _Selected,CTreeNodeUI* _TreeNode /*= NULL*/ )
  846. {
  847. if(_TreeNode)
  848. {
  849. if(_TreeNode->GetCountChild() > 0)
  850. {
  851. int nCount = _TreeNode->GetCountChild();
  852. for(int nIndex = 0;nIndex < nCount;nIndex++)
  853. {
  854. CTreeNodeUI* pItem = _TreeNode->GetChildNode(nIndex);
  855. pItem->GetCheckBox()->Selected(_Selected);
  856. if(pItem->GetCountChild())
  857. SetItemCheckBox(_Selected,pItem);
  858. }
  859. }
  860. return true;
  861. }
  862. else
  863. {
  864. int nIndex = 0;
  865. int nCount = GetCount();
  866. while(nIndex < nCount)
  867. {
  868. CTreeNodeUI* pItem = (CTreeNodeUI*)GetItemAt(nIndex);
  869. pItem->GetCheckBox()->Selected(_Selected);
  870. if(pItem->GetCountChild())
  871. SetItemCheckBox(_Selected,pItem);
  872. nIndex++;
  873. }
  874. return true;
  875. }
  876. return false;
  877. }
  878. //************************************
  879. // 函数名称: SetItemExpand
  880. // 返回类型: void
  881. // 参数信息: bool _Expanded
  882. // 参数信息: CTreeNodeUI * _TreeNode
  883. // 函数说明:
  884. //************************************
  885. void CTreeViewUI::SetItemExpand( bool _Expanded,CTreeNodeUI* _TreeNode /*= NULL*/ )
  886. {
  887. if(_TreeNode)
  888. {
  889. if(_TreeNode->GetCountChild() > 0)
  890. {
  891. int nCount = _TreeNode->GetCountChild();
  892. for(int nIndex = 0;nIndex < nCount;nIndex++)
  893. {
  894. CTreeNodeUI* pItem = _TreeNode->GetChildNode(nIndex);
  895. pItem->SetVisible(_Expanded);
  896. if(pItem->GetCountChild() && !pItem->GetFolderButton()->IsSelected())
  897. SetItemExpand(_Expanded,pItem);
  898. }
  899. }
  900. }
  901. else
  902. {
  903. int nIndex = 0;
  904. int nCount = GetCount();
  905. while(nIndex < nCount)
  906. {
  907. CTreeNodeUI* pItem = (CTreeNodeUI*)GetItemAt(nIndex);
  908. pItem->SetVisible(_Expanded);
  909. if(pItem->GetCountChild() && !pItem->GetFolderButton()->IsSelected())
  910. SetItemExpand(_Expanded,pItem);
  911. nIndex++;
  912. }
  913. }
  914. }
  915. //************************************
  916. // 函数名称: SetVisibleFolderBtn
  917. // 返回类型: void
  918. // 参数信息: bool _IsVisibled
  919. // 函数说明:
  920. //************************************
  921. void CTreeViewUI::SetVisibleFolderBtn( bool _IsVisibled )
  922. {
  923. m_bVisibleFolderBtn = _IsVisibled;
  924. int nCount = this->GetCount();
  925. for(int nIndex = 0;nIndex < nCount;nIndex++)
  926. {
  927. CTreeNodeUI* pItem = static_cast<CTreeNodeUI*>(this->GetItemAt(nIndex));
  928. pItem->GetFolderButton()->SetVisible(m_bVisibleFolderBtn);
  929. }
  930. }
  931. //************************************
  932. // 函数名称: GetVisibleFolderBtn
  933. // 返回类型: bool
  934. // 函数说明:
  935. //************************************
  936. bool CTreeViewUI::GetVisibleFolderBtn()
  937. {
  938. return m_bVisibleFolderBtn;
  939. }
  940. //************************************
  941. // 函数名称: SetVisibleCheckBtn
  942. // 返回类型: void
  943. // 参数信息: bool _IsVisibled
  944. // 函数说明:
  945. //************************************
  946. void CTreeViewUI::SetVisibleCheckBtn( bool _IsVisibled )
  947. {
  948. m_bVisibleCheckBtn = _IsVisibled;
  949. int nCount = this->GetCount();
  950. for(int nIndex = 0;nIndex < nCount;nIndex++)
  951. {
  952. CTreeNodeUI* pItem = static_cast<CTreeNodeUI*>(this->GetItemAt(nIndex));
  953. pItem->GetCheckBox()->SetVisible(m_bVisibleCheckBtn);
  954. }
  955. }
  956. //************************************
  957. // 函数名称: GetVisibleCheckBtn
  958. // 返回类型: bool
  959. // 函数说明:
  960. //************************************
  961. bool CTreeViewUI::GetVisibleCheckBtn()
  962. {
  963. return m_bVisibleCheckBtn;
  964. }
  965. //************************************
  966. // 函数名称: SetItemMinWidth
  967. // 返回类型: void
  968. // 参数信息: UINT _ItemMinWidth
  969. // 函数说明:
  970. //************************************
  971. void CTreeViewUI::SetItemMinWidth( UINT _ItemMinWidth )
  972. {
  973. m_uItemMinWidth = _ItemMinWidth;
  974. for(int nIndex = 0;nIndex < GetCount();nIndex++){
  975. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(GetItemAt(nIndex));
  976. if(pTreeNode)
  977. pTreeNode->SetMinWidth(GetItemMinWidth());
  978. }
  979. Invalidate();
  980. }
  981. //************************************
  982. // 函数名称: GetItemMinWidth
  983. // 返回类型: UINT
  984. // 函数说明:
  985. //************************************
  986. UINT CTreeViewUI::GetItemMinWidth()
  987. {
  988. return m_uItemMinWidth;
  989. }
  990. //************************************
  991. // 函数名称: SetItemTextColor
  992. // 返回类型: void
  993. // 参数信息: DWORD _dwItemTextColor
  994. // 函数说明:
  995. //************************************
  996. void CTreeViewUI::SetItemTextColor( DWORD _dwItemTextColor )
  997. {
  998. for(int nIndex = 0;nIndex < GetCount();nIndex++){
  999. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(GetItemAt(nIndex));
  1000. if(pTreeNode)
  1001. pTreeNode->SetItemTextColor(_dwItemTextColor);
  1002. }
  1003. }
  1004. //************************************
  1005. // 函数名称: SetItemHotTextColor
  1006. // 返回类型: void
  1007. // 参数信息: DWORD _dwItemHotTextColor
  1008. // 函数说明:
  1009. //************************************
  1010. void CTreeViewUI::SetItemHotTextColor( DWORD _dwItemHotTextColor )
  1011. {
  1012. for(int nIndex = 0;nIndex < GetCount();nIndex++){
  1013. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(GetItemAt(nIndex));
  1014. if(pTreeNode)
  1015. pTreeNode->SetItemHotTextColor(_dwItemHotTextColor);
  1016. }
  1017. }
  1018. //************************************
  1019. // 函数名称: SetSelItemTextColor
  1020. // 返回类型: void
  1021. // 参数信息: DWORD _dwSelItemTextColor
  1022. // 函数说明:
  1023. //************************************
  1024. void CTreeViewUI::SetSelItemTextColor( DWORD _dwSelItemTextColor )
  1025. {
  1026. for(int nIndex = 0;nIndex < GetCount();nIndex++){
  1027. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(GetItemAt(nIndex));
  1028. if(pTreeNode)
  1029. pTreeNode->SetSelItemTextColor(_dwSelItemTextColor);
  1030. }
  1031. }
  1032. //************************************
  1033. // 函数名称: SetSelItemHotTextColor
  1034. // 返回类型: void
  1035. // 参数信息: DWORD _dwSelHotItemTextColor
  1036. // 函数说明:
  1037. //************************************
  1038. void CTreeViewUI::SetSelItemHotTextColor( DWORD _dwSelHotItemTextColor )
  1039. {
  1040. for(int nIndex = 0;nIndex < GetCount();nIndex++){
  1041. CTreeNodeUI* pTreeNode = static_cast<CTreeNodeUI*>(GetItemAt(nIndex));
  1042. if(pTreeNode)
  1043. pTreeNode->SetSelItemHotTextColor(_dwSelHotItemTextColor);
  1044. }
  1045. }
  1046. //************************************
  1047. // 函数名称: SetAttribute
  1048. // 返回类型: void
  1049. // 参数信息: LPCTSTR pstrName
  1050. // 参数信息: LPCTSTR pstrValue
  1051. // 函数说明:
  1052. //************************************
  1053. void CTreeViewUI::SetAttribute( LPCTSTR pstrName, LPCTSTR pstrValue )
  1054. {
  1055. if(_tcscmp(pstrName,_T("visiblefolderbtn")) == 0)
  1056. SetVisibleFolderBtn(_tcscmp(pstrValue,_T("true")) == 0);
  1057. else if(_tcscmp(pstrName,_T("visiblecheckbtn")) == 0)
  1058. SetVisibleCheckBtn(_tcscmp(pstrValue,_T("true")) == 0);
  1059. else if(_tcscmp(pstrName,_T("itemminwidth")) == 0)
  1060. SetItemMinWidth(_ttoi(pstrValue));
  1061. else if(_tcscmp(pstrName, _T("itemtextcolor")) == 0 ){
  1062. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  1063. LPTSTR pstr = NULL;
  1064. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  1065. SetItemTextColor(clrColor);
  1066. }
  1067. else if(_tcscmp(pstrName, _T("itemhottextcolor")) == 0 ){
  1068. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  1069. LPTSTR pstr = NULL;
  1070. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  1071. SetItemHotTextColor(clrColor);
  1072. }
  1073. else if(_tcscmp(pstrName, _T("selitemtextcolor")) == 0 ){
  1074. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  1075. LPTSTR pstr = NULL;
  1076. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  1077. SetSelItemTextColor(clrColor);
  1078. }
  1079. else if(_tcscmp(pstrName, _T("selitemhottextcolor")) == 0 ){
  1080. if( *pstrValue == _T('#')) pstrValue = ::CharNext(pstrValue);
  1081. LPTSTR pstr = NULL;
  1082. DWORD clrColor = _tcstoul(pstrValue, &pstr, 16);
  1083. SetSelItemHotTextColor(clrColor);
  1084. }
  1085. else CListUI::SetAttribute(pstrName,pstrValue);
  1086. }
  1087. }