移动通信实验手册4-短信收发VC编程
移动终端开发 VC编程实践——短信收发实现
实验目的:1)在实验 3的基础上,进一步通过编程实现手机短信的收发;
2)加深对 VC编程的理解和实践。
(注意:此实验文档以工程名 mygsm为基础编写的,每一组的工程名都不同,请根据自己
组实验 3的工程名作相应修改!不要盲目照抄!)
1. 在上次的工程中,将所有的 CView 类修改为 CListView 类,以显示短信的读取显示功
能;即在程序中查找所有的 CView,替换为 CListView,并且在StdAfx.h头文
件总添加如下语句:
#inc...
移动终端开发 VC编程实践——短信收发实现
实验目的:1)在实验 3的基础上,进一步通过编程实现手机短信的收发;
2)加深对 VC编程的理解和实践。
(注意:此实验文档以工程名 mygsm为基础编写的,每一组的工程名都不同,请根据自己
组实验 3的工程名作相应修改!不要盲目照抄!)
1. 在上次的工程中,将所有的 CView 类修改为 CListView 类,以显示短信的读取显示功
能;即在程序中查找所有的 CView,替换为 CListView,并且在StdAfx.h头文
件总添加如下语句:
#include
2. 利用ClassWizard创建如下的函数:
点击此按钮编辑函数
点击此按钮增加函数
3. 在上图中先点击“Add Function”按钮,再点击“Edit Code”按钮,添加如下代码:
CListCtrl& ListCtrl = GetListCtrl();
ListCtrl.InsertColumn(0, "号码", LVCFMT_LEFT, 100);
ListCtrl.InsertColumn(1, "时间", LVCFMT_LEFT, 140);
ListCtrl.InsertColumn(2, "消息内容", LVCFMT_LEFT, 500);
SetTimer(1, 1000, NULL); //设置定时器 1,每 1秒触发一次
为了让 ListCtrl正常显示,在 CMygsmView中的 PreCreateWindow增加如下一行代码:
cs.style |= LVS_SHOWSELALWAYS | LVS_REPORT;
4. 同理创建 OnDestroy函数:
5. 点击“Add Function”按钮,再点击“Edit Code”按钮,添加代码:
KillTimer(1); //关闭定时器 1
6. 添加一个发送短信资源对话框如下:
其中,对话框 ID为 IDD_SEND_SM,属性设置如下:
ID 定 义 为 :
IDC_NUMBER ID 定 义 为 :
IDC_CONTENT
7. 在MainFrm.h中定义:
CDialogBar m_wndDialogBar;
在MainFrm.cpp的 OnCreate函数中增加如下代码:
8. 将“VC++手机短信收发例程”下负责短信收发处理的 SmsTraffic.h和 SmsTraffic.cpp拷
贝到当前工程的文件夹下,选择 VC++的菜单栏 Project—>Add to Project —>Files将这
两个文件加入到工程中。
9. 将 SmsFraffic.cpp中的包含文件改为自己创建的工程名:
改为自己的工程
10. 在新创建的 IDD_SEND_SM对话框上选中“发送”按钮,点击右键选择 ClassWizard,
在出现的“Adding a Class”窗口中选择 Cancel,如下图所示:
11. 在如下的对话框中先点击“Add Function”再点击“Edit Code”:
5
4
3
2
1
12. 点击“Edit Code”后输入如下发送短信代码:
CComboBox* pNumberWnd=(CComboBox*)m_wndDialogBar.GetDlgItem(IDC_NUMBER);
CComboBox* pContentWnd=(CComboBox*)m_wndDialogBar.GetDlgItem(IDC_CONTENT);
CString strSmsc;
CString strNumber;
CString strContent;
strSmsc = "13800280500"; //成都移动短信中心号码,如果是联通请改为 13010811500
pNumberWnd->GetWindowText(strNumber);
pContentWnd->GetWindowText(strContent);
// 检查号码
if(strNumber.GetLength() < 11)
{
AfxMessageBox("请输入正确的号码!");
pNumberWnd->SetFocus();
pNumberWnd->SetEditSel(-1, 0);
return;
}
// 检查短消息内容是否空,或者超长
CString strUnicode;
WCHAR wchar[1024];
int nCount = ::MultiByteToWideChar(CP_ACP, 0, strContent, -1, wchar, 1024);
if(nCount <= 1)
{
AfxMessageBox("请输入消息内容!");
pContentWnd->SetFocus();
pContentWnd->SetEditSel(-1, 0);
return;
}
else if(nCount > 70) // 全部用 UCS2编码,最大 70个字符(半角/全角)
{
AfxMessageBox("消息内容太长,无法发送!");
pContentWnd->SetFocus();
pContentWnd->SetEditSel(-1, 0);
return;
}
if(AfxMessageBox("确定发送吗?", MB_YESNO) == IDYES)
{
SM_PARAM SmParam;
memset(&SmParam, 0, sizeof(SM_PARAM));
// 去掉号码前的"+"
if(strSmsc[0] == '+') strSmsc = strSmsc.Mid(1);
if(strNumber[0] == '+') strNumber = strNumber.Mid(1);
// 在号码前加"86"
if(strSmsc.Left(2) != "86") strSmsc = "86" + strSmsc;
if(strNumber.Left(2) != "86") strNumber = "86" + strNumber;
// 填充短消息结构
strcpy(SmParam.SCA, strSmsc);
strcpy(SmParam.TPA, strNumber);
strcpy(SmParam.TP_UD, strContent);
SmParam.TP_PID = 0;
SmParam.TP_DCS = GSM_UCS2;
// 发送短消息
theApp.m_pSmsTraffic->PutSendMessage(&SmParam);
// 列表中加入新串
if(pNumberWnd->FindStringExact(-1, strNumber)<0) pNumberWnd->InsertString(0, strNumber);
if(pContentWnd->FindStringExact(-1, strContent)<0) pContentWnd->InsertString(0, strContent);
}
pContentWnd->SetFocus();
pContentWnd->SetEditSel(-1, 0);
13. 在 mygsm.h中增加包含文件和变量定义:
#include "SmsTraffic.h"
public://定义在类里面
CSmsTraffic* m_pSmsTraffic;
在类定义之后,即
class CMygsmApp : public CWinApp{……};之后增加:
extern CMygsmApp theApp; // CMygsmApp需要根据自己的 App修改
在 CMygsmApp中的 InitInstance()函数 return语句之前增加如下初始化语句:
m_pSmsTraffic = new CSmsTraffic;
14. 在工程中增加 OnTimer()函数定时显示接收到的短信:
15. 点击“Add Function”,再点击“Edit Code”,增加如下代码:
if(nIDEvent == 1) //对应 3中的 SetTimer(1, 1000, NULL)
{
SM_PARAM SmParam;
CString strTime;
CString strNumber;
CString strContent;
CListCtrl& ListCtrl = GetListCtrl();
// 取接收到的短消息
if(theApp.m_pSmsTraffic->GetRecvMessage(&SmParam))
{
// 取短消息信息
strNumber = SmParam.TPA;
strContent = SmParam.TP_UD;
strTime = "20" + CString(&SmParam.TP_SCTS[0],2)
+ "-" + CString(&SmParam.TP_SCTS[2],2)
+ "-" + CString(&SmParam.TP_SCTS[4],2)
+ " " + CString(&SmParam.TP_SCTS[6],2)
+ ":" + CString(&SmParam.TP_SCTS[8],2)
+ ":" + CString(&SmParam.TP_SCTS[10],2);
// 去掉号码前的"86"
if(strNumber.Left(2) == "86") strNumber = strNumber.Mid(2);
// 最多保留 200条
int nItemCount = ListCtrl.GetItemCount();
if(nItemCount >= 200)
{
ListCtrl.DeleteItem(0);
nItemCount--;
}
// 插入新消息
ListCtrl.InsertItem(nItemCount, strNumber);
ListCtrl.SetItemText(nItemCount, 1, strTime);
ListCtrl.SetItemText(nItemCount, 2, strContent);
ListCtrl.EnsureVisible(nItemCount, FALSE);
}
}
else
{
// other timers
CListView::OnTimer(nIDEvent);
}
16. 调制并测试整个程序以实现短信的接收和发送,实现结果如下:
实验报告要求:
1、 根据自己组的实验情况,写出实验过程中出现的错误及解决的方法;
2、根据程序中实现短信收发的代码分析短信收发处理的流程(需要画出程序调用关系及流
程图)。
本文档为【移动通信实验手册4-短信收发VC编程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。