SendDlg.cpp
上传用户:fengliqin8
上传日期:2007-04-13
资源大小:28k
文件大小:8k
源码类别:

进程与线程

开发平台:

Visual C++

  1. // SendDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Send.h"
  5. #include "SendDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CSendDlg dialog
  50. CSendDlg::CSendDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CSendDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CSendDlg)
  54. m_dwPackageSize = 0;
  55. m_strServerIp = _T("");
  56. m_nPort = 0;
  57. m_strFileName = _T("");
  58. m_strMsg = _T("");
  59. //}}AFX_DATA_INIT
  60. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  61. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  62. m_pTcpClient = new CTcpClient(this);
  63. }
  64. CSendDlg::~CSendDlg(void)
  65. {
  66. delete m_pTcpClient;
  67. }
  68. void CSendDlg::DoDataExchange(CDataExchange* pDX)
  69. {
  70. CDialog::DoDataExchange(pDX);
  71. //{{AFX_DATA_MAP(CSendDlg)
  72. DDX_Control(pDX, IDC_CNN_STATUS, m_ctlCnnStatus);
  73. DDX_Control(pDX, IDC_INFO, m_ctlInfo);
  74. DDX_Text(pDX, IDC_PACKAGE_SIZE, m_dwPackageSize);
  75. DDV_MinMaxInt(pDX, m_dwPackageSize, 1, 99996);
  76. DDX_Text(pDX, IDC_SERVER_IP, m_strServerIp);
  77. DDX_Text(pDX, IDC_PORT, m_nPort);
  78. DDX_Text(pDX, IDC_FILE_NAME, m_strFileName);
  79. DDX_Text(pDX, IDC_MSG, m_strMsg);
  80. //}}AFX_DATA_MAP
  81. }
  82. BEGIN_MESSAGE_MAP(CSendDlg, CDialog)
  83. //{{AFX_MSG_MAP(CSendDlg)
  84. ON_WM_SYSCOMMAND()
  85. ON_WM_PAINT()
  86. ON_WM_QUERYDRAGICON()
  87. ON_BN_CLICKED(IDC_CONNECT, OnConnect)
  88. ON_BN_CLICKED(IDC_DISCONNECT, OnDisconnect)
  89. ON_BN_CLICKED(IDC_SEND, OnSendFile)
  90. ON_BN_CLICKED(IDC_SEND_MSG, OnSendMsg)
  91. ON_BN_CLICKED(IDC_CANCEL_SEND, OnCancelSend)
  92. ON_WM_DESTROY()
  93. //}}AFX_MSG_MAP
  94. END_MESSAGE_MAP()
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CSendDlg message handlers
  97. BOOL CSendDlg::OnInitDialog()
  98. {
  99. CDialog::OnInitDialog();
  100. // Add "About..." menu item to system menu.
  101. // IDM_ABOUTBOX must be in the system command range.
  102. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  103. ASSERT(IDM_ABOUTBOX < 0xF000);
  104. CMenu* pSysMenu = GetSystemMenu(FALSE);
  105. if (pSysMenu != NULL)
  106. {
  107. CString strAboutMenu;
  108. strAboutMenu.LoadString(IDS_ABOUTBOX);
  109. if (!strAboutMenu.IsEmpty())
  110. {
  111. pSysMenu->AppendMenu(MF_SEPARATOR);
  112. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  113. }
  114. }
  115. // Set the icon for this dialog.  The framework does this automatically
  116. //  when the application's main window is not a dialog
  117. SetIcon(m_hIcon, TRUE); // Set big icon
  118. SetIcon(m_hIcon, FALSE); // Set small icon
  119. m_strServerIp = "127.0.0.1";
  120. m_nPort = 8000;
  121. m_dwPackageSize = 1024;
  122. m_strFileName = "d:\a.pdf";
  123. UpdateData(FALSE);
  124. m_pTcpClient->SetOnSocketSendErr(OnSocketSendErr);
  125. m_pTcpClient->SetOnSocketRecvErr(OnSocketRecvErr);
  126. m_pTcpClient->SetOnSocketClose(OnSocketClose);
  127. m_pTcpClient->SetOnOneNetMsg(OnOneNetMsg);
  128. m_pTcpClient->SetOnSendFileSucc(OnSendFileSucc);
  129. m_pTcpClient->SetOnSendFileFail(OnSendFileFail);
  130. m_pTcpClient->SetOnSendFileRefuseRecv(OnSendFileRefuseRecv);
  131. m_pTcpClient->SetOnSendFileCancelRecv(OnSendFileCancelRecv);
  132. m_pTcpClient->SetOnSendFileRecvFail(OnSendFileRecvFail);
  133. m_pTcpClient->SetOnSendFileProgress(OnSendFileProgress);
  134. return TRUE;  // return TRUE  unless you set the focus to a control
  135. }
  136. void CSendDlg::OnSysCommand(UINT nID, LPARAM lParam)
  137. {
  138. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  139. {
  140. CAboutDlg dlgAbout;
  141. dlgAbout.DoModal();
  142. }
  143. else
  144. {
  145. CDialog::OnSysCommand(nID, lParam);
  146. }
  147. }
  148. // If you add a minimize button to your dialog, you will need the code below
  149. //  to draw the icon.  For MFC applications using the document/view model,
  150. //  this is automatically done for you by the framework.
  151. void CSendDlg::OnPaint() 
  152. {
  153. if (IsIconic())
  154. {
  155. CPaintDC dc(this); // device context for painting
  156. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  157. // Center icon in client rectangle
  158. int cxIcon = GetSystemMetrics(SM_CXICON);
  159. int cyIcon = GetSystemMetrics(SM_CYICON);
  160. CRect rect;
  161. GetClientRect(&rect);
  162. int x = (rect.Width() - cxIcon + 1) / 2;
  163. int y = (rect.Height() - cyIcon + 1) / 2;
  164. // Draw the icon
  165. dc.DrawIcon(x, y, m_hIcon);
  166. }
  167. else
  168. {
  169. CDialog::OnPaint();
  170. }
  171. }
  172. // The system calls this to obtain the cursor to display while the user drags
  173. //  the minimized window.
  174. HCURSOR CSendDlg::OnQueryDragIcon()
  175. {
  176. return (HCURSOR) m_hIcon;
  177. }
  178. void CSendDlg::OnConnect() 
  179. {
  180. if(!UpdateData())
  181. return;
  182. m_pTcpClient->SetAddr((char *)(LPCTSTR)m_strServerIp);
  183. m_pTcpClient->SetPort(m_nPort);
  184. m_pTcpClient->SetPackageSize(m_dwPackageSize);
  185. m_ctlCnnStatus.SetWindowText("请等待...");
  186. if(!m_pTcpClient->Connect())
  187. m_ctlCnnStatus.SetWindowText("连接失败!");
  188. else
  189. m_ctlCnnStatus.SetWindowText("已连接");
  190. }
  191. void CSendDlg::OnDisconnect() 
  192. {
  193. m_pTcpClient->Disconnect();
  194. m_ctlCnnStatus.SetWindowText("断开连接");
  195. }
  196. void CSendDlg::OnSendFile() 
  197. {
  198. if(!UpdateData())
  199. return;
  200. m_pTcpClient->SetPackageSize(m_dwPackageSize);
  201. if(!m_pTcpClient->SendFile((char *)(LPCTSTR)m_strFileName))
  202. AfxMessageBox("发生文件失败");
  203. }
  204. void CSendDlg::OnSendMsg(void)
  205. {
  206. char s[99999];
  207. if(!UpdateData())
  208. return;
  209. sprintf(s, "@00000001%s", m_strMsg);
  210. m_pTcpClient->SendNetMsg(s, strlen(s) - 6);
  211. }
  212. void CSendDlg::OnSocketSendErr(void *pNotifyObj, SOCKET hSocket)
  213. {
  214. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  215. pSendDlg->m_ctlCnnStatus.SetWindowText("发送数据出错");
  216. }
  217. void CSendDlg::OnSocketRecvErr(void *pNotifyObj, SOCKET hSocket)
  218. {
  219. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  220. pSendDlg->m_ctlCnnStatus.SetWindowText("接收数据出错");
  221. }
  222. void CSendDlg::OnSocketClose(void *pNotifyObj, SOCKET hSocket)
  223. {
  224. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  225. pSendDlg->m_ctlCnnStatus.SetWindowText("断开连接");
  226. }
  227. void CSendDlg::OnOneNetMsg(void *pNotifyObj, char *Msg, int nMsgLen)
  228. {
  229. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  230. char s[9999];
  231. CString strInfo;
  232. strncpy(s, Msg, nMsgLen);
  233. s[nMsgLen] = 0;
  234. strInfo = s;
  235. pSendDlg->DispInfo(strInfo);
  236. }
  237. void CSendDlg::OnSendFileSucc(void *pNotifyObj, char *szPathName)
  238. {
  239. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  240. pSendDlg->DispInfo("OnSendFileSucc");
  241. }
  242. void CSendDlg::OnSendFileFail(void *pNotifyObj, char *szPathName)
  243. {
  244. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  245. pSendDlg->DispInfo("OnSendFileFail");
  246. }
  247. // 接收方拒绝接收文件
  248. void CSendDlg::OnSendFileRefuseRecv(void *pNotifyObj, char *szPathName)
  249. {
  250. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  251. pSendDlg->DispInfo("OnSendFileRefuseRecv");
  252. }
  253. // 接收方拒绝文件
  254. void CSendDlg::OnSendFileCancelRecv(void *pNotifyObj, char *szPathName)
  255. {
  256. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  257. pSendDlg->DispInfo("OnSendFileCancelRecv");
  258. }
  259. // 接收方取消接收
  260. void CSendDlg::OnSendFileRecvFail(void *pNotifyObj, char *szPathName)
  261. {
  262. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  263. pSendDlg->DispInfo("OnSendFileRecvFail");
  264. }
  265. void CSendDlg::OnSendFileProgress(void *pNotifyObj, int nSentBytes, int nTotalBytes)
  266. {
  267. CSendDlg *pSendDlg = (CSendDlg *)pNotifyObj;
  268. CString strInfo;
  269. strInfo.Format("%d / %d", nSentBytes, nTotalBytes);
  270. pSendDlg->DispInfo(strInfo);
  271. }
  272. void CSendDlg::DispInfo(CString strInfo)
  273. {
  274. m_ctlInfo.SetWindowText(strInfo);
  275. }
  276. void CSendDlg::OnCancelSend() 
  277. {
  278. m_pTcpClient->CancelSendFile();
  279. }
  280. void CSendDlg::OnDestroy() 
  281. {
  282. CDialog::OnDestroy();
  283. m_pTcpClient->Disconnect();
  284. }