第一次用VS写MFC,竟然还用了中文来作为文件名,想起来就觉得可耻呀~
窗体结构
关键代码
// 手机短信通信系统Dlg.h : 头文件
//#pragma once
#include "afxcmn.h"// C手机短信通信系统Dlg 对话框
class C手机短信通信系统Dlg : public CDialogEx
{// 构造
public:C手机短信通信系统Dlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_MY_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:CTabCtrl m_tabMain;afx_msg void OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);
};
手机短信通信系统Dlg.cpp
// 手机短信通信系统Dlg.cpp : 实现文件
//#include "stdafx.h"
#include "手机短信通信系统.h"
#include "手机短信通信系统Dlg.h"
#include "afxdialogex.h"
#include"Dialog1.h"
#include"Dialog2.h"
#include"Dialog3.h"
#include"Dialog4.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框CDialog1 m_para1;
CDialog2 m_para2;
CDialog3 m_para3;
CDialog4 m_para4;class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// C手机短信通信系统Dlg 对话框C手机短信通信系统Dlg::C手机短信通信系统Dlg(CWnd* pParent /*=NULL*/): CDialogEx(IDD_MY_DIALOG, pParent)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void C手机短信通信系统Dlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_TAB1, m_tabMain);
}BEGIN_MESSAGE_MAP(C手机短信通信系统Dlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &C手机短信通信系统Dlg::OnTcnSelchangeTab1)
END_MESSAGE_MAP()// C手机短信通信系统Dlg 消息处理程序BOOL C手机短信通信系统Dlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码//添加选项卡m_tabMain.InsertItem(0, _T("编辑短信"));//“选项卡1”可更改,是sheet页的名字;m_tabMain.InsertItem(1, _T("草稿箱"));m_tabMain.InsertItem(2, _T("发件箱"));m_tabMain.InsertItem(3, _T("收件箱"));//关联对话框,并且将IDC_TABMAIN控件设为父窗口m_para1.Create(IDD_DIALOG1, GetDlgItem(IDC_TAB1));m_para2.Create(IDD_DIALOG2, GetDlgItem(IDC_TAB1));m_para3.Create(IDD_DIALOG3, GetDlgItem(IDC_TAB1));m_para4.Create(IDD_DIALOG4, GetDlgItem(IDC_TAB1));//获得IDC_tabMain客户区大小CRect rs;m_tabMain.GetClientRect(&rs);//调整子对话框在父窗口中的位置,可以改动数值,使子窗体的大小合适;rs.top += 20;rs.bottom -= 3;rs.left += 2;rs.right -= 2;//设置子对话框尺寸并移动到指定位置m_para1.MoveWindow(&rs);m_para2.MoveWindow(&rs);m_para3.MoveWindow(&rs);m_para4.MoveWindow(&rs);//分别设置隐藏和显示m_para1.ShowWindow(true);m_para2.ShowWindow(false);m_para3.ShowWindow(false);m_para4.ShowWindow(false);//设置默认的选项卡m_tabMain.SetCurSel(0);return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}void C手机短信通信系统Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。 对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。void C手机短信通信系统Dlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR C手机短信通信系统Dlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void C手机短信通信系统Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{// TODO: 在此添加控件通知处理程序代码int CurSel = m_tabMain.GetCurSel();switch (CurSel){case 0:m_para1.ShowWindow(true);m_para2.ShowWindow(false);m_para3.ShowWindow(false);m_para4.ShowWindow(false);break;case 1:m_para1.ShowWindow(false);m_para2.ShowWindow(true);m_para3.ShowWindow(false);m_para4.ShowWindow(false);break;case 2:m_para1.ShowWindow(false);m_para2.ShowWindow(false);m_para3.ShowWindow(true);m_para4.ShowWindow(false);break;case 3:m_para1.ShowWindow(false);m_para2.ShowWindow(false);m_para3.ShowWindow(false);m_para4.ShowWindow(true);break;default:;}*pResult = 0;
}
手机短信通信系统.h
// 手机短信通信系统.h : PROJECT_NAME 应用程序的主头文件
//#pragma once#ifndef __AFXWIN_H__
#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
#endif#include "resource.h" // 主符号// C手机短信通信系统App:
// 有关此类的实现,请参阅 手机短信通信系统.cpp
//class C手机短信通信系统App : public CWinApp
{
public:C手机短信通信系统App();// 重写
public:virtual BOOL InitInstance();// 实现DECLARE_MESSAGE_MAP()
};extern C手机短信通信系统App theApp;
手机短信通信系统.cpp
// 手机短信通信系统.cpp : 定义应用程序的类行为。
//#include "stdafx.h"
#include "手机短信通信系统.h"
#include "手机短信通信系统Dlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// C手机短信通信系统AppBEGIN_MESSAGE_MAP(C手机短信通信系统App, CWinApp)ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()// C手机短信通信系统App 构造C手机短信通信系统App::C手机短信通信系统App()
{// 支持重新启动管理器m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;// TODO: 在此处添加构造代码,// 将所有重要的初始化放置在 InitInstance 中
}// 唯一的一个 C手机短信通信系统App 对象C手机短信通信系统App theApp;// C手机短信通信系统App 初始化BOOL C手机短信通信系统App::InitInstance()
{// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);// 将它设置为包括所有要在应用程序中使用的// 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCommonControlsEx(&InitCtrls);CWinApp::InitInstance();AfxEnableControlContainer();// 创建 shell 管理器,以防对话框包含// 任何 shell 树视图控件或 shell 列表视图控件。CShellManager *pShellManager = new CShellManager;// 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));// 标准初始化// 如果未使用这些功能并希望减小// 最终可执行文件的大小,则应移除下列// 不需要的特定初始化例程// 更改用于存储设置的注册表项// TODO: 应适当修改该字符串,// 例如修改为公司或组织名SetRegistryKey(_T("应用程序向导生成的本地应用程序"));C手机短信通信系统Dlg dlg;m_pMainWnd = &dlg;INT_PTR nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: 在此放置处理何时用// “确定”来关闭对话框的代码}else if (nResponse == IDCANCEL){// TODO: 在此放置处理何时用// “取消”来关闭对话框的代码}else if (nResponse == -1){TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");}// 删除上面创建的 shell 管理器。if (pShellManager != NULL){delete pShellManager;}#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)ControlBarCleanUp();
#endif// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,// 而不是启动应用程序的消息泵。return FALSE;
}
targetver.h
#pragma once// 包括 SDKDDKVer.h 将定义可用的最高版本的 Windows 平台。// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将
// 将 _WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。#include <SDKDDKVer.h>
stdafx.h
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件#pragma once#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif#include "targetver.h"#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
#define _AFX_ALL_WARNINGS#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展#include <afxdisp.h> // MFC 自动化类#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT#include <afxcontrolbars.h> // 功能区和控件条的 MFC 支持#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif
stdafx.cpp
// stdafx.cpp : 只包括标准包含文件的源文件
// 手机短信通信系统.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息#include "stdafx.h"
SendMessage2.h
#pragma once
#include"com_def.h"
int InitList2(PNode &L) {//初始化链表(双向循环链表)L = (PNode)malloc(sizeof(Node));L->next = L;L->prior = L;fstream SendMessage;//将发送箱里面短信写入到链表里面SendMessage.open("sendbuffer.txt", ios::in);while (!SendMessage.eof()){PNode q = (PNode)malloc(sizeof(Node));//if (!q)//{// cout << "Error!" << endl;// return 0;//}//申请失败则提示错误if (!SendMessage.getline(q->Mess.Receiver, 80))break;//读出收件人的姓名,读到空行则结束if (!SendMessage.getline(q->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!SendMessage.getline(q->Mess.Sender, 80))break;//读出收件人姓名,读到空行则结束q->Flag = 1;//由于是从发送箱中读取,故默认为1L->next->prior = q;//双向循环链表的建立q->next = L->next;q->prior = L;L->next = q;}SendMessage.close();fstream DraftMessage;//将草稿箱里面短信写入到链表里面DraftMessage.open("draftbuffer.txt", ios::in);while (!DraftMessage.eof()){PNode q = (PNode)malloc(sizeof(Node));//if (!q)//{// cout << "Error!" << endl;// return 0;//}//申请失败则提示错误if (!DraftMessage.getline(q->Mess.Receiver, 80))break;//读出收件人的姓名,读到空行则结束if (!DraftMessage.getline(q->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!DraftMessage.getline(q->Mess.Sender, 80))break;//读出收件人姓名,读到空行则结束q->Flag = 2;//由于是从草稿箱中读取,故默认为2L->next->prior = q;//双向循环链表的建立q->next = L->next;q->prior = L;L->next = q;}DraftMessage.close();return 1;
}
int DelateSendMessage(PNode L, int i) {//清空发送箱,将链表重新写入发送箱int j = 0;PNode p = L, q;ofstream ofsend("sendbuffer.txt");ofsend.clear();//清空发送箱while (p->next != L) {//遍历链表p = p->next;j++;if ((p->Flag == 1)) {//删除链表里面发送箱的某条信息if (j == i) {p->prior->next = p->next;p->next->prior = p->prior;q = p->prior;free(p);p = q;}else {ofsend << p->Mess.Receiver << endl << p->Mess.News << endl << p->Mess.Sender << endl; //除了删除节点,原来其他的发送箱短信重新写入}}}ofsend.close(); //写入发送箱return 1;
}
string FindSendMessage(PNode L, int i)
{string str;int j = 0;PNode p = L;while (p->next != L) {//遍历链表输出发件箱内容p = p->next;if (p->Flag == 1) {j++;if (j == i) {str = p->Mess.News;//cout << "第" << i << "条短信内容为:" << p->Mess.News << endl;}}}return str;
}
SendMessage1.h
#pragma once
#include"com_def.h"
#define N "00000000000000000000000000000"//宏定义标志信息结点是从文件读取还是从键盘输入
char *day[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };//输出周几需要的数组
int InitList1(PNode &L) {//初始化链表(双向循环链表)L = (PNode)malloc(sizeof(Node));L->next = L;L->prior = L;fstream SendMessage;//将发送箱里面短信写入到链表里面SendMessage.open("sendbuffer.txt", ios::in);while (!SendMessage.eof()){PNode q = (PNode)malloc(sizeof(Node));//if (!q)//{// cout << "Error!" << endl;// return 0;//}//申请失败则提示错误SendMessage.getline(q->ShowTime, 80);//从草稿箱中分别读取年月日、周几、时分秒到信息结点if (!SendMessage.getline(q->Mess.Receiver, 80))break;//读出收件人的姓名,读到空行则结束if (!SendMessage.getline(q->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!SendMessage.getline(q->Mess.Sender, 80))break;//读出收件人姓名,读到空行则结束q->Flag = 1;//由于是从发送箱中读取,故默认为1L->next->prior = q;//双向循环链表的建立q->next = L->next;q->prior = L;L->next = q;}SendMessage.close();fstream DraftMessage;//将草稿箱里面短信写入到链表里面DraftMessage.open("draftbuffer.txt", ios::in);while (!DraftMessage.eof()){PNode q = (PNode)malloc(sizeof(Node));//if (!q)//{// cout << "Error!" << endl;// return 0;//}//申请失败则提示错误DraftMessage.getline(q->ShowTime, 80);//从草稿箱中分别读取年月日、周几、时分秒到信息结点if (!DraftMessage.getline(q->Mess.Receiver, 80))break;//读出收件人的姓名,读到空行则结束if (!DraftMessage.getline(q->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!DraftMessage.getline(q->Mess.Sender, 80))break;//读出收件人姓名,读到空行则结束q->Flag = 2;//由于是从草稿箱中读取,故默认为2L->next->prior = q;//双向循环链表的建立q->next = L->next;q->prior = L;L->next = q;}DraftMessage.close();return 1;
}
int DelateDraftMessage(PNode L, int i) {//清空草稿箱,将链表重新写入草稿箱int j = 0;PNode p = L, q;ofstream ofdraft("draftbuffer.txt");ofdraft.clear();//清空草稿箱while (p->prior != L) {//遍历链表p = p->prior ;j++;if ((p->Flag == 2)) {//删除链表里面草稿箱的某条信息if (j == i) {p->prior->next = p->next;p->next->prior = p->prior;q = p->prior;free(p);p = q;}else {ofdraft << p->Mess.Receiver << endl << p->Mess.News << endl << p->Mess.Sender << endl; //除了删除节点,原来其他的草稿箱短信重新写入}}}ofdraft.close(); //写入草稿箱return 1;
}
void SendMessage(PNode &p, int s) {//用来将短信写入3个文件ofstream ofsend, ofreceive, ofdraft;if (s == 1) {ofsend.open("sendbuffer.txt", ios::app);ofreceive.open("receivebuffer.txt", ios::app);ofsend << (1900 + p->time.year) << "-" << (1 + p->time.mon) << "-" << p->time.mday << " " << day[p->time.wday] << " ";ofsend << p->time.hour << ":" << p->time.min << ":" << p->time.sec << endl;ofsend << p->Mess.Receiver << endl << p->Mess.News << endl << p->Mess .Sender << endl;ofreceive << (1900 + p->time.year) << "-" << (1 + p->time.mon) << "-" << p->time.mday << " " << day[p->time.wday] << " ";ofreceive << p->time.hour << ":" << p->time.min << ":" << p->time.sec << endl;ofreceive << p->Mess.Sender << endl << p->Mess.News << endl << p->Mess.Receiver << endl;ofsend.close();ofreceive.close();//分别写入发件箱和收件箱}else if (s == 2){ofdraft.open("draftbuffer.txt", ios::app);ofdraft << p->Mess.Receiver << endl << p->Mess.News << endl << p->Mess.Sender << endl;ofdraft.close(); //写入草稿箱}
}
void DraftToSendbuff(PNode L, int i) {//将草稿箱里的短信发送给发送箱int j = 0;PNode p = L;while (p->next != L) {//遍历链表输出发件箱内容p = p->next;j++;if ((p->Flag == 2) && (j == i)) {p->Flag = 1;//修改信息的状态,变为已发送状态SendMessage(p, 1);//写入发送箱中DelateDraftMessage(L, i);}}
}
string FindDraftMessage(PNode L, int i)
{string str;int j = 0;PNode p = L;while (p->next != L) {//遍历链表输出草稿箱内容p = p->next;if (p->Flag == 2) {j++;if (j == i) {str = p->Mess.News;//cout << "第" << i << "条短信内容为:" << p->Mess.News << endl;}}}return str;
}
SendMessage.h
#pragma once
#include"com_def.h"int InitList(PNode &L) {//初始化链表(双向循环链表)L = (PNode)malloc(sizeof(Node));L->next = L;L->prior = L;fstream SendMessage;//将发送箱里面短信写入到链表里面SendMessage.open("sendbuffer.txt", ios::in);while (!SendMessage.eof()){PNode q = (PNode)malloc(sizeof(Node));//if (!q)//{// cout << "Error!" << endl;// return 0;//}//申请失败则提示错误SendMessage.getline(q->ShowTime, 80);//从草稿箱中分别读取年月日、周几、时分秒到信息结点if (!SendMessage.getline(q->Mess.Receiver, 80))break;//读出收件人的姓名,读到空行则结束if (!SendMessage.getline(q->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!SendMessage.getline(q->Mess.Sender, 80))break;//读出收件人姓名,读到空行则结束q->Flag = 1;//由于是从发送箱中读取,故默认为1L->next->prior = q;//双向循环链表的建立q->next = L->next;q->prior = L;L->next = q;}SendMessage.close();fstream DraftMessage;//将草稿箱里面短信写入到链表里面DraftMessage.open("draftbuffer.txt", ios::in);while (!DraftMessage.eof()){PNode q = (PNode)malloc(sizeof(Node));//if (!q)//{// cout << "Error!" << endl;// return 0;//}//申请失败则提示错误DraftMessage.getline(q->ShowTime, 80);//从草稿箱中分别读取年月日、周几、时分秒到信息结点if (!DraftMessage.getline(q->Mess.Receiver, 80))break;//读出收件人的姓名,读到空行则结束if (!DraftMessage.getline(q->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!DraftMessage.getline(q->Mess.Sender, 80))break;//读出收件人姓名,读到空行则结束q->Flag = 2;//由于是从草稿箱中读取,故默认为2L->next->prior = q;//双向循环链表的建立q->next = L->next;q->prior = L;L->next = q;}DraftMessage.close();return 1;
}
resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 手机短信通信系统.rc 使用
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_MY_DIALOG 102
#define IDR_MAINFRAME 128
#define IDD_DIALOG1 130
#define IDD_DIALOG2 131
#define IDD_DIALOG3 132
#define IDD_DIALOG4 133
#define IDI_ICON1 139
#define IDC_TAB1 1000
#define IDC_EDIT1 1001
#define IDC_EDIT2 1002
#define IDC_EDIT3 1003
#define IDC_BUTTON1 1004
#define IDC_BUTTON2 1005
#define IDC_BUTTON3 1006
#define IDC_RADIO1 1007
#define IDC_RADIO2 1008
#define IDC_RADIO3 1009
#define IDC_RADIO4 1010
#define IDC_LIST1 1011
#define IDC_DATETIMEPICKER1 1012// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 140
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1017
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
ReceiveMessage.h
#pragma once
#include"com_def.h"
int ReadMessage(PNode &L, string receive)//建立
{const char* str1 = receive.c_str();fstream ReadMessage;//PNode ptr;L = (PNode)malloc(sizeof(Node));L->next = L;L->prior = L;ReadMessage.open("receivebuffer.txt", ios::in);while (!ReadMessage.eof()){PNode ptr = (PNode)malloc(sizeof(Node));if (!ReadMessage.getline(ptr->Mess.Sender, 80))break;//读出发件人的姓名,读到空行则结束if (!ReadMessage.getline(ptr->Mess.News, 80))break;//读出发件人的信息,读到空行则结束if (!ReadMessage.getline(ptr->Mess.Receiver, 80))break;//读出收件人姓名,读到空行则结束if (!strcmp(ptr->Mess.Receiver, str1))//收件箱中的收件人与本ID相同时,才链入链表{ptr->next = L->next;//双向循环链表的建立L->next->prior = ptr;ptr->prior = L;L->next = ptr;ptr->Flag = 0;//设置flag为0表示未读}//else//{// free(ptr);//不相等,则释放读取的废弃结点//}}ReadMessage.close();return 0;
}int DeleteMessage(PNode &L, int i) {//清空收件箱,将链表重新写入草稿箱int j = 0;PNode p = L, q;ofstream WriteFile("receivebuffer.txt");WriteFile.clear();//清空收件箱while (p->next != L) {//遍历链表p = p->next;j++;if (j == i) {p->prior->next = p->next;p->next->prior = p->prior;q = p->prior;free(p);p = q;}else {WriteFile << p->Mess.Sender << endl << p->Mess.News << endl << p->Mess.Receiver << endl; //除了删除节点,原来其他的草稿箱短信重新写入}}WriteFile.close();return 1;
}
string ReadOneMessage(PNode &head, int choice)//查找某条短信,同时标为已读
{int i = 0;PNode p;p = head;while (i < choice && p->next != head){p = p->next;i++;}if (i == choice)//退出循环时i 和choice 相等则查找到信息并且输出信息{p->Flag = 1;}return p->Mess.News;
}
Dialog4.h
#pragma once
#include "afxwin.h"// CDialog4 对话框class CDialog4 : public CDialogEx
{DECLARE_DYNAMIC(CDialog4)public:CDialog4(CWnd* pParent = NULL); // 标准构造函数virtual ~CDialog4();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG4 };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton1();int m_nRadio;afx_msg void OnBnClickedRadio2();afx_msg void OnBnClickedRadio1();afx_msg void OnEnChangeEdit1();CEdit m_edit;afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
};
Dialog4.cpp
// Dialog4.cpp : 实现文件
//#include "stdafx.h"
#include "手机短信通信系统.h"
#include "Dialog4.h"
#include "afxdialogex.h"
#include"ReceiveMessage.h"// CDialog4 对话框IMPLEMENT_DYNAMIC(CDialog4, CDialogEx)
PNode head;
CDialog4::CDialog4(CWnd* pParent /*=NULL*/): CDialogEx(IDD_DIALOG4, pParent), m_nRadio(0)
{
}CDialog4::~CDialog4()
{
}void CDialog4::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT1, m_edit);
}BEGIN_MESSAGE_MAP(CDialog4, CDialogEx)ON_BN_CLICKED(IDC_BUTTON2, &CDialog4::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON1, &CDialog4::OnBnClickedButton1)ON_BN_CLICKED(IDC_RADIO2, &CDialog4::OnBnClickedRadio2)ON_BN_CLICKED(IDC_RADIO1, &CDialog4::OnBnClickedRadio1)ON_EN_CHANGE(IDC_EDIT1, &CDialog4::OnEnChangeEdit1)ON_WM_CTLCOLOR()
END_MESSAGE_MAP()// CDialog4 消息处理程序void CDialog4::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码CString str;GetDlgItem(IDC_EDIT3)->GetWindowText(str);//获取收件人名字ReadMessage(head, CStringA(str).GetString());//建立链表CString str1, str2;PNode q;int i = 0;q = head;while (q->next != head)//遍历双向循环链表,读出信息时给信息添加序号显示到屏幕上//同时将结构体内的flag设为1标为已读{q = q->next;str1.Format("%d", ++i);str2 += str1;str2 += " . ";str2 += "发件人:";str2 += q->Mess.Sender;/*if (q->Flag == 0){str2 += "\t未读";}else{str2+= "\t已读";}*/str2 += "\r\n";//cout << ++i << ". 发件人: " << q->Mess.Sender << " 发送信息: " << q->Mess.News << endl;GetDlgItem(IDC_EDIT1)->SetWindowText(str2); //设置信息框中的内容}if (str == ""){i = -1;MessageBox("收件人不能为空");}if (!i){MessageBox("收件箱为空");GetDlgItem(IDC_EDIT1)->SetWindowText(""); //设置信息框中的内容}}void CDialog4::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CString str;string str1;int i;if (m_nRadio == 1){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);str1 = ReadOneMessage(head, i);str = str1.c_str();GetDlgItem(IDC_EDIT1)->SetWindowText(str);}else if (m_nRadio == 2){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);DeleteMessage(head, i);}
}void CDialog4::OnBnClickedRadio2()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 2;
}void CDialog4::OnBnClickedRadio1()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 1;
}void CDialog4::OnEnChangeEdit1()
{// TODO: 如果该控件是 RICHEDIT 控件,它将不// 发送此通知,除非重写 CDialogEx::OnInitDialog()// 函数并调用 CRichEditCtrl().SetEventMask(),// 同时将 ENM_CHANGE 标志“或”运算到掩码中。// TODO: 在此添加控件通知处理程序代码
}HBRUSH CDialog4::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);// TODO: 在此更改 DC 的任何特性//if (pWnd->GetDlgCtrlID() == IDC_EDIT1)//{// if (nCtlColor == CTLCOLOR_EDIT)// pDC->SetTextColor(RGB(255, 0, 0)); //设置文本颜色为红色// //else if(nCtlColor == CTLCOLOR_EDIT&&flag == 1)// // pDC->SetTextColor(RGB(255,255,255)); //设置文本颜色为黑色//}// TODO: 如果默认的不是所需画笔,则返回另一个画笔return hbr;
}
Dialog3.h
#pragma once// CDialog3 对话框class CDialog3 : public CDialogEx
{DECLARE_DYNAMIC(CDialog3)public:CDialog3(CWnd* pParent = NULL); // 标准构造函数virtual ~CDialog3();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG3 };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:int m_nRadio;afx_msg void OnBnClickedRadio1();afx_msg void OnBnClickedRadio2();afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton1();
};
Dialog3.cpp
// Dialog3.cpp : 实现文件
//#include "stdafx.h"
#include "手机短信通信系统.h"
#include "Dialog3.h"
#include "afxdialogex.h"
#include"SendMessage2.h"// CDialog3 对话框
PNode L2;
IMPLEMENT_DYNAMIC(CDialog3, CDialogEx)CDialog3::CDialog3(CWnd* pParent /*=NULL*/): CDialogEx(IDD_DIALOG3, pParent), m_nRadio(0)
{
}CDialog3::~CDialog3()
{
}void CDialog3::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CDialog3, CDialogEx)ON_BN_CLICKED(IDC_RADIO1, &CDialog3::OnBnClickedRadio1)ON_BN_CLICKED(IDC_RADIO2, &CDialog3::OnBnClickedRadio2)ON_BN_CLICKED(IDC_BUTTON2, &CDialog3::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON1, &CDialog3::OnBnClickedButton1)
END_MESSAGE_MAP()// CDialog3 消息处理程序void CDialog3::OnBnClickedRadio1()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 1;
}void CDialog3::OnBnClickedRadio2()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 2;
}void CDialog3::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码InitList2(L2);//建立链表CString str, str1;PNode p = L2;int i = 0;while (p->next != L2) {//遍历链表输出发件箱内容p = p->next;if (p->Flag == 1){str1.Format("%d", ++i);str += str1;str += " . ";str += "收件人:";str += p->Mess.Receiver;str += "\r\n";}GetDlgItem(IDC_EDIT1)->SetWindowText(str); //设置信息框中的内容}if (!i){MessageBox("发件箱为空");GetDlgItem(IDC_EDIT1)->SetWindowText(""); //设置信息框中的内容}
}void CDialog3::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CString str;string str1;int i;if (m_nRadio == 1){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);str1 = FindSendMessage(L2, i);str = str1.c_str();GetDlgItem(IDC_EDIT1)->SetWindowText(str);}else if (m_nRadio == 2){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);DelateSendMessage(L2, i);}
}
Dialog2.h
#pragma once// CDialog2 对话框class CDialog2 : public CDialogEx
{DECLARE_DYNAMIC(CDialog2)public:CDialog2(CWnd* pParent = NULL); // 标准构造函数virtual ~CDialog2();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG2 };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton2();int m_nRadio;afx_msg void OnBnClickedRadio1();afx_msg void OnBnClickedRadio2();afx_msg void OnBnClickedRadio3();afx_msg void OnBnClickedRadio4();afx_msg void OnBnClickedButton1();
};
Dialog2.cpp
// Dialog2.cpp : 实现文件
//#include "stdafx.h"
#include "手机短信通信系统.h"
#include "Dialog2.h"
#include "afxdialogex.h"
#include "SendMessage1.h"// CDialog2 对话框IMPLEMENT_DYNAMIC(CDialog2, CDialogEx)
PNode L1;CDialog2::CDialog2(CWnd* pParent /*=NULL*/): CDialogEx(IDD_DIALOG2, pParent), m_nRadio(0)
{
}CDialog2::~CDialog2()
{
}void CDialog2::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CDialog2, CDialogEx)ON_BN_CLICKED(IDC_BUTTON2, &CDialog2::OnBnClickedButton2)ON_BN_CLICKED(IDC_RADIO1, &CDialog2::OnBnClickedRadio1)ON_BN_CLICKED(IDC_RADIO2, &CDialog2::OnBnClickedRadio2)ON_BN_CLICKED(IDC_RADIO3, &CDialog2::OnBnClickedRadio3)ON_BN_CLICKED(IDC_RADIO4, &CDialog2::OnBnClickedRadio4)ON_BN_CLICKED(IDC_BUTTON1, &CDialog2::OnBnClickedButton1)
END_MESSAGE_MAP()// CDialog2 消息处理程序void CDialog2::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码InitList1(L1);//建立链表CString str, str1;PNode p = L1;int i = 0;while (p->prior != L1) {//遍历链表输出草稿箱内容p = p->prior ;if (p->Flag == 2){str1.Format("%d", ++i);str += str1;str += " . ";str += "收件人:";str += p->Mess.Receiver;str += "\r\n";}GetDlgItem(IDC_EDIT1)->SetWindowText(str); //设置信息框中的内容}if (!i){MessageBox("草稿箱信息为空");GetDlgItem(IDC_EDIT1)->SetWindowText(""); //设置信息框中的内容}
}void CDialog2::OnBnClickedRadio1()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 1;
}void CDialog2::OnBnClickedRadio2()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 2;
}void CDialog2::OnBnClickedRadio3()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 3;
}void CDialog2::OnBnClickedRadio4()
{// TODO: 在此添加控件通知处理程序代码m_nRadio = 4;
}void CDialog2::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码CString str;string str1;int i;if (m_nRadio == 1){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);DraftToSendbuff(L1, i);}else if (m_nRadio == 2){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);DelateDraftMessage(L1, i);}else if (m_nRadio == 3){GetDlgItem(IDC_EDIT2)->GetWindowTextA(str);i = _ttoi(str);str1 = FindDraftMessage(L1, i);str = str1.c_str();GetDlgItem(IDC_EDIT1)->SetWindowText(str);}
}
Dialog1.h
#pragma once// CDialog1 对话框class CDialog1 : public CDialog
{DECLARE_DYNAMIC(CDialog1)public:CDialog1(CWnd* pParent = NULL); // 标准构造函数virtual ~CDialog1();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DIALOG1 };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持DECLARE_MESSAGE_MAP()
public:afx_msg void OnBnClickedButton1();afx_msg void OnBnClickedButton2();afx_msg void OnBnClickedButton3();
};
Dialog1.cpp
// Dialog1.cpp : 实现文件
//#include "stdafx.h"
#include "手机短信通信系统.h"
#include "Dialog1.h"
#include "afxdialogex.h"
#include"SendMessage.h"// CDialog1 对话框IMPLEMENT_DYNAMIC(CDialog1, CDialog)
PNode L;CDialog1::CDialog1(CWnd* pParent /*=NULL*/): CDialog(IDD_DIALOG1, pParent)
{InitList(L);//建立链表
}CDialog1::~CDialog1()
{
}void CDialog1::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CDialog1, CDialog)ON_BN_CLICKED(IDC_BUTTON1, &CDialog1::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON2, &CDialog1::OnBnClickedButton2)ON_BN_CLICKED(IDC_BUTTON3, &CDialog1::OnBnClickedButton3)
END_MESSAGE_MAP()// CDialog1 消息处理程序void CDialog1::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码int flag = 0;CString str;ofstream ofdraft;PNode q = (PNode)malloc(sizeof(Node));q->Flag = 2;//因为是存入草稿箱,所以默认为2;GetDlgItem(IDC_EDIT1)->GetWindowText(str);//写入短信if (str != ""){strcpy_s(q->Mess.News, CStringA(str).GetString());}else{flag = 1;MessageBox("消息不能为空");}GetDlgItem(IDC_EDIT2)->GetWindowText(str);//写入发件人if (str != ""){strcpy_s(q->Mess.Sender, CStringA(str).GetString());}else{flag = 1;MessageBox("发件人不能为空");}GetDlgItem(IDC_EDIT3)->GetWindowText(str);//写入收件人if (str != ""){strcpy_s(q->Mess.Receiver, CStringA(str).GetString());}else{flag = 1;MessageBox("收件人不能为空");}if (flag != 1){ofdraft.open("draftbuffer.txt", ios::app);ofdraft << q->Mess.Receiver << endl << q->Mess.News << endl << q->Mess.Sender << endl;ofdraft.close(); //写入草稿箱L->next->prior = q;//插入双向循环链表q->next = L->next;q->prior = L;L->next = q;}GetDlgItem(IDC_EDIT1)->SetWindowText("");//清空编辑框GetDlgItem(IDC_EDIT2)->EnableWindow(false);//锁定发件人//GetDlgItem(IDC_EDIT3)->EnableWindow(true);//锁定收件人
}void CDialog1::OnBnClickedButton2()
{// TODO: 在此添加控件通知处理程序代码CString str;int flag = 0;ofstream ofsend, ofreceive;PNode q = (PNode)malloc(sizeof(Node));q->Flag = 1;//因为是存入发件箱,所以默认为1;GetDlgItem(IDC_EDIT1)->GetWindowText(str);//写入短信if (str != ""){strcpy_s(q->Mess.News, CStringA(str).GetString());}else{flag = 1;MessageBox("消息不能为空");}GetDlgItem(IDC_EDIT2)->GetWindowText(str);//写入发件人if (str != ""){strcpy_s(q->Mess.Sender, CStringA(str).GetString());}else{flag = 1;MessageBox("发件人不能为空");}GetDlgItem(IDC_EDIT3)->GetWindowText(str);//写入收件人if (str != ""){strcpy_s(q->Mess.Receiver, CStringA(str).GetString());}else{flag = 1;MessageBox("收件人不能为空");}if (flag != 1) {ofsend.open("sendbuffer.txt", ios::app);ofsend << q->Mess.Receiver << endl << q->Mess.News << endl << q->Mess.Sender << endl;ofsend.close(); //写入发件箱ofreceive.open("receivebuffer.txt", ios::app);ofreceive << q->Mess.Sender << endl << q->Mess.News << endl << q->Mess.Receiver << endl;ofreceive.close();//写入收件箱L->next->prior = q;//插入双向循环链表q->next = L->next;q->prior = L;L->next = q;}GetDlgItem(IDC_EDIT1)->SetWindowText("");//清空编辑框GetDlgItem(IDC_EDIT2)->EnableWindow(false);//锁定发件人//GetDlgItem(IDC_EDIT3)->EnableWindow(true);//锁定收件人
}void CDialog1::OnBnClickedButton3()
{GetDlgItem(IDC_EDIT3)->SetWindowText("");//清空编辑框GetDlgItem(IDC_EDIT2)->EnableWindow(true);//解锁发件人// TODO: 在此添加控件通知处理程序代码
}
com_def.h
#pragma once
#include"stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
#include<stdlib.h>
#include<cstdio>
#include<time.h>
#include<ctime>
using namespace std;
typedef struct Message {char Receiver[10];char News[30];char Sender[10];
}Message;
typedef struct Time
{int sec; /*秒,正常范围0-59, 但允许至61*/int min; /*分钟,0-59*/int hour; /*小时, 0-23*/int mday; /*日,即一个月中的第几天,1-31*/int mon; //月, 从一月算起,0-11 1+p->tm_mon;int year; //年, 从1900至今已经多少年 1900+ p->tm_year;int wday; /*星期,一周中的第几天, 从星期日算起,0-6*/
}Time;typedef struct Node {int Flag; //在发送信息时标志草稿箱或者发件箱的短信,在收件箱标志已读未读Message Mess;//短信的结构体char ShowTime[30];//从文件读取的时间的字符数组struct Time time;//存储时间的结构体struct Node *prior;//双向循环链表的前驱指针struct Node *next;//后继指针
}Node, *PNode;