LeftTreeView.cpp
上传用户:yuxuan88
上传日期:2022-05-09
资源大小:2290k
文件大小:12k
源码类别:

行业应用

开发平台:

Visual C++

  1. // LeftTreeView.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Inhabitants.h"
  5. #include "InhabitantsDoc.h"
  6. #include "LeftTreeView.h"
  7. #include "MainFrm.h"
  8. #include "UsersListView.h"
  9. #include "UserinfoView.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CLeftTreeView
  17. IMPLEMENT_DYNCREATE(CLeftTreeView, CTreeView)
  18. CLeftTreeView::CLeftTreeView()
  19. {
  20. }
  21. CLeftTreeView::~CLeftTreeView()
  22. {
  23. }
  24. BEGIN_MESSAGE_MAP(CLeftTreeView, CTreeView)
  25. //{{AFX_MSG_MAP(CLeftTreeView)
  26. ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
  27. ON_COMMAND(ID_OPERATE_DELETE, OnOperateDelete)
  28. ON_UPDATE_COMMAND_UI(ID_OPERATE_DELETE, OnUpdateOperateDelete)
  29. ON_WM_LBUTTONDOWN()
  30. //}}AFX_MSG_MAP
  31. END_MESSAGE_MAP()
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CLeftTreeView drawing
  34. void CLeftTreeView::OnDraw(CDC* pDC)
  35. {
  36. CDocument* pDoc = GetDocument();
  37. // TODO: add draw code here
  38. }
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CLeftTreeView diagnostics
  41. #ifdef _DEBUG
  42. void CLeftTreeView::AssertValid() const
  43. {
  44. CTreeView::AssertValid();
  45. }
  46. void CLeftTreeView::Dump(CDumpContext& dc) const
  47. {
  48. CTreeView::Dump(dc);
  49. }
  50. #endif //_DEBUG
  51. /////////////////////////////////////////////////////////////////////////////
  52. // CLeftTreeView message handlers
  53. //将数据库中的所有住户到加到树中
  54. void CLeftTreeView::AddUsersToTree()
  55. {
  56. CInhabitantsDoc* pDoc = (CInhabitantsDoc*)GetDocument();
  57. if(pDoc==NULL)
  58. return;
  59. //清空树
  60. GetTreeCtrl().DeleteAllItems();
  61. //取数据库中得所有记录
  62. CString strSql = "select * from house";
  63. CCommand<CAccessor<CHouseAccessor> > dbHouse;
  64. long* pCount = new long;
  65. if(dbHouse.Open(pDoc->m_dbHouse.m_session,strSql,NULL,pCount) != S_OK)
  66. {
  67. AfxMessageBox("error");
  68. delete pCount;
  69. return;
  70. }
  71. delete pCount;
  72. if(dbHouse.MoveFirst() == S_OK)
  73. {
  74. do
  75. {
  76. AddUserToTree(dbHouse.m_sectionname,dbHouse.m_buildingnum,
  77. dbHouse.m_cellnum,dbHouse.m_roomnum);
  78. }
  79. while( dbHouse.MoveNext() == S_OK );
  80. }
  81. dbHouse.Close();
  82. }
  83. void CLeftTreeView::OnInitialUpdate() 
  84. {
  85. CTreeView::OnInitialUpdate();
  86. //设置树风格
  87. ::SetWindowLong(m_hWnd,GWL_STYLE,WS_VISIBLE | WS_TABSTOP 
  88. | WS_CHILD | WS_BORDER| TVS_HASBUTTONS 
  89. | TVS_LINESATROOT | TVS_HASLINES
  90. | TVS_DISABLEDRAGDROP|TVS_SHOWSELALWAYS);
  91. //为树视图创建图标连表
  92. CInhabitantsApp* pApp = (CInhabitantsApp*)AfxGetApp();
  93. CTreeCtrl* pTreeCtrl = &GetTreeCtrl();
  94. m_ImageList.Create(16,16,ILC_COLOR16,4,4);
  95. m_ImageList.Add(pApp->LoadIcon(IDI_ICON_SECTION));
  96. m_ImageList.Add(pApp->LoadIcon(IDI_ICON_BUILDING));
  97. m_ImageList.Add(pApp->LoadIcon(IDI_ICON_CELL));
  98. m_ImageList.Add(pApp->LoadIcon(IDI_ICON_USER));
  99. pTreeCtrl->SetImageList(&m_ImageList,TVSIL_NORMAL);
  100. //将住户加入树中
  101. AddUsersToTree();
  102. pTreeCtrl->SortChildren(TVI_ROOT);
  103. }
  104. void CLeftTreeView::AddUserToTree(CString strSectionName,int nBuildingNum,int nCellNum,int nRoomNum)
  105. {
  106. HTREEITEM hSectionItem = AddSectionToTree(strSectionName);
  107. HTREEITEM hBuildingItem = AddBuildingToTree(hSectionItem,nBuildingNum);
  108. HTREEITEM hCellItem = AddCellToTree(hBuildingItem,nCellNum);
  109. if(hCellItem == NULL)
  110. return;
  111. CTreeCtrl* pCtrl = &GetTreeCtrl();
  112. TV_INSERTSTRUCT TCItem;//插入数据项数据结构
  113. TCItem.hParent = hCellItem;
  114. TCItem.hInsertAfter = TVI_LAST;
  115. TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
  116. TCItem.item.lParam=0;//序号
  117. TCItem.item.iImage=3;//正常图标
  118. TCItem.item.iSelectedImage=3;//选中时图标
  119. CString str;
  120. str.Format("%d",nRoomNum);
  121. TCItem.item.pszText = (LPTSTR)(LPCTSTR)str;
  122. pCtrl->InsertItem(&TCItem);
  123. pCtrl->SortChildren(hCellItem);
  124. }
  125. //将小区加到树视图中
  126. HTREEITEM CLeftTreeView::AddSectionToTree(CString strSectionName)
  127. {
  128. CTreeCtrl* pCtrl = &GetTreeCtrl();
  129. HTREEITEM hRootItem = pCtrl->GetRootItem();
  130. if(hRootItem)
  131. {
  132. while(hRootItem)
  133. {
  134. CString strItemText = pCtrl->GetItemText(hRootItem);
  135. if(strItemText == strSectionName)
  136. return hRootItem;
  137. hRootItem = pCtrl->GetNextSiblingItem(hRootItem);
  138. }
  139. }
  140. TV_INSERTSTRUCT TCItem;//插入数据项数据结构
  141. TCItem.hParent = TVI_ROOT;
  142. TCItem.hInsertAfter = TVI_LAST;
  143. TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
  144. TCItem.item.lParam=0;//序号
  145. TCItem.item.iImage=0;//正常图标
  146. TCItem.item.iSelectedImage=0;//选中时图标
  147. TCItem.item.pszText = (LPTSTR)(LPCTSTR)strSectionName;
  148. HTREEITEM hSectionItem = pCtrl->InsertItem(&TCItem);
  149. pCtrl->SortChildren(TVI_ROOT);
  150. return hSectionItem;
  151. }
  152. HTREEITEM CLeftTreeView::AddBuildingToTree(HTREEITEM hSectionItem, int nBuildingnum)
  153. {
  154. if(hSectionItem == NULL)
  155. return NULL;
  156. CTreeCtrl* pCtrl = &GetTreeCtrl();
  157. CString strBuildingNum;
  158. strBuildingNum.Format("%d号楼",nBuildingnum);
  159. if(pCtrl->ItemHasChildren(hSectionItem))
  160. {
  161. HTREEITEM hItem = pCtrl->GetChildItem(hSectionItem);
  162. while(hItem)
  163. {
  164. CString strItemText = pCtrl->GetItemText(hItem);
  165. if(strItemText == strBuildingNum)
  166. return hItem;
  167. hItem = pCtrl->GetNextSiblingItem(hItem);
  168. }
  169. }
  170. TV_INSERTSTRUCT TCItem;//插入数据项数据结构
  171. TCItem.hParent = hSectionItem;
  172. TCItem.hInsertAfter = TVI_LAST;
  173. TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
  174. TCItem.item.lParam=0;//序号
  175. TCItem.item.iImage=1;//正常图标
  176. TCItem.item.iSelectedImage=1;//选中时图标
  177. TCItem.item.pszText = (LPTSTR)(LPCTSTR)strBuildingNum;
  178. HTREEITEM hBuildingItem = pCtrl->InsertItem(&TCItem);
  179. pCtrl->SortChildren(hSectionItem);
  180. return hBuildingItem;
  181. }
  182. HTREEITEM CLeftTreeView::AddCellToTree(HTREEITEM hBuildingItem, int nCellnum)
  183. {
  184. if(hBuildingItem == NULL)
  185. return NULL;
  186. CTreeCtrl* pCtrl = &GetTreeCtrl();
  187. CString strCellNum;
  188. strCellNum.Format("%d单元",nCellnum);
  189. if(pCtrl->ItemHasChildren(hBuildingItem))
  190. {
  191. HTREEITEM hItem = pCtrl->GetChildItem(hBuildingItem);
  192. while(hItem)
  193. {
  194. CString strItemText = pCtrl->GetItemText(hItem);
  195. if(strItemText == strCellNum)
  196. return hItem;
  197. hItem = pCtrl->GetNextSiblingItem(hItem);
  198. }
  199. }
  200. TV_INSERTSTRUCT TCItem;//插入数据项数据结构
  201. TCItem.hParent = hBuildingItem;
  202. TCItem.hInsertAfter = TVI_LAST;
  203. TCItem.item.mask=TVIF_TEXT|TVIF_PARAM|TVIF_IMAGE|TVIF_SELECTEDIMAGE;//设屏蔽
  204. TCItem.item.lParam=0;//序号
  205. TCItem.item.iImage=2;//正常图标
  206. TCItem.item.iSelectedImage=2;//选中时图标
  207. TCItem.item.pszText = (LPTSTR)(LPCTSTR)strCellNum;
  208. HTREEITEM hCellItem = pCtrl->InsertItem(&TCItem);
  209. pCtrl->SortChildren(hBuildingItem);
  210. return hCellItem;
  211. }
  212. void CLeftTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult) 
  213. {
  214. NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
  215. *pResult = 0;
  216. //获得被选择项
  217. CTreeCtrl* pCtrl = &GetTreeCtrl();
  218. HTREEITEM hSelItem = pCtrl->GetSelectedItem();
  219. m_hHitItem = hSelItem;
  220. //如果没有项被选择,则将右边的列表视图清空
  221. CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
  222. if(hSelItem == NULL)
  223. {
  224. pFrame->SwitchToView(USERSVIEW);
  225. pFrame->m_pUsersView->ShowUsers("");
  226. return;
  227. }
  228. //判断选择项在树中的位置
  229. HTREEITEM hParentItem = pCtrl->GetParentItem(hSelItem);
  230. CString strSql,strSectionName,strBuildingNum,strCellNum,strRoomNum;
  231. if(hParentItem == NULL)
  232. { //小区
  233. CString strSectionName = pCtrl->GetItemText(hSelItem);
  234. strSql.Format("select * from house where sectionname = '%s'",strSectionName);
  235. pFrame->SwitchToView(USERSVIEW);
  236. pFrame->m_pUsersView->ShowUsers(strSql);
  237. return;
  238. }
  239. hParentItem = pCtrl->GetParentItem(hParentItem);
  240. if(hParentItem == NULL)
  241. { //楼
  242. strSectionName = pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));
  243. CString str = pCtrl->GetItemText(hSelItem);
  244. int n = str.Find("号楼");
  245. strBuildingNum = str.Left(n);
  246. strSql.Format("select * from house where sectionname = '%s' and buildingnum = %s",
  247. strSectionName,strBuildingNum);
  248. pFrame->SwitchToView(USERSVIEW);
  249. pFrame->m_pUsersView->ShowUsers(strSql);
  250. return;
  251. }
  252. hParentItem = pCtrl->GetParentItem(hParentItem);
  253. if(hParentItem == NULL)
  254. { //单元
  255. strSectionName = pCtrl->GetItemText(pCtrl->GetParentItem
  256. (pCtrl->GetParentItem(hSelItem)));
  257. CString str = pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));
  258. int n = str.Find("号楼");
  259. strBuildingNum = str.Left(n);
  260. str = pCtrl->GetItemText(hSelItem);
  261. n = str.Find("单元");
  262. strCellNum = str.Left( n );
  263. strSql.Format("select * from house where sectionname = '%s' and buildingnum = %s and cellnum = %s",
  264. strSectionName,strBuildingNum,strCellNum);
  265. pFrame->SwitchToView(USERSVIEW);
  266. pFrame->m_pUsersView->ShowUsers(strSql);
  267. return;
  268. }
  269. //选择项是房间号,则右边视图显示该住户的详细信息
  270. strSectionName = pCtrl->GetItemText(pCtrl->GetParentItem
  271. (pCtrl->GetParentItem(pCtrl->GetParentItem(hSelItem))));
  272. CString str = pCtrl->GetItemText(pCtrl->GetParentItem
  273. (pCtrl->GetParentItem(hSelItem)));
  274. int n = str.Find("号楼");
  275. strBuildingNum = str.Left(n);
  276. str = pCtrl->GetItemText(pCtrl->GetParentItem(hSelItem));
  277. n = str.Find("单元");
  278. strCellNum = str.Left( n );
  279. strRoomNum = pCtrl->GetItemText(hSelItem);
  280. pFrame->SwitchToView(USERINFOVIEW);
  281. pFrame->m_pUserinfoView->UpdateUserInfo(strSectionName,
  282. atoi(strBuildingNum.GetBuffer(0)),
  283. atoi(strCellNum.GetBuffer(0)),
  284. atoi(strRoomNum.GetBuffer(0)));
  285. }
  286. void CLeftTreeView::OnOperateDelete() 
  287. {
  288. if( m_hHitItem == NULL )
  289. return;
  290. CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
  291. CInhabitantsDoc* pDoc = (CInhabitantsDoc*)GetDocument();
  292. CTreeCtrl* pCtrl = &GetTreeCtrl();
  293. HTREEITEM hParentItem = pCtrl->GetParentItem( m_hHitItem );
  294. CString strSql;
  295. if( hParentItem == NULL && m_hHitItem != NULL )
  296. { //小区
  297. CString strSectionName = pCtrl->GetItemText(m_hHitItem);
  298. strSql.Format("delete * from house where sectionname = '%s'",strSectionName);
  299. if(this->MessageBox("你真的要删除该小区中的所有住户吗?",
  300. "小区居民管理系统",MB_YESNO)==IDNO)
  301. return;
  302. }
  303. else if( hParentItem != NULL && pCtrl->GetParentItem(hParentItem) == NULL )
  304. { //楼
  305. CString strSectionName = pCtrl->GetItemText(pCtrl->GetParentItem(m_hHitItem));
  306. CString str = pCtrl->GetItemText(m_hHitItem);
  307. int n = str.Find("号楼");
  308. CString strBuildingNum = str.Left(n);
  309. strSql.Format("delete * from house where sectionname = '%s' and buildingnum = %s",
  310. strSectionName,strBuildingNum);
  311. if(this->MessageBox("你真的要删除该楼中的所有住户吗?",
  312. "小区居民管理系统",MB_YESNO)==IDNO)
  313. return;
  314. }
  315. else if( pCtrl->GetParentItem(hParentItem) != NULL 
  316. && pCtrl->GetParentItem(pCtrl->GetParentItem(hParentItem)) == NULL )
  317. { //单元
  318. CString strSectionName = pCtrl->GetItemText(
  319. pCtrl->GetParentItem(pCtrl->GetParentItem(m_hHitItem)));
  320. CString str = pCtrl->GetItemText(pCtrl->GetParentItem(m_hHitItem));
  321. int n = str.Find("号楼");
  322. CString strBuildingNum = str.Left(n);
  323. str = pCtrl->GetItemText(m_hHitItem);
  324. n = str.Find("单元");
  325. CString strCellNum = str.Left( n );
  326. strSql.Format("delete * from house where sectionname = '%s' and buildingnum = %s and cellnum = %s",
  327. strSectionName,strBuildingNum,strCellNum);
  328. if(this->MessageBox("你真的要删除该单元中的所有住户吗?",
  329. "小区居民管理系统",MB_YESNO)==IDNO)
  330. return;
  331. }
  332. else
  333. { //用户
  334. CString strSectionName = pCtrl->GetItemText(pCtrl->GetParentItem(
  335. pCtrl->GetParentItem(pCtrl->GetParentItem(m_hHitItem))));
  336. CString str = pCtrl->GetItemText(pCtrl->GetParentItem(
  337. pCtrl->GetParentItem(m_hHitItem)));
  338. int n = str.Find("号楼");
  339. CString strBuildingNum = str.Left(n);
  340. str = pCtrl->GetItemText(pCtrl->GetParentItem(m_hHitItem));
  341. n = str.Find("单元");
  342. CString strCellNum = str.Left( n );
  343. CString strRoomNum = pCtrl->GetItemText(m_hHitItem);
  344. strSql.Format("delete * from house where sectionname = '%s' and buildingnum = %s and cellnum = %s and roomnum = %s",
  345. strSectionName,strBuildingNum,strCellNum,strRoomNum);
  346. if(this->MessageBox("你真的要删除该住户吗?","小区居民管理系统",MB_YESNO)==IDNO)
  347. return;
  348. }
  349. pDoc->DeleteUser(strSql);
  350. AddUsersToTree();
  351. }
  352. void CLeftTreeView::OnUpdateOperateDelete(CCmdUI* pCmdUI) 
  353. {
  354. pCmdUI->Enable(m_hHitItem != NULL);
  355. }