ShortMessageDlg.cpp
上传用户:ynthgy
上传日期:2022-06-13
资源大小:1580k
文件大小:9k
源码类别:

手机短信编程

开发平台:

Visual C++

  1. // ShortMessageDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "ShortMessage.h"
  5. #include "ShortMessageDlg.h"
  6. #include "SmsTraffic.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #undef THIS_FILE
  10. static char THIS_FILE[] = __FILE__;
  11. #endif
  12. CSmsTraffic* m_pSmsTraffic;
  13. BOOL bIsOpenComm;
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CAboutDlg dialog used for App About
  16. class CAboutDlg : public CDialog
  17. {
  18. public:
  19. CAboutDlg();
  20. // Dialog Data
  21. //{{AFX_DATA(CAboutDlg)
  22. enum { IDD = IDD_ABOUTBOX };
  23. CListBox m_ListBox;
  24. //}}AFX_DATA
  25. // ClassWizard generated virtual function overrides
  26. //{{AFX_VIRTUAL(CAboutDlg)
  27. protected:
  28. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  29. //}}AFX_VIRTUAL
  30. // Implementation
  31. protected:
  32. //{{AFX_MSG(CAboutDlg)
  33. virtual void OnOK();
  34. //}}AFX_MSG
  35. DECLARE_MESSAGE_MAP()
  36. };
  37. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  38. {
  39. //{{AFX_DATA_INIT(CAboutDlg)
  40. //}}AFX_DATA_INIT
  41. }
  42. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  43. {
  44. CDialog::DoDataExchange(pDX);
  45. //{{AFX_DATA_MAP(CAboutDlg)
  46. DDX_Control(pDX, IDC_LIST1, m_ListBox);
  47. //}}AFX_DATA_MAP
  48. }
  49. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  50. //{{AFX_MSG_MAP(CAboutDlg)
  51. //}}AFX_MSG_MAP
  52. END_MESSAGE_MAP()
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CShortMessageDlg dialog
  55. CShortMessageDlg::CShortMessageDlg(CWnd* pParent /*=NULL*/)
  56. : CDialog(CShortMessageDlg::IDD, pParent)
  57. {
  58. //{{AFX_DATA_INIT(CShortMessageDlg)
  59. m_strMessage = _T("");
  60. m_strCenterNumber = _T("");
  61. m_strMobileNo = _T("");
  62. //}}AFX_DATA_INIT
  63. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  64. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  65. }
  66. void CShortMessageDlg::DoDataExchange(CDataExchange* pDX)
  67. {
  68. CDialog::DoDataExchange(pDX);
  69. //{{AFX_DATA_MAP(CShortMessageDlg)
  70. DDX_Control(pDX, IDC_LIST1, m_ListCtrl);
  71. DDX_Text(pDX, IDC_EDIT3, m_strMessage);
  72. DDX_Text(pDX, IDC_EDIT1, m_strCenterNumber);
  73. DDX_Text(pDX, IDC_EDIT2, m_strMobileNo);
  74. //}}AFX_DATA_MAP
  75. }
  76. BEGIN_MESSAGE_MAP(CShortMessageDlg, CDialog)
  77. //{{AFX_MSG_MAP(CShortMessageDlg)
  78. ON_WM_SYSCOMMAND()
  79. ON_WM_PAINT()
  80. ON_WM_QUERYDRAGICON()
  81. ON_WM_TIMER()
  82. ON_WM_DESTROY()
  83. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  84. //}}AFX_MSG_MAP
  85. END_MESSAGE_MAP()
  86. /////////////////////////////////////////////////////////////////////////////
  87. // CShortMessageDlg message handlers
  88. BOOL CShortMessageDlg::OnInitDialog()
  89. {
  90. CDialog::OnInitDialog();
  91. // Add "About..." menu item to system menu.
  92. // IDM_ABOUTBOX must be in the system command range.
  93. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  94. ASSERT(IDM_ABOUTBOX < 0xF000);
  95. CMenu* pSysMenu = GetSystemMenu(FALSE);
  96. if (pSysMenu != NULL)
  97. {
  98. CString strAboutMenu;
  99. strAboutMenu.LoadString(IDS_ABOUTBOX);
  100. if (!strAboutMenu.IsEmpty())
  101. {
  102. pSysMenu->AppendMenu(MF_SEPARATOR);
  103. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  104. }
  105. }
  106. // Set the icon for this dialog.  The framework does this automatically
  107. //  when the application's main window is not a dialog
  108. SetIcon(m_hIcon, TRUE); // Set big icon
  109. SetIcon(m_hIcon, FALSE); // Set small icon
  110. // TODO: Add extra initialization here
  111. if(OpenComm("COM1", 115200) == FALSE)
  112.     {
  113.         CString strError;
  114.         strError = "无法打开串口1! ";
  115.         MessageBox(strError, "警告", MB_OK);
  116.         bIsOpenComm = FALSE;
  117. return TRUE;
  118.     }
  119.     else
  120.     {
  121.         m_pSmsTraffic = new CSmsTraffic;
  122. bIsOpenComm = TRUE;
  123.     }
  124. m_strCenterNumber = "+8613800571500";
  125. /*
  126. m_ListCtrl.InsertColumn(0,"手机号码",LVCFMT_LEFT,80,-1); 
  127.     m_ListCtrl.InsertColumn(1,"短消息内容",LVCFMT_LEFT,620,-1);
  128. m_ListCtrl.InsertColumn(2,"时间",LVCFMT_LEFT,100,-1);
  129. */
  130. m_ListCtrl.InsertColumn(0,"接受短消息内容",LVCFMT_LEFT,800,-1);
  131. UpdateData(FALSE);
  132. SetTimer(1, 10001, NULL);
  133. return TRUE;  // return TRUE  unless you set the focus to a control
  134. }
  135. void CShortMessageDlg::OnSysCommand(UINT nID, LPARAM lParam)
  136. {
  137. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  138. {
  139. CAboutDlg dlgAbout;
  140. dlgAbout.DoModal();
  141. }
  142. else
  143. {
  144. CDialog::OnSysCommand(nID, lParam);
  145. }
  146. }
  147. // If you add a minimize button to your dialog, you will need the code below
  148. //  to draw the icon.  For MFC applications using the document/view model,
  149. //  this is automatically done for you by the framework.
  150. void CShortMessageDlg::OnPaint() 
  151. {
  152. if (IsIconic())
  153. {
  154. CPaintDC dc(this); // device context for painting
  155. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  156. // Center icon in client rectangle
  157. int cxIcon = GetSystemMetrics(SM_CXICON);
  158. int cyIcon = GetSystemMetrics(SM_CYICON);
  159. CRect rect;
  160. GetClientRect(&rect);
  161. int x = (rect.Width() - cxIcon + 1) / 2;
  162. int y = (rect.Height() - cyIcon + 1) / 2;
  163. // Draw the icon
  164. dc.DrawIcon(x, y, m_hIcon);
  165. }
  166. else
  167. {
  168. CDialog::OnPaint();
  169. }
  170. }
  171. // The system calls this to obtain the cursor to display while the user drags
  172. //  the minimized window.
  173. HCURSOR CShortMessageDlg::OnQueryDragIcon()
  174. {
  175. return (HCURSOR) m_hIcon;
  176. }
  177. void CShortMessageDlg::OnTimer(UINT nIDEvent) 
  178. {
  179. // TODO: Add your message handler code here and/or call default
  180. if(nIDEvent == 1)
  181.     {
  182. if(bIsOpenComm == TRUE)
  183. {
  184. SM_PARAM SmParam;
  185. // 取接收到的短消息
  186. while(m_pSmsTraffic->GetRecvMessage(&SmParam))
  187. {
  188. CString strNumber;
  189. CString strContent;
  190. CString strTemp;
  191. CString strTime;
  192. // 取短消息信息
  193. strNumber = SmParam.TPA;
  194. strContent = SmParam.TP_UD;
  195. strTemp = SmParam.TP_SCTS;
  196. strTime = "20" + strTemp.Mid(0,2)+ "-" + strTemp.Mid(2,2) +  "-" + strTemp.Mid(4,2) + " " + strTemp.Mid(6,2)+ ":" + strTemp.Mid(8,2)+ ":" + strTemp.Mid(10,2); 
  197. // 去掉号码前的"86"
  198. if(strNumber.Mid(0, 2) == "86")
  199. strNumber = strNumber.Mid(2,strNumber.GetLength() - 2);
  200. /*
  201. m_ListCtrl.InsertColumn(0,strNumber,LVCFMT_LEFT,80,-1); 
  202. m_ListCtrl.InsertColumn(1,strContent,LVCFMT_LEFT,320,-1);
  203. m_ListCtrl.InsertColumn(2,strTime,LVCFMT_LEFT,100,-1);
  204. */
  205. m_ListCtrl.InsertItem(0, strNumber);
  206. m_ListCtrl.InsertItem(1, strContent);
  207. m_ListCtrl.InsertItem(2, strTime);
  208. m_ListCtrl.InsertItem(3, "");
  209. }
  210. }
  211. }
  212. CDialog::OnTimer(nIDEvent);
  213. }
  214. void CShortMessageDlg::SmsSend(CString centerNumber, CString mobileNo, CString message, char mode)
  215. {
  216. CString strSmsc;
  217. CString strNumber;
  218. CString strContent;
  219.     strSmsc = centerNumber;
  220. strNumber = mobileNo;
  221. strContent = message;
  222. // 检查号码
  223. if(strNumber.GetLength() < 11)
  224. {
  225. // ShowMessage("请输入正确的号码!");
  226. return;
  227. }
  228. // 检查短消息内容是否空,或者超长
  229. CString strUnicode;
  230. WCHAR wchar[1024];
  231. int nCount = ::MultiByteToWideChar(CP_ACP, 0, strContent, -1, wchar, 1024);
  232. if(nCount <= 1)
  233. {
  234. // ShowMessage("请输入消息内容!");
  235. return;
  236. }
  237. else if(nCount > 70) // 我们决定全部用UCS2编码,最大70个字符(半角/全角)
  238. {
  239. // ShowMessage("消息内容太长,无法发送!");
  240. return;
  241. }
  242. SM_PARAM SmParam;
  243. ::memset(&SmParam, 0, sizeof(SM_PARAM));
  244. // 去掉号码前的"+"
  245. if(strSmsc[0] == '+')  strSmsc = strSmsc.Mid(1, strSmsc.GetLength()-1);
  246. if(strNumber[0] == '+')  strNumber = strNumber.Mid(1, strNumber.GetLength()-1);
  247. // 在号码前加"86"
  248. if(strSmsc.Mid(0,2) != "86")  strSmsc = "86" + strSmsc;
  249. if(strNumber.Mid(0,2) != "86")  strNumber = "86" + strNumber;
  250. // 填充短消息结构
  251. ::strcpy(SmParam.SCA, strSmsc);
  252. ::strcpy(SmParam.TPA, strNumber);
  253. ::strcpy(SmParam.TP_UD, strContent);
  254. SmParam.TP_PID = 0;
  255. //? SmParam.TP_DCS = GSM_7BIT;
  256. //? SmParam.TP_DCS = GSM_8BIT;
  257. SmParam.TP_DCS = GSM_UCS2;    
  258.     SmParam.mode = mode;
  259. // 发送短消息
  260. m_pSmsTraffic->PutSendMessage(&SmParam);
  261. }
  262. void CShortMessageDlg::OnDestroy() 
  263. {
  264. CDialog::OnDestroy();
  265. // TODO: Add your message handler code here
  266. KillTimer(1);
  267. delete m_pSmsTraffic;
  268. }
  269. void CShortMessageDlg::OnOK() 
  270. {
  271. // TODO: Add extra validation here
  272. //text mode
  273. UpdateData(TRUE);
  274.     CString centerNumber = m_strCenterNumber;
  275.     CString mobileNo = m_strMobileNo;
  276.     CString message = m_strMessage;    
  277.     char mode = 1;
  278.     SmsSend(centerNumber, mobileNo, message, mode);
  279.     //?CDialog::OnOK();
  280. }
  281. void CShortMessageDlg::OnButton1() 
  282. {
  283. // TODO: Add your control notification handler code here
  284.     //pdu mode
  285. UpdateData(TRUE);
  286.     CString centerNumber = m_strCenterNumber;
  287.     CString mobileNo = m_strMobileNo;
  288.     CString message = m_strMessage;
  289.     char mode = 0;
  290.     SmsSend(centerNumber, mobileNo, message, mode);
  291. }
  292. void CAboutDlg::OnOK() 
  293. {
  294. // TODO: Add extra validation here
  295. CDialog::OnOK();
  296. }