NetFinderDlg.cpp
上传用户:qiye66692
上传日期:2022-04-25
资源大小:72k
文件大小:8k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. // NetFinderDlg.cpp : 实现文件
  2. //
  3. #include "stdafx.h"
  4. #include "NetFinder.h"
  5. #include "NetFinderDlg.h"
  6. #include ".netfinderdlg.h"
  7. #include ".func.h"
  8. #include ".msg.h"
  9. #include ".SubNetDlg.h"
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #endif
  13. // CNetFinderDlg 对话框
  14. CNetFinderDlg::CNetFinderDlg(CWnd* pParent /*=NULL*/)
  15. : CDialog(CNetFinderDlg::IDD, pParent)
  16. , m_depth(1)
  17. , m_community(_T("public"))
  18. , m_ip(_T("192.168.1.2"))
  19. , m_msg(_T("显示信息"))
  20. , m_routerIndex(0)
  21. , m_subNetIndex(0)
  22. {
  23. m_hIcon = AfxGetApp()->LoadIcon(IDI_ROUTER);
  24. pHeadRouter = new CRouter();
  25. pCurrRouter = pHeadRouter;
  26. pTailRouter = pHeadRouter;
  27. m_treeImageList.Create( 16, 16, ILC_COLOR4, 1, 0 );
  28. HICON hRouterIcon = ::AfxGetApp()->LoadIcon(IDI_ROUTER);
  29. m_treeImageList.SetBkColor( COLORREF RGB(255,255,255) );
  30. m_treeImageList.Add( hRouterIcon );
  31. m_listImageList.Create( 32, 32, ILC_COLOR4, 1, 0 );
  32. HICON hSubnetIcon = ::AfxGetApp()->LoadIcon(IDI_NET);
  33. m_listImageList.SetBkColor( COLORREF RGB(255,255,255) );
  34. m_listImageList.Add( hSubnetIcon );
  35. }
  36. void CNetFinderDlg::DoDataExchange(CDataExchange* pDX)
  37. {
  38. CDialog::DoDataExchange(pDX);
  39. DDX_Text(pDX, IDC_DEPTH_EDIT, m_depth);
  40. DDV_MinMaxUInt(pDX, m_depth, 1, 100);
  41. DDX_Text(pDX, IDC_COMMUNITY_EDIT, m_community);
  42. DDX_Control(pDX, IDC_IPADDRESS, m_ipCtrl);
  43. DDX_Text(pDX, IDC_ROUTER_MSG_STATIC, m_msg);
  44. DDX_Control(pDX, IDC_TREE, m_routerTree);
  45. DDX_Control(pDX, IDC_LIST, m_subNetList);
  46. }
  47. BEGIN_MESSAGE_MAP(CNetFinderDlg, CDialog)
  48. ON_WM_PAINT()
  49. ON_WM_QUERYDRAGICON()
  50. //}}AFX_MSG_MAP
  51. ON_BN_CLICKED(IDC_START_BUTTON, OnBnClickedStartButton)
  52. //user defined message map
  53. ON_MESSAGE(MSG_FOUND_ROUTER, OnFoundRouter)
  54. ON_MESSAGE(MSG_SEARCH_ROUTER_END, OnSearchRouterEnd)
  55. ON_MESSAGE(MSG_SHOW_SUBNET, OnShowSubnet)
  56. ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, OnTvnSelchangedTree)
  57. ON_BN_CLICKED(IDC_STOP_BUTTON, OnBnClickedStopButton)
  58. ON_NOTIFY(NM_DBLCLK, IDC_LIST, OnNMDblclkList)
  59. END_MESSAGE_MAP()
  60. // CNetFinderDlg 消息处理程序
  61. BOOL CNetFinderDlg::OnInitDialog()
  62. {
  63. CDialog::OnInitDialog();
  64. // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
  65. //  执行此操作
  66. SetIcon(m_hIcon, TRUE); // 设置大图标
  67. SetIcon(m_hIcon, FALSE); // 设置小图标
  68. // TODO: 在此添加额外的初始化代码
  69. UpdateData(false);
  70. m_ipCtrl.SetAddress(192, 168, 1, 2);
  71. m_routerTree.SetImageList( &m_treeImageList, TVSIL_NORMAL );
  72. m_subNetList.ModifyStyle( NULL, LVS_ICON );
  73. m_subNetList.SetImageList( &m_listImageList, LVSIL_NORMAL );
  74. return TRUE;  // 除非设置了控件的焦点,否则返回 TRUE
  75. }
  76. // 如果向对话框添加最小化按钮,则需要下面的代码
  77. //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
  78. //  这将由框架自动完成。
  79. void CNetFinderDlg::OnPaint() 
  80. {
  81. if (IsIconic())
  82. {
  83. CPaintDC dc(this); // 用于绘制的设备上下文
  84. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  85. // 使图标在工作矩形中居中
  86. int cxIcon = GetSystemMetrics(SM_CXICON);
  87. int cyIcon = GetSystemMetrics(SM_CYICON);
  88. CRect rect;
  89. GetClientRect(&rect);
  90. int x = (rect.Width() - cxIcon + 1) / 2;
  91. int y = (rect.Height() - cyIcon + 1) / 2;
  92. // 绘制图标
  93. dc.DrawIcon(x, y, m_hIcon);
  94. }
  95. else
  96. {
  97. CDialog::OnPaint();
  98. }
  99. }
  100. //当用户拖动最小化窗口时系统调用此函数取得光标显示。
  101. HCURSOR CNetFinderDlg::OnQueryDragIcon()
  102. {
  103. return static_cast<HCURSOR>(m_hIcon);
  104. }
  105. void CNetFinderDlg::OnBnClickedStartButton()
  106. {
  107. // TODO: 在此添加控件通知处理程序代码
  108. UpdateData();
  109. BYTE f1, f2, f3, f4;
  110. m_ipCtrl.GetAddress( f1, f2, f3, f4 );
  111. m_ip.Format("%d.%d.%d.%d", f1, f2, f3, f4);
  112. //再次搜索前先清空array
  113. if( routerArray.GetSize() ) {
  114. routerArray.RemoveAll();
  115. }
  116. m_routerTree.DeleteAllItems(); //清空树
  117. m_msg = _T("正在搜索路由...");
  118. UpdateData(false);
  119. pThread = AfxBeginThread( SearchRouter, this ); //新开线程进行路由器搜索,执行SerachRouter(它是全局的函数)
  120. GetDlgItem(IDC_START_BUTTON)->EnableWindow(false);
  121. GetDlgItem(IDC_START_BUTTON)->SetWindowText(_T("正在搜索"));
  122. GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(true);
  123. }
  124. LRESULT CNetFinderDlg::OnFoundRouter( WPARAM wParam, LPARAM lParam )
  125. {
  126. pCurrRouter = pTailRouter;
  127. routerArray.Add( pCurrRouter );
  128. pTailRouter->next = new CRouter();
  129. pTailRouter = pTailRouter->next; //链尾指向新建的CRouter实例
  130. UINT depth;
  131. depth = wParam;
  132. CRouter* router;
  133. router = (CRouter*)routerArray.GetAt( routerArray.GetSize()-1 );
  134. if( depth == 1 )
  135. {
  136. hItem[1] = m_routerTree.InsertItem( router->m_strName, TVI_ROOT); //往树上加节点
  137. }
  138. else
  139. {
  140. hItem[depth] = m_routerTree.InsertItem( router->m_strName, hItem[depth-1] );
  141. }
  142. m_routerTree.SetItemData( hItem[depth], routerArray.GetSize()-1 );//data用于标志,以显示子网
  143. m_routerTree.Invalidate();
  144. m_router_added.SetEvent();
  145. return 0L;
  146. }
  147. LRESULT CNetFinderDlg::OnSearchRouterEnd( WPARAM wParam, LPARAM lParam )
  148. {
  149. m_msg = _T("路由搜索完成!");
  150. UpdateData(false);
  151. GetDlgItem(IDC_START_BUTTON)->EnableWindow(true);
  152. GetDlgItem(IDC_START_BUTTON)->SetWindowText(_T("开始搜索"));
  153. GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(false);
  154. this->m_routerTree.Invalidate();
  155. return 0L;
  156. }
  157. LRESULT CNetFinderDlg::OnShowSubnet( WPARAM wParam, LPARAM lParam )
  158. {
  159. CRouter* pRouter;
  160. pRouter = (CRouter*)routerArray.GetAt(wParam);
  161. m_msg = pRouter->m_strDescr;
  162. if(m_msg.Trim().GetLength() != 0) {
  163. m_msg += "rnUpTime: " + pRouter->m_strUpTime;
  164. }
  165. UpdateData(false);
  166. m_routerIndex = wParam;
  167. m_subNetList.DeleteAllItems();
  168. CString ip, mask;
  169. for( int i = 0; i < pRouter->m_IpArray.GetSize(); i ++ )
  170. {
  171. ip = pRouter->m_IpArray.GetAt(i);
  172. mask = pRouter->m_IpMaskArray.GetAt(i);
  173. if( ip.Left(0)!="0" && ip.Left(3)!="127" && ip.Left(3)!="255" )
  174. {
  175. DWORD dNetMask = inet_addr(mask);//converts dotted address into a proper address 
  176. DWORD dNetAddr = inet_addr(ip);
  177. dNetMask = ntohl(dNetMask);//converts a u_long from TCP/IP network order to host byte order 
  178. dNetAddr = ntohl(dNetAddr);
  179. DWORD dSubNet = dNetAddr & dNetMask;
  180. BYTE *byte = (BYTE *)&dSubNet;
  181. CString strIP;
  182. strIP.Format("%d.%d.%d.%d",
  183. (int)byte[3], (int)byte[2], (int)byte[1], (int)byte[0]);
  184. int index = m_subNetList.InsertItem( 0, strIP );
  185. m_subNetList.SetItemData( index, i );
  186. }
  187. }
  188. return 0L;
  189. }
  190. void CNetFinderDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
  191. {
  192. LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
  193. // TODO: 在此添加控件通知处理程序代码
  194. HTREEITEM hItem = pNMTreeView->itemNew.hItem;//新选中的节点
  195. if ( hItem != NULL)           //表示选中                   
  196. {
  197. int data = m_routerTree.GetItemData( hItem );
  198. SendMessage(MSG_SHOW_SUBNET, data, 0 );
  199. }
  200. *pResult = 0;
  201. }
  202. void CNetFinderDlg::OnBnClickedStopButton()
  203. {
  204. // TODO: 在此添加控件通知处理程序代码
  205. TerminateThread( pThread->m_hThread, 0 );
  206. m_msg =  _T("搜索线程被终止!");
  207. MessageBox(m_msg);
  208. UpdateData(false);
  209. GetDlgItem(IDC_START_BUTTON)->EnableWindow(true);
  210. GetDlgItem(IDC_START_BUTTON)->SetWindowText(_T("开始搜索"));
  211. GetDlgItem(IDC_STOP_BUTTON)->EnableWindow(false);
  212. }
  213. void CNetFinderDlg::OnNMDblclkList(NMHDR *pNMHDR, LRESULT *pResult)
  214. {
  215. // TODO: 在此添加控件通知处理程序代码
  216. LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
  217. int nSelected = pNMLV->iItem;
  218. if( nSelected >=0 ) {
  219. CSubNetDlg dlg(this);
  220. this->m_subNetIndex = this->m_subNetList.GetItemData(nSelected);
  221. CRouter* pRouter = (CRouter*)routerArray.GetAt(this->m_routerIndex);
  222. dlg.m_ip = pRouter->m_IpArray.GetAt(this->m_subNetIndex);
  223. dlg.m_mask = pRouter->m_IpMaskArray.GetAt(this->m_subNetIndex);
  224. dlg.m_community = this->m_community;
  225. dlg.DoModal();
  226. }
  227. *pResult = 0;
  228. }