DataNodeTree.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. // DataNodeTree.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "DataManager.h"
  5. #include "DataNodeTree.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDataNodeTree
  13. IMPLEMENT_DYNCREATE(CDataNodeTree, CTreeView)//CTreeCtrl)
  14. CDataNodeTree::CDataNodeTree()
  15. {
  16. m_pNode = NULL;
  17. }
  18. CDataNodeTree::~CDataNodeTree()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CDataNodeTree, CTreeView)//CTreeCtrl)
  22. //{{AFX_MSG_MAP(CDataNodeTree)
  23. ON_WM_CREATE()
  24. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
  25. ON_WM_SHOWWINDOW()
  26. ON_WM_SIZE()
  27. //}}AFX_MSG_MAP
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CDataNodeTree message handlers
  31. CDataNodeTreeCtrl& CDataNodeTree::GetTreeCtrl()
  32. {
  33. return m_tree;
  34. // return CTreeView::GetTreeCtrl();
  35. }
  36. int CDataNodeTree::OnCreate(LPCREATESTRUCT lpCreateStruct)
  37. {
  38. // if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
  39. if (CTreeView::OnCreate(lpCreateStruct) == -1)
  40. return -1;
  41. // TODO: Add your specialized creation code here
  42. // this->ModifyStyle(NULL, TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|TVS_LINESATROOT|TVS_SHOWSELALWAYS);
  43. // if(!m_imageList.Create())
  44. // return -1;
  45. // this->GetTreeCtrl().SetImageList(&m_imageList, TVSIL_NORMAL );
  46. CRect rectWnd;
  47. CTreeView::GetTreeCtrl().GetWindowRect(&rectWnd);
  48. ScreenToClient(&rectWnd);
  49. // UINT uID = CTreeView::GetTreeCtrl().GetDlgCtrlID();
  50. // BOOL bOK = m_tree.SubclassDlgItem(uID, this);
  51. // BOOL bOK = m_tree.SubclassWindow(m_hWnd);
  52. m_tree.Create(NULL, rectWnd, this, TREE_CONTROL_IN_VIEW);
  53. CTreeView::GetTreeCtrl().ShowWindow(SW_HIDE);
  54. m_tree.ShowWindow(SW_SHOW);
  55. // m_tree.Attach(CTreeView::GetTreeCtrl().Detach());
  56. return 0;
  57. }
  58. void CDataNodeTree::SetDataNode(CDataNodeBase* pNode, BOOL bInitCtrl)
  59. {
  60. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  61. m_tree.SetDataNode(pNode, bInitCtrl);
  62. // m_pNode = pNode;
  63. // if(bInitCtrl)
  64. // GetTreeCtrl().DeleteAllItems();
  65. // //this->ModifyStyle(NULL, TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|TVS_LINESATROOT|TVS_SHOWSELALWAYS);
  66. // if(m_imageList.m_hImageList == NULL)
  67. // {
  68. // m_imageList.Create();
  69. // this->GetTreeCtrl().SetImageList(&m_imageList, TVSIL_NORMAL );
  70. // }
  71. // m_pNode->BuildTree(*this, TVI_ROOT);
  72. }
  73. void CDataNodeTree::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
  74. {
  75. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  76. // TODO: Add your control notification handler code here
  77. // CDataNodeBase* pNode = (CDataNodeBase*)GetTreeCtrl().GetItemData(pNMTreeView->itemNew.hItem);
  78. // pNode->BuildTree(*this, pNMTreeView->itemNew.hItem, MAX_DEPTH, TRUE);
  79. *pResult = 0;
  80. }
  81. void CDataNodeTree::OnShowWindow(BOOL bShow, UINT nStatus)
  82. {
  83. CTreeView::OnShowWindow(bShow, nStatus);
  84. // TODO: Add your message handler code here
  85. CTreeView::GetTreeCtrl().ShowWindow(SW_HIDE);
  86. // this->ModifyStyle(NULL, TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|TVS_LINESATROOT|TVS_SHOWSELALWAYS);
  87. // if(m_imageList.m_hImageList == NULL)
  88. // {
  89. // m_imageList.Create();
  90. // this->GetTreeCtrl().SetImageList(&m_imageList, TVSIL_NORMAL );
  91. // }
  92. }
  93. void CDataNodeTree::OnSize(UINT nType, int cx, int cy)
  94. {
  95. CTreeView::OnSize(nType, cx, cy);
  96. // TODO: Add your message handler code here
  97. if(m_tree.m_hWnd)
  98. {
  99. CRect rectWnd;
  100. CTreeView::GetTreeCtrl().GetWindowRect(&rectWnd);
  101. ScreenToClient(&rectWnd);
  102. m_tree.MoveWindow(rectWnd);
  103. }
  104. }
  105. //////////////////////////////////////////////////////////////////////////
  106. // CDataNodeTreeCtrl
  107. IMPLEMENT_DYNCREATE(CDataNodeTreeCtrl, CTreeCtrl)
  108. CDataNodeTreeCtrl::CDataNodeTreeCtrl()
  109. {
  110. m_pNode = NULL;
  111. m_hItemFirstSel = NULL;
  112. m_bOnMouseSel = FALSE;
  113. }
  114. CDataNodeTreeCtrl::~CDataNodeTreeCtrl()
  115. {
  116. }
  117. BEGIN_MESSAGE_MAP(CDataNodeTreeCtrl, CTreeCtrl)
  118. //{{AFX_MSG_MAP(CDataNodeTreeCtrl)
  119. ON_WM_CREATE()
  120. ON_NOTIFY_REFLECT(TVN_ITEMEXPANDING, OnItemexpanding)
  121. ON_WM_SHOWWINDOW()
  122. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  123. ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)
  124. ON_WM_DESTROY()
  125. ON_WM_LBUTTONDOWN()
  126. ON_WM_KEYDOWN()
  127. ON_WM_RBUTTONDOWN()
  128. ON_WM_LBUTTONUP()
  129. //}}AFX_MSG_MAP
  130. END_MESSAGE_MAP()
  131. /////////////////////////////////////////////////////////////////////////////
  132. // CDataNodeTreeCtrl message handlers
  133. int CDataNodeTreeCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
  134. {
  135. if (CTreeCtrl::OnCreate(lpCreateStruct) == -1)
  136. return -1;
  137. // TODO: Add your specialized creation code here
  138. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  139. this->ModifyStyle(NULL, TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|TVS_LINESATROOT|TVS_SHOWSELALWAYS);
  140. if(!m_imageList.Create())
  141. return -1;
  142. m_imageList.GetImage("ProjectN");
  143. m_imageList.GetImage("ProjectA");
  144. m_nPauseMaskImage = m_imageList.GetImage("PauseMask");
  145. BOOL bOK = m_imageList.SetOverlayImage(0, 1);
  146. m_nPauseMaskImage = INDEXTOOVERLAYMASK(1);
  147. this->SetImageList(&m_imageList, TVSIL_NORMAL );
  148. return 0;
  149. }
  150. void CDataNodeTreeCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
  151. {
  152. //draw each item.set txt color,bkcolor....
  153. NMTVCUSTOMDRAW* pTVCD = (NMTVCUSTOMDRAW*)(pNMHDR);
  154. // Take the default processing unless we set this to something else below.
  155. *pResult = CDRF_DODEFAULT;
  156. // First thing - check the draw stage. If it's the control's prepaint
  157. // stage, then tell Windows we want messages for every item.
  158. switch(pTVCD->nmcd.dwDrawStage)
  159. {
  160. case CDDS_PREPAINT:
  161. *pResult = CDRF_NOTIFYITEMDRAW;
  162. break;
  163. case CDDS_ITEMPREPAINT:
  164. {
  165. CTreeItemData* p = (CTreeItemData*)pTVCD->nmcd.lItemlParam;
  166. int nTemp;
  167. if(p && m_listSels.Lookup((LPVOID)p->m_hItem, (void*&)nTemp))
  168. {
  169. pTVCD->clrTextBk = GetSysColor(COLOR_HIGHLIGHT);
  170. pTVCD->clrText = GetSysColor(COLOR_HIGHLIGHTTEXT);
  171. }
  172. else
  173. {
  174. pTVCD->clrTextBk = GetSysColor(COLOR_WINDOW);
  175. pTVCD->clrText = GetSysColor(COLOR_WINDOWTEXT);
  176. }
  177. }
  178. *pResult = CDRF_NEWFONT;
  179. break;
  180. default:
  181. break;
  182. }
  183. }
  184. CMapPtrToPtr* CDataNodeTreeCtrl::GetSelectedItems()
  185. {
  186. return &m_listSels;
  187. }
  188. void CDataNodeTreeCtrl::SetDataNode(CDataNodeBase* pNode, BOOL bInitCtrl)
  189. {
  190. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  191. m_pNode = pNode;
  192. if(bInitCtrl)
  193. DeleteAllItems();
  194. //this->ModifyStyle(NULL, TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|TVS_LINESATROOT|TVS_SHOWSELALWAYS);
  195. if(m_imageList.m_hImageList == NULL)
  196. {
  197. m_imageList.Create();
  198. this->SetImageList(&m_imageList, TVSIL_NORMAL );
  199. }
  200. m_pNode->BuildTree(*this, TVI_ROOT);
  201. }
  202. void CDataNodeTreeCtrl::OnItemexpanding(NMHDR* pNMHDR, LRESULT* pResult)
  203. {
  204. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  205. // TODO: Add your control notification handler code here
  206. // CDataNodeBase* pNode = (CDataNodeBase*)GetTreeCtrl().GetItemData(pNMTreeView->itemNew.hItem);
  207. // pNode->BuildTree(*this, pNMTreeView->itemNew.hItem, MAX_DEPTH, TRUE);
  208. *pResult = 0;
  209. }
  210. void CDataNodeTreeCtrl::OnShowWindow(BOOL bShow, UINT nStatus)
  211. {
  212. CTreeCtrl::OnShowWindow(bShow, nStatus);
  213. // TODO: Add your message handler code here
  214. this->ModifyStyle(NULL, TVS_FULLROWSELECT|TVS_HASBUTTONS|TVS_HASLINES|TVS_INFOTIP|TVS_LINESATROOT|TVS_SHOWSELALWAYS);
  215. if(m_imageList.m_hImageList == NULL)
  216. {
  217. m_imageList.Create();
  218. this->GetTreeCtrl().SetImageList(&m_imageList, TVSIL_NORMAL );
  219. }
  220. }
  221. CDataNodeTreeCtrl& CDataNodeTreeCtrl::GetTreeCtrl()
  222. {
  223. return *this;
  224. }
  225. void CDataNodeTreeCtrl::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
  226. {
  227. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  228. // TODO: Add your control notification handler code here
  229. if(!m_bOnMouseSel)
  230. {
  231. BOOL bShit = (0x80 & GetKeyState(VK_SHIFT));
  232. BOOL bCtrl = (0x80 & GetKeyState(VK_CONTROL));
  233. UINT nFlags = 0;
  234. if(bShit)
  235. nFlags |= MK_SHIFT;
  236. if(bCtrl)
  237. nFlags |= MK_CONTROL;
  238. SelectItem(nFlags, pNMTreeView->itemNew.hItem);
  239. }
  240. *pResult = 0;
  241. }
  242. void CDataNodeTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
  243. {
  244. // TODO: Add your message handler code here and/or call default
  245. m_bOnMouseSel = TRUE;
  246. CTreeCtrl::OnLButtonDown(nFlags, point);
  247. HTREEITEM hItem = HitTest(point);
  248. if(hItem)
  249. SelectItem(nFlags, hItem);
  250. m_bOnMouseSel = FALSE;
  251. this->GetParent()->SendMessage(WM_OPERATION, (LPARAM)this, WM_LBUTTONDOWN);
  252. }
  253. void CDataNodeTreeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
  254. {
  255. // TODO: Add your message handler code here and/or call default
  256. // HTREEITEM hItem = GetTreeCtrl().GetSelectedItem();
  257. // if(hItem)
  258. // {
  259. // m_listSels.RemoveAll();
  260. // m_listSels.SetAt((LPVOID)hItem, (LPVOID)1);
  261. // m_hItemFirstSel = hItem;
  262. // }
  263. // m_hItemLastSel = hItem;
  264. // Invalidate();
  265. CTreeCtrl::OnLButtonUp(nFlags, point);
  266. }
  267. void CDataNodeTreeCtrl::SelectItem(UINT nFlags, HTREEITEM hItem)
  268. {
  269. if(hItem)
  270. {
  271. CTreeCtrl::SelectItem(hItem);
  272. if(nFlags & MK_CONTROL)
  273. {
  274. int nTemp;
  275. if(m_listSels.Lookup((LPVOID)hItem, (void*&)nTemp))
  276. {
  277. m_listSels.RemoveKey((LPVOID)hItem);
  278. }
  279. else
  280. {
  281. m_listSels.SetAt((LPVOID)hItem, (LPVOID)1);
  282. m_hItemFirstSel = hItem;
  283. }
  284. }
  285. else if(nFlags & MK_SHIFT)
  286. {
  287. HTREEITEM hDelStart = NULL;
  288. HTREEITEM hDelEnd = NULL;
  289. HTREEITEM hAddStart = NULL;
  290. HTREEITEM hAddEnd = NULL;
  291. HTREEITEM hItemFind = GetRootItem();
  292. while (hItemFind)
  293. {
  294. if(hItemFind == m_hItemLastSel || hItemFind == hItem)
  295. {
  296. if(hDelStart == NULL)
  297. {
  298. hDelStart = hItemFind;
  299. }
  300. if(hDelStart != NULL)
  301. {
  302. hDelEnd = hItemFind;
  303. }
  304. }
  305. if(hItemFind == m_hItemFirstSel || hItemFind == hItem)
  306. {
  307. if(hAddStart == NULL)
  308. {
  309. hAddStart = hItemFind;
  310. }
  311. if(hAddStart != NULL)
  312. {
  313. hAddEnd = hItemFind;
  314. }
  315. }
  316. hItemFind = GetNextVisibleItem(hItemFind);
  317. }
  318. if(hDelStart != NULL && hDelEnd != NULL)
  319. {
  320. HTREEITEM hDel = hDelStart;
  321. while (hDel)
  322. {
  323. m_listSels.RemoveKey((LPVOID)hDel);
  324. if(hDel == hDelEnd)
  325. break;
  326. hDel = GetNextVisibleItem(hDel);
  327. }
  328. }
  329. if(hAddStart != NULL && hAddEnd != NULL)
  330. {
  331. HTREEITEM hAdd = hAddStart;
  332. while (hAdd)
  333. {
  334. m_listSels.SetAt((LPVOID)hAdd, (LPVOID)1);
  335. if(hAdd == hAddEnd)
  336. break;
  337. hAdd = GetNextVisibleItem(hAdd);
  338. }
  339. }
  340. }
  341. else
  342. {
  343. //int nTemp;不支持拖动操作,故这个条件限制先屏蔽
  344. //if(!m_listSels.Lookup((LPVOID)hItem, (void*&)nTemp))
  345. //{//当前点中的不是原来已经选中的情况才做重选操作
  346. m_listSels.RemoveAll();
  347. m_listSels.SetAt((LPVOID)hItem, (LPVOID)1);
  348. m_hItemFirstSel = hItem;
  349. //}
  350. }
  351. m_hItemLastSel = hItem;
  352. // if(this->GetChildItem(hItem) == NULL)
  353. // {
  354. // CDataNodeBase* pNode = (CDataNodeBase*)GetTreeCtrl().GetItemData(hItem);
  355. // pNode->BuildTree(*this, hItem, MAX_DEPTH, TRUE);
  356. // }
  357. Invalidate();
  358. this->GetParent()->PostMessage(WM_SELCHANGED, (LPARAM)this, NULL);
  359. }
  360. }
  361. DWORD CDataNodeTreeCtrl::GetItemData (HTREEITEM hItem) const
  362. {
  363. CTreeItemData* pData = (CTreeItemData*)CTreeCtrl::GetItemData(hItem);
  364. if(pData)
  365. {
  366. return pData->m_dwData;
  367. }
  368. return NULL;
  369. }
  370. BOOL CDataNodeTreeCtrl::SetItemData (HTREEITEM hItem, DWORD dwData)
  371. {
  372. CTreeItemData* pData = (CTreeItemData*)CTreeCtrl::GetItemData(hItem);
  373. if(pData)
  374. {
  375. pData->m_dwData = dwData;
  376. }
  377. return pData != NULL;
  378. }
  379. HTREEITEM CDataNodeTreeCtrl::InsertItem( LPTVINSERTSTRUCT lpInsertStruct )
  380. {
  381. HTREEITEM hItem = CTreeCtrl::InsertItem(lpInsertStruct);
  382. if(hItem)
  383. {
  384. CTreeItemData* p = new CTreeItemData;
  385. p->m_hItem = hItem;
  386. p->m_dwData = (DWORD)lpInsertStruct->item.lParam;
  387. CTreeCtrl::SetItemData(hItem, (DWORD)p);
  388. }
  389. return hItem;
  390. }
  391. HTREEITEM CDataNodeTreeCtrl::InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, HTREEITEM hParent, HTREEITEM hInsertAfter )
  392. {
  393. HTREEITEM hItem = CTreeCtrl::InsertItem(nMask, lpszItem, nImage, nSelectedImage, nState, nStateMask, lParam, hParent, hInsertAfter);
  394. if(hItem)
  395. {
  396. CTreeItemData* p = new CTreeItemData;
  397. p->m_hItem = hItem;
  398. p->m_dwData = (DWORD)lParam;
  399. CTreeCtrl::SetItemData(hItem, (DWORD)p);
  400. }
  401. return hItem;
  402. }
  403. HTREEITEM CDataNodeTreeCtrl::InsertItem( LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter )
  404. {
  405. HTREEITEM hItem = CTreeCtrl::InsertItem(lpszItem, hParent, hInsertAfter);
  406. if(hItem)
  407. {
  408. CTreeItemData* p = new CTreeItemData;
  409. p->m_hItem = hItem;
  410. CTreeCtrl::SetItemData(hItem, (DWORD)p);
  411. }
  412. return hItem;
  413. }
  414. HTREEITEM CDataNodeTreeCtrl::InsertItem( LPCTSTR lpszItem, int nImage, int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter)
  415. {
  416. HTREEITEM hItem = CTreeCtrl::InsertItem(lpszItem, nImage, nSelectedImage, hParent, hInsertAfter);
  417. if(hItem)
  418. {
  419. CTreeItemData* p = new CTreeItemData;
  420. p->m_hItem = hItem;
  421. CTreeCtrl::SetItemData(hItem, (DWORD)p);
  422. }
  423. return hItem;
  424. }
  425. BOOL CDataNodeTreeCtrl::DeleteItem (HTREEITEM hItem)
  426. {
  427. HTREEITEM hSub = GetChildItem(hItem);
  428. while (hSub)
  429. {
  430. HTREEITEM hSubLast = hSub;
  431. hSub = GetNextSiblingItem(hSub);
  432. DeleteItem(hSubLast);
  433. }
  434. if(m_hItemFirstSel == hItem)
  435. m_hItemFirstSel = NULL;
  436. if(m_hItemLastSel == hItem)
  437. m_hItemLastSel = NULL;
  438. m_listSels.RemoveKey(hItem);
  439. CTreeItemData* pData = (CTreeItemData*)CTreeCtrl::GetItemData(hItem);
  440. if(pData)
  441. {
  442. m_mapNodeTohItem.RemoveKey((LPVOID)pData->m_dwData);
  443. delete pData;
  444. }
  445. BOOL bRtn = CTreeCtrl::DeleteItem(hItem);
  446. if(m_listSels.GetCount() == 0)
  447. {//删除节点时,若自己管理的选择已经没有被选中的项,则重新选择
  448. HTREEITEM hSel = CTreeCtrl::GetSelectedItem();
  449. if(hSel)
  450. {
  451. m_listSels.SetAt((LPVOID)hSel, (LPVOID)1);
  452. m_hItemFirstSel = hSel;
  453. }
  454. }
  455. return bRtn;
  456. }
  457. BOOL CDataNodeTreeCtrl::DeleteAllItems ()
  458. {
  459. HTREEITEM hRoot = GetRootItem();
  460. while(hRoot)
  461. {
  462. HTREEITEM hRootLast = hRoot;
  463. hRoot = GetNextSiblingItem(hRoot);
  464. DeleteItem(hRootLast);
  465. }
  466. return TRUE;
  467. }
  468. void CDataNodeTreeCtrl::OnDestroy()
  469. {
  470. DeleteAllItems();
  471. if(m_imageList.m_hImageList != NULL)
  472. {
  473. m_imageList.DeleteImageList();
  474. }
  475. CTreeCtrl::OnDestroy();
  476. // TODO: Add your message handler code here
  477. }
  478. BOOL CDataNodeTreeCtrl::SelectItem(HTREEITEM hItem)
  479. {
  480. BOOL bRtn = CTreeCtrl::SelectItem(hItem);
  481. SelectItem(NULL, hItem);
  482. return bRtn;
  483. }
  484. void CDataNodeTreeCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  485. {
  486. // TODO: Add your message handler code here and/or call default
  487. CTreeCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
  488. if(nChar == VK_UP || nChar == VK_DOWN || nChar == VK_LEFT || nChar == VK_RIGHT)
  489. {
  490. HTREEITEM hItem = CTreeCtrl::GetSelectedItem();
  491. if(hItem)
  492. {
  493. BOOL bShit = (0x80 & GetKeyState(VK_SHIFT));
  494. BOOL bCtrl = (0x80 & GetKeyState(VK_CONTROL));
  495. nFlags = 0;
  496. if(bShit)
  497. nFlags |= MK_SHIFT;
  498. if(bCtrl)
  499. nFlags |= MK_CONTROL;
  500. SelectItem(nFlags, hItem);
  501. }
  502. }
  503. }
  504. void CDataNodeTreeCtrl::OnRButtonDown(UINT nFlags, CPoint point)
  505. {
  506. // TODO: Add your message handler code here and/or call default
  507. m_bOnMouseSel = TRUE;
  508. HTREEITEM hItem = HitTest(point, NULL);
  509. if(hItem != NULL)
  510. {
  511. CTreeCtrl::SelectItem(hItem);
  512. int nTemp;
  513. if(m_listSels.Lookup((LPVOID)hItem, (void*&)nTemp))
  514. {//do nothing else
  515. }
  516. else
  517. {
  518. m_listSels.RemoveAll();
  519. m_listSels.SetAt((LPVOID)hItem, (LPVOID)1);
  520. Invalidate();
  521. }
  522. }
  523. CTreeCtrl::OnRButtonDown(nFlags, point);
  524. m_bOnMouseSel = FALSE;
  525. }
  526. HTREEITEM CDataNodeTreeCtrl::GetSelectedItem () const
  527. {
  528. HTREEITEM hRtn = CTreeCtrl::GetSelectedItem();
  529. if(m_listSels.GetCount() == 1)
  530. {
  531. int nTemp;
  532. POSITION pos = m_listSels.GetStartPosition();
  533. if(pos)
  534. m_listSels.GetNextAssoc(pos, (void*&)hRtn, (void*&)nTemp);
  535. }
  536. else if(m_listSels.GetCount() == 0)
  537. {
  538. }
  539. return hRtn;
  540. }
  541. void CDataNodeTreeCtrl::ChangePauseDeviceIco(HTREEITEM hItem, BOOL bPause)
  542. {
  543. int nStatus = 0;
  544. if(bPause)
  545. nStatus = m_nPauseMaskImage;
  546. SetItemState(hItem, nStatus, TVIS_OVERLAYMASK);
  547. }