WinPingDlg.cpp
上传用户:qzzxgm
上传日期:2009-12-14
资源大小:1882k
文件大小:8k
源码类别:

书籍源码

开发平台:

Visual C++

  1. // WinPingDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "WinPing.h"
  5. #include "WinPingDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. // CAboutDlg dialog used for App About
  12. /////////////////////////////////////////////////////////////////////////////
  13. // WINPING - Developed by Norm Almond, Acknowledgements to Chris Maunder & Lewis Napper
  14. //
  15. // MAINTANENCE LOG:
  16. //
  17. // Version 1.0 - Public Release
  18. //
  19. // Version 1.1 - Fix combo assert in debug
  20. //             - Fix repeated string entries in combo
  21. //             - Fix Ping times now correct
  22. /////////////////////////////////////////////////////////////////////////////
  23. class CAboutDlg : public CDialog
  24. {
  25. public:
  26. CAboutDlg();
  27. // Dialog Data
  28. //{{AFX_DATA(CAboutDlg)
  29. enum { IDD = IDD_ABOUTBOX };
  30. //}}AFX_DATA
  31. // ClassWizard generated virtual function overrides
  32. //{{AFX_VIRTUAL(CAboutDlg)
  33. protected:
  34. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  35. //}}AFX_VIRTUAL
  36. // Implementation
  37. protected:
  38. //{{AFX_MSG(CAboutDlg)
  39. //}}AFX_MSG
  40. DECLARE_MESSAGE_MAP()
  41. };
  42. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  43. {
  44. //{{AFX_DATA_INIT(CAboutDlg)
  45. //}}AFX_DATA_INIT
  46. }
  47. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  48. {
  49. CDialog::DoDataExchange(pDX);
  50. //{{AFX_DATA_MAP(CAboutDlg)
  51. //}}AFX_DATA_MAP
  52. }
  53. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  54. //{{AFX_MSG_MAP(CAboutDlg)
  55. //}}AFX_MSG_MAP
  56. END_MESSAGE_MAP()
  57. /////////////////////////////////////////////////////////////////////////////
  58. // CWinPingDlg dialog
  59. CWinPingDlg::CWinPingDlg(CWnd* pParent /*=NULL*/)
  60. : CDialog(CWinPingDlg::IDD, pParent)
  61. {
  62. //{{AFX_DATA_INIT(CWinPingDlg)
  63. m_strRetry = _T("");
  64. //}}AFX_DATA_INIT
  65. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  66. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  67. m_nDir = 0;
  68. m_nPos = 0;
  69. m_bProgress = FALSE;
  70. }
  71. void CWinPingDlg::DoDataExchange(CDataExchange* pDX)
  72. {
  73. CDialog::DoDataExchange(pDX);
  74. //{{AFX_DATA_MAP(CWinPingDlg)
  75. DDX_Control(pDX, IDC_SPIN1, m_spinner);
  76. DDX_Control(pDX, IDC_LIST, m_list);
  77. DDX_Text(pDX, IDC_RETRIES, m_strRetry);
  78. DDX_Control(pDX, IDC_SERVERS, m_cboServers);
  79. //}}AFX_DATA_MAP
  80. }
  81. BEGIN_MESSAGE_MAP(CWinPingDlg, CDialog)
  82. //{{AFX_MSG_MAP(CWinPingDlg)
  83. ON_WM_SYSCOMMAND()
  84. ON_WM_PAINT()
  85. ON_WM_QUERYDRAGICON()
  86. ON_BN_CLICKED(ID_PING, OnPing)
  87. ON_WM_TIMER()
  88. ON_MESSAGE(WM_MSG_STATUS,OnStatus)
  89. ON_MESSAGE(WM_PING_END,OnPingEnd)
  90. //}}AFX_MSG_MAP
  91. END_MESSAGE_MAP()
  92. /////////////////////////////////////////////////////////////////////////////
  93. // CWinPingDlg message handlers
  94. BOOL CWinPingDlg::OnInitDialog()
  95. {
  96. CDialog::OnInitDialog();
  97. // Add "About..." menu item to system menu.
  98. // IDM_ABOUTBOX must be in the system command range.
  99. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  100. ASSERT(IDM_ABOUTBOX < 0xF000);
  101. CMenu* pSysMenu = GetSystemMenu(FALSE);
  102. if (pSysMenu != NULL)
  103. {
  104. CString strAboutMenu;
  105. strAboutMenu.LoadString(IDS_ABOUTBOX);
  106. if (!strAboutMenu.IsEmpty())
  107. {
  108. pSysMenu->AppendMenu(MF_SEPARATOR);
  109. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  110. }
  111. }
  112. // Set the icon for this dialog.  The framework does this automatically
  113. //  when the application's main window is not a dialog
  114. SetIcon(m_hIcon, TRUE); // Set big icon
  115. SetIcon(m_hIcon, FALSE); // Set small icon
  116. CString strHost;
  117. CString str;
  118. //读取INI文件,获得上次ping过的主机地址
  119. int nEntrys = AfxGetApp()->GetProfileInt("MRU","Entries",0);
  120. for (int n=0;n < nEntrys;n++)
  121. {
  122. str.Format("Host#%d",n);
  123. strHost = AfxGetApp()->GetProfileString("MRU",str,"");
  124. m_cboServers.AddString(strHost);
  125. }
  126. //创建图标链表
  127. m_img.Create(IDB_LOG,16,1,RGB(255,0,255));
  128. //初始化控件
  129. CRect rc;
  130. CWnd* pWnd;
  131. pWnd= GetDlgItem(IDC_FROM);
  132. pWnd->GetWindowRect(rc);
  133. ScreenToClient(rc);
  134. m_ptFrom = rc.BottomRight();
  135. m_ptFrom.x+=5;
  136. pWnd= GetDlgItem(IDC_TO);
  137. pWnd->GetWindowRect(rc);
  138. ScreenToClient(rc);
  139. m_ptTo = CPoint(rc.left,rc.bottom);
  140. //设置列表框风格
  141. m_list.InsertColumn(0,"Status",LVCFMT_LEFT,800);
  142. m_list.SetImageList(&m_img, LVSIL_SMALL);
  143. m_list.GetClientRect(rc);
  144. m_list.SetColumnWidth(0,rc.Width());
  145. m_rcRect.left = m_ptFrom.x;
  146. m_rcRect.right = m_ptTo.x;
  147. m_rcRect.top = m_rcRect.bottom = m_ptFrom.y;
  148. m_rcRect.InflateRect(0,3);
  149. m_spinner.SetRange(1,99);
  150. m_spinner.SetPos(5);
  151. // TODO: Add extra initialization here
  152. return TRUE;  // return TRUE  unless you set the focus to a control
  153. }
  154. void CWinPingDlg::OnSysCommand(UINT nID, LPARAM lParam)
  155. {
  156. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  157. {
  158. CAboutDlg dlgAbout;
  159. dlgAbout.DoModal();
  160. }
  161. else
  162. {
  163. CDialog::OnSysCommand(nID, lParam);
  164. }
  165. }
  166. // If you add a minimize button to your dialog, you will need the code below
  167. //  to draw the icon.  For MFC applications using the document/view model,
  168. //  this is automatically done for you by the framework.
  169. void CWinPingDlg::OnPaint() 
  170. {
  171. CPaintDC dc(this); // device context for painting
  172. if (IsIconic())
  173. {
  174. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  175. // Center icon in client rectangle
  176. int cxIcon = GetSystemMetrics(SM_CXICON);
  177. int cyIcon = GetSystemMetrics(SM_CYICON);
  178. CRect rect;
  179. GetClientRect(&rect);
  180. int x = (rect.Width() - cxIcon + 1) / 2;
  181. int y = (rect.Height() - cyIcon + 1) / 2;
  182. // Draw the icon
  183. dc.DrawIcon(x, y, m_hIcon);
  184. }
  185. else
  186. {
  187. //画对话框顶部的动画
  188. dc.MoveTo(m_ptFrom);
  189. dc.LineTo(m_ptTo);
  190. if (m_bProgress)
  191. {
  192. //根据位置的变化
  193. CRect rc(m_nPos,m_ptTo.y,m_nPos,m_ptTo.y);
  194. rc.InflateRect(3,3);
  195. CBrush br(RGB(255,0,0));
  196. CBrush* pBrush = dc.SelectObject(&br);
  197. dc.Rectangle(rc);
  198. dc.SelectObject(pBrush);
  199. }
  200. CDialog::OnPaint();
  201. }
  202. }
  203. // The system calls this to obtain the cursor to display while the user drags
  204. //  the minimized window.
  205. HCURSOR CWinPingDlg::OnQueryDragIcon()
  206. {
  207. return (HCURSOR) m_hIcon;
  208. }
  209. void CWinPingDlg::OnPing() 
  210. {
  211. //更新数据
  212. UpdateData(TRUE);
  213. //使ping按钮,两个CComboBox控件无效
  214. EnableControls(FALSE);
  215. int nRetries = m_spinner.GetPos();
  216. int nCnt = m_list.GetItemCount();
  217. if (nCnt > 0)
  218. {
  219. m_list.InsertItem(nCnt,"",4);
  220. }
  221. CString strHost;
  222. GetDlgItem(IDC_SERVERS)->GetWindowText(strHost);
  223. //开始ping
  224. m_pingThread.StartPing(nRetries,strHost,m_hWnd);
  225. m_nPos = m_ptFrom.x;
  226. m_nDir = 20;
  227. //设定定时器
  228. SetTimer(0x1001,100,NULL);
  229. m_bProgress = TRUE;
  230. }
  231. //响应ping的过程中ping线程发过来的状态消息
  232. LRESULT CWinPingDlg::OnStatus(WPARAM wParam, LPARAM lParam)
  233. {
  234. char* pMsg = (char*) lParam;
  235. int nCnt = m_list.GetItemCount();
  236. int i = m_list.InsertItem(nCnt,pMsg,wParam);
  237. m_list.EnsureVisible(i,FALSE);
  238. delete pMsg;
  239. return 0;
  240. }
  241. //ping结束
  242. LRESULT CWinPingDlg::OnPingEnd(WPARAM wParam, LPARAM lParam)
  243. {
  244. EnableControls(TRUE);
  245. m_bProgress = FALSE;
  246. InvalidateRect(m_rcRect,TRUE);
  247. KillTimer(0x1001);
  248. if (lParam == 1)
  249. {
  250. CString strHost;
  251. GetDlgItem(IDC_SERVERS)->GetWindowText(strHost);
  252. //将已经ping过的地址加到列表框中
  253. if (m_cboServers.FindStringExact(-1,strHost) == CB_ERR)
  254. m_cboServers.AddString(strHost);
  255. GetDlgItem(IDC_SERVERS)->SetFocus();
  256. }
  257. return 0;
  258. }
  259. //更新ping进度
  260. void CWinPingDlg::OnTimer(UINT nIDEvent) 
  261. {
  262. m_nPos += m_nDir;
  263. InvalidateRect(m_rcRect,TRUE);
  264. if (m_nPos > m_ptTo.x)
  265. {
  266. m_nDir = -20;
  267. m_nPos = m_ptTo.x - 5;
  268. }
  269. if (m_nPos < m_ptFrom.x)
  270. {
  271. m_nDir = +20;
  272. m_nPos = m_ptFrom.x + 5;
  273. }
  274. CDialog::OnTimer(nIDEvent);
  275. }
  276. //设置控件状态
  277. void CWinPingDlg::EnableControls(BOOL bEnable)
  278. {
  279. GetDlgItem(IDC_SERVERS)->EnableWindow(bEnable);
  280. GetDlgItem(IDC_RETRIES)->EnableWindow(bEnable);
  281. GetDlgItem(ID_PING)->EnableWindow(bEnable);
  282. }
  283. //关闭窗口
  284. void CWinPingDlg::OnCancel() 
  285. {
  286. CString strHost;
  287. CString str;
  288. //写入ini文件
  289. int nCnt = m_cboServers.GetCount();
  290. AfxGetApp()->WriteProfileInt("MRU","Entries",nCnt);
  291. for (int n=0;n < nCnt;n++)
  292. {
  293. m_cboServers.GetLBText(n,strHost);
  294. str.Format("Host#%d",n);
  295. AfxGetApp()->WriteProfileString("MRU",str,strHost);
  296. }
  297. CDialog::OnCancel();
  298. }