阿里巴巴 macos sqlite interface node redis常用语句 emacs swagger vue部署 vue开发文档 后台ui模板 网站后台管理模板 郑州小程序公司 网络营销视频教程 sql视频教程 js获取焦点事件 oracle行转列函数 Navicat mysql时间戳转换日期 python网络编程 python3教程 python自学教程 python创建数据库 python如何调用函数 python获取时间戳 java开发环境安装 java新建文件 磁盘分区软件 千千静听绿色版 1660ti php抓取网页数据 只狼脚本 begininvoke 亚索刀光 桌面数字时钟 数组求和 汉仪文黑 文字转语音工具 电脑代码雨 mp4剪切合并大师
当前位置: 首页 > 学习教程  > 编程语言

mfc 学习的第七天

2021/1/13 20:29:12 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

mfc 学习的第七天 1、新建项目 1.1根据向导创建项目 首先,新建MFC项目(SaleSystem),基于单文档,MFC标准项目,同时去掉工具栏(去掉勾选 使用传统的停靠工具栏)。 1.2添加预处理指令 由于微软在VS2013中不…

mfc 学习的第七天

1、新建项目

1.1根据向导创建项目
首先,新建MFC项目(SaleSystem),基于单文档,MFC标准项目,同时去掉工具栏(去掉勾选 使用传统的停靠工具栏)。

1.2添加预处理指令
由于微软在VS2013中不建议在使用C/C++的传统库函数scanf,strcpy,sprintf等,所以直接使用这些库函数会提示C4996错误。
VS建议采用带_s的函数,如scanf_s,strcpy_s,但这些并不是标准C/C++函数。想要继续使用此函数,需要添加_CRT_SECURE_NO_WARNINGS这个预定义。
在项目→属性→C/C++→预处理器→预处理器定义中添加_CRT_SECURE_NO_WARNINGS

1.3设置窗口属性
1.3.1设置图标
打开资源视图,添加本地ICO图标,在res文件夹中添加我们提前准备的图标资源。
在资源的属性中修改ID(ID_ICON_WIN)
在CMainFrame的OnCreate()中添加如下代码:
//设置图标,IDI_ICON_WIN为图标资源ID
SetClassLong(m_hWnd, GCL_HICON, (LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN));
1.3.2设置窗口大小和居中显示
还是在CMainFrame的OnCreate()中接着写代码:
//设置窗口的位置和大小:CWnd::MoveWindow
//0,0 起点坐标x和y
//800,500 窗口宽度和高度
MoveWindow(0, 0, 800, 500);
//设置居中显示
CenterWindow();
1.3.3设置窗口标题
在CSaleSystemDoc文档类中的OnNewDocument()函数中添加如下代码:
//设置窗口标题前缀,CDocument::SetTitle
SetTitle(TEXT(“销售管理系统”));
在CMainFrame的OnCreate()中添加如下代码:
//设置窗口标题后缀
SetTitle(TEXT(“销售管理系统”));

2、文件处理
2.1文件内容格式
登录用户信息:
login.ini
商品信息:
stock.txt
m
2.2设计文件处理类CInfoFile
2.2.1添加文件处理类CInfoFile
右击项目→添加→添加现有项→选择中InfoFile.h .cpp→确定
2.2.2头文件InfoFile.h的设计
定义两个配置文件路径宏:
#define _F_LOGIN “./login.ini”
#define _F_STOCK “./stock.txt”
添加文件信息结构体,具体如下:
struct msg
{
int id; //商品id
string name; //商品名
int price; //商品价格
int num; //商品个数
};
商品很多,而且要经常添加删除,可以考虑用链表来存储,所以,在成员变量中添加list类型的成员变量:
list ls; //存储商品容器
int num; //用来记录商品个数
项目中需要读写的文件有两种,用户信息配置文件和商品信息文件。具体API接口如下:
//读取登陆信息
void ReadLogin(CString &name, CString &pwd);
//修改密码
void WritePwd(char* name, char* pwd);
// 读取商品数据
void ReadDocline();
//商品写入文件
void WirteDocline();
//添加新商品
void Addline(CString name, int num, int price);

|3、登录对话框
3.1 ui设计
3.1.1添加对话框资源(ID修改为DIALOG_LOGIN),添加所需控件:

3.1.2选中对话框→右击→添加类→类名:CLoginDlg

3.1.3根据需求,控件关联所需变量
用户名编辑区关联CString m_user,密码编辑区关联CString m_pwd

3.2功能实现
3.2.1在对话框类中,重写OnInitDialog函数,进行初始化,设置一些默认登录信息。
BOOL CloginDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

// TODO:  在此添加额外的初始化

//默认的登录信息
CInfoFile file;
CString name, pwd;
file.ReadLogin(name, pwd);

m_user = name;
m_pwd = pwd;
//同步到控件中
UpdateData(FALSE);

return TRUE;  // return TRUE unless you set the focus to a control
// 异常:  OCX 属性页应返回 FALSE

}

3.2.2登录窗口的创建
在应用程序类CSaleSystemApp的InitInstance()里面的APP创建之前创建登录对话框:
BOOL CSaleSystemApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。 否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

//创建登录窗口,并以模态方式创建
CloginDlg dlg;
dlg.DoModal();

CWinApp::InitInstance();

3.2.3登录按钮功能实现
//登录按钮处理函数
void CloginDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//登录按钮点击事件
UpdateData(TRUE);//更新控件数据到对应变量

if (m_user.IsEmpty()||m_pwd.IsEmpty())
{
	MessageBox(TEXT("输入内容不能为空"));
	return;
}

//获取正确的值
CInfoFile file;
CString name, pwd;
file.ReadLogin(name,pwd);

if (name == m_user) //用户名一致
{
	if (pwd == m_pwd) //密码一致
	{
		//关闭当前对话框
		CDialog::OnCancel();
	}
	else
	{
		MessageBox(TEXT("密码有误"));
	}
}
else
{
	MessageBox(TEXT("用户名有误"));
}

}

3.2.4取消按钮功能实现
//取消按钮功能实现
void CloginDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//关闭当前对话框
//CDialogEx::OnClose();
exit(0);

}

3.2.5右上角关闭按钮功能实现
选中对话框模板→右击→属性→消息→WM_CLOSE
void CloginDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//关闭当前对话框
//CDialogEx::OnClose();
exit(0); //结束整个程序

}

3.2.6编辑区回车键关闭对话框问题解决
CloginDlg类→属性→重写→OnOK
void CloginDlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类

//CDialogEx::OnOK();

}

4、静态拆分窗口
4.1自定义MFC视图类
自定义两个类:CSelectView和CDisplayView(它的基类必须是视图类)。
CSelectView继承于CTreeView,CDisplayView继承于CFromView。
项目右击→添加→类→MFC类→添加→取类名,设置基类→完成

4.2通过CSplitterWnd类拆分窗口
4.2.1CMainFrame类中,声明CSplitterWnd类型的对象:
private:
CSplitterWnd m_spliter; //切分窗口类对象
4.2.2重写框架类CMainFrame的OnCreateClient函数。
把OnCreateClient()函数的返回值改为return TRUE;
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类

//return CFrameWnd::OnCreateClient(lpcs, pContext);
return TRUE;

}

静态拆分实现代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类

//return CFrameWnd::OnCreateClient(lpcs, pContext);

//静态拆分窗口,1行2列,CSplitterWnd::CreateStatic
m_spliter.CreateStatic(this, 1, 2);
//创建视图,CSplitterWnd::CreateView
//0,0:放在第0行第0列的位置
//RUNTIME_CLASS(CSelectView)   :需要头文件 #include "SelectView.h",CSelectView在SelectView.h声明
//CSize(250,500) 指定视图宽度和高度
//pContext 为OnCreateClient()最后一个形参
m_spliter.CreateView(0, 0, RUNTIME_CLASS(CSelectView), CSize(200, 500), pContext);

//0,1:放在第0行第1位置
//RUNTIME_CLASS(CDisplayView)   :需要头文件 #include "DisplayView.h",CDisplayView在DisplayView.h声明
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CDisplayView), CSize(600, 500), pContext);

return TRUE; //自己拆分 

}

5、树视图功能实现
5.1添加功能节点
5.1.1加载图标资源
打开 资源视图→右击ICON→添加资源→选择Icon→导入 re.ico
图标资源ID改为:IDI_ICON_RE
5.1.2 CSelectView类中声明相应变量:
private:
CTreeCtrl *m_treeCtrl; //树控件
CImageList m_imageList; //图标列表
5.1.3重写CSelectView的OnInitUpdate函数
void CSelectView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类

}
5.1.4在CSelectView的OnInitUpdate函数中,完成初始化功能
void CSelectView::OnInitialUpdate()
{
CTreeView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类

//图标资源的加载CWinApp::Loadicon
//IDI_ICON_RE为图标资源ID
HICON icon = AfxGetApp()->LoadIconW(IDI_ICON_RE);

//图片列表的创建CImageList::Create
//30,30 指定图标的宽度和高度
//ILC_COLOR32 图标格式
//1,1 有多少图标就写多少
m_imageList.Create(30, 30, ILC_COLOR32, 1, 1);
//图片列表追加图标 CImageList::ADD
m_imageList.Add(icon);
//获取树视图中的树控件 CTreeView::GetTreeCtrl
m_treeCtrl = &GetTreeCtrl();
//树控件设置图片列表 CTreeCtrl;;SetImageList
m_treeCtrl->SetImageList(&m_imageList, TVSIL_NORMAL);
//树控件设置节点 CTreeCtrl::SetImageList
m_treeCtrl->InsertItem(TEXT("个人信息"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("销售管理"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("库存信息"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("库存添加"), 0, 0, NULL);
m_treeCtrl->InsertItem(TEXT("库存删除"), 0, 0, NULL);

}

5.2功能节点相应消息处理
CSelectView类右击→属性→消息→=TVN_SELCHANGED重写
void CSelectView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

//获取当前选中项
HTREEITEM item = m_treeCtrl->GetSelectedItem();
//通过选中的项 获取这个项中的内容
CString str = m_treeCtrl->GetItemText(item);

//MessageBox(str);

if (str==TEXT("个人信息"))
{
}
else if (str == TEXT("销售管理"))
{
}
else if (str == TEXT("库存信息"))
{
}
else if (str == TEXT("库存增加"))
{
}
else if (str == TEXT("库存删除"))
{
}

}

6、个人信息管理窗口
6.1 UI设计
6.1.1添加对话框资源(ID修改为DIALOG_USER),添加所需控件。
资源视图→右击Dialog→插入Dialog→改ID为IDD_DIALOG_USER
在窗口属性中,Border改为None,Style改为Child
身份编辑区属性readonly为TRUE,用户名编辑框readonly为TRUE,
新密码编辑框属性passpwd为TRUE,确定密码编辑框passpwd为TRUE。

6.1.2选中对话框→右击→添加类→类名:CUserDlg,基类选择CFormView

6.1.3根据需求,控件关联所需变量
身份编辑区关联CString m_user,用户名编辑框关联CString m_name,
新密码编辑框关联CString m_newPwd,确定密码编辑框关联CString m_surePwd

6.2功能实现
6.2.1在对话框中,重写OnInitUpdate函数,进行初始化。
void CUserDlg::OnInitialUpdate()
{
CFormView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类

CInfoFile file; //需要头文件 Infofile.h
CString name, pwd;
file.ReadLogin(name, pwd); //读取文件的用户名和密码
//初始化个人信息
m_user = TEXT("销售员"); //身份
m_name = name; //用户名

UpdateData(FALSE); //把数据更新到控件上

}
6.2.2确定修改密码按钮功能实现
void CUserDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE); //更新控件内容到对应的变量中

if (m_newPwd.IsEmpty()||m_surePwd.IsEmpty())
{
	MessageBox(TEXT("输入密码不能为空"));
	return;
}

if (m_newPwd!=m_surePwd)
{
	MessageBox(TEXT("输入密码和确定密码不一致"));
	return;
}

CInfoFile file; //需要头文件 InfoFile.h
CString name, pwd;
file.ReadLogin(name, pwd); //读取文件的用户名和密码

if (m_surePwd==pwd)
{
	MessageBox(TEXT("输入密码和旧密码相等"));
	return;
}

//把用户名和密码的CString类型改为char *
char *tmpName, *tmpPwd;
//用户名
CStringA tmp1;
tmp1 = name;
tmpName = tmp1.GetBuffer();
//密码
CStringA tmp2;
tmp2 = m_newPwd;
tmpPwd = tmp2.GetBuffer();

file.WritePwd(tmpName, tmpPwd); //修改密码

MessageBox(TEXT("密码修改成功"));

//输入框内容清空
m_surePwd.Empty();
m_newPwd.Empty();
UpdateData(FALSE); //把数据更新到控件上

}

6.2.3取消按钮功能实现
void CUserDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码

//输入框内容清空
m_surePwd.Empty();
m_newPwd.Empty();
UpdateData(FALSE); //把数据更新到控件上

}

7、界面挂载
7.1自定义信息发送
7.1.1在CMainFrame框架类中,MainFrm.h中添加自定义消息宏:

//VM_USER是用户自定义消息的一个起始值
//VM_USER+100是为了区分系统消息和用户消息,避免冲突
#define NM_A (WM_USER+100)
#define NM_B (WM_USER+101)
#define NM_C (WM_USER+102)
#define NM_D (WM_USER+103)
#define NM_E (WM_USER+104)

7.1.2在CMainFrame框架类中添加自定义消息处理函数(MainFrm.h中):
afx_msg LRESULT OnMyChange(WPARAM wParam,LPARAM lParam);

7.1.3对应的.cpp定义其实现函数
LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{

}

7.1.4在CMainFrame框架类BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加自定义消息入口,与自定义消息处理函数绑定(.CPP中)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
ON_WM_CREATE()

//ON_MESSAGE响应的是自定义消息
//产生NM_X消息,自动调用OnMyChange函数
ON_MESSAGE(NM_A,OnMyChange)
ON_MESSAGE(NM_B, OnMyChange)
ON_MESSAGE(NM_C, OnMyChange)
ON_MESSAGE(NM_D, OnMyChange)
ON_MESSAGE(NM_E, OnMyChange)

END_MESSAGE_MAP()

7.1.5发送自定义信号
在CSelectView的OnTvnSelchanged函数中,发送自定义信号
void CSelectView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;

//获取当前选中项
HTREEITEM item = m_treeCtrl->GetSelectedItem();
//通过选中的项 获取这个项中的内容
CString str = m_treeCtrl->GetItemText(item);

//MessageBox(str);

if (str==TEXT("个人信息"))
{
	//需要包含框架类头文件MainFrm.h
	//CWnd::PostMessage这个函数将一个消息放入窗口的消息队列,然后直接返回,并不等待对应的窗 口处理消息(不是用这个函数,而是原生API)
	//AfxGetMainWnd() 框架窗口对象的指针
	//AfxGetMainWnd()->GetSafeHwnd() 获取返回窗口的句柄,CWnd::GetSafeHwnd
	//NM_A 发送自定义消息
	//(WPARAM)NM_A 指定了附加的消息信息
	//(LPAPAM)0 指定了附加的消息信息,此参数这里没有意义
	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0); //双冒号代表的是作用域,若加上双冒号指全局作用域。
}
else if (str == TEXT("销售管理"))
{
	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_B, (WPARAM)NM_B, (LPARAM)0);
}
else if (str == TEXT("库存信息"))
{
	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_C, (WPARAM)NM_C, (LPARAM)0);
}
else if (str == TEXT("库存增加"))
{
	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_D, (WPARAM)NM_D, (LPARAM)0);
}
else if (str == TEXT("库存删除"))
{
	::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_E, (WPARAM)NM_E, (LPARAM)0);
}

}

7.2自定义信息处理
在CMainFrame框架类OnMyChange函数中处理相应消息
LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{

switch (wParam)
{
case NM_A:
	MessageBox(TEXT("NM_A"));
	break;
case NM_B:
	MessageBox(TEXT("NM_B"));
	break;
case NM_C:
	MessageBox(TEXT("NM_C"));
	break;
case NM_D:
	MessageBox(TEXT("NM_D"));
	break;
case NM_E:
	MessageBox(TEXT("NM_E"));
	break;
default:
	MessageBox(TEXT("error"));
}
return 0;

}
7.3界面挂载
如果是NM_A信号,则挂载CUserDlg窗口,后面界面的挂载以此类推。
CCreateContext Context;
switch (wParam)
{
case NM_A:
//MessageBox(TEXT(“NM_A”));
{
//CUserDlg类需要加入头文件 UserDlg.h
Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg);
Context.m_pCurrentFrame = this;
Context.m_pLastView = (CFormView*)m_spliter.GetPane(0, 1);
m_spliter.DeleteView(0, 1);
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 0), &Context);
CUserDlg pNewview = (CUserDlg)m_spliter.GetPane(0, 1);
m_spliter.RecalcLayout();
pNewview->OnInitialUpdate();
m_spliter.SetActivePane(0, 1);
}

	break;
case NM_B:

8、销售管理窗口
8.1 UI设计
8.1.1添加对话框资源(ID修改为DIALOG_SELL),添加所需控件。
资源视图→右击Dialog→插入Dialog→改ID为IDD_DIALOG_SELL
在窗口属性中,Border改为None,Style改为Child
商品名组合框关联CComboBox属性type为drop list,单价编辑框属性readonly改为true,库存编辑框属性readonly改为true,订单信息编辑框属性readonly改为true,multiline改为true,want return改为true,horizonal scroll改为true,vertical scroll改为true。

8.1.2选中对话框→右击→添加类→类名:CSellDlg,基类选择CFormView

8.1.3根据需求,控件关联所需变量
商品名组合框关联CComboBox m_combo,单价编辑框关联int m_price,
个数编辑框关联int m_num,销售信息编辑框关联CString m_sellInfo

8.2界面挂载
在CMainFrame类中OnMyChange函数,添加如下代码:
case NM_B:
//MessageBox(TEXT(“NM_B”));
{
//CSellDlg类需要加入头文件 SellDlg.h
Context.m_pNewViewClass = RUNTIME_CLASS(CSellDlg);
Context.m_pCurrentFrame = this;
Context.m_pLastView = (CFormView*)m_spliter.GetPane(0, 1);
m_spliter.DeleteView(0, 1);
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CSellDlg), CSize(600, 500), &Context);
CSellDlg pNewview = (CSellDlg)m_spliter.GetPane(0, 1);
m_spliter.RecalcLayout();
pNewview->OnInitialUpdate();
m_spliter.SetActivePane(0, 1);
}
break;
case NM_C:

8.3功能实现
8.3.1在对话框类中,重写OnInitDialog函数,进行初始化
void CSellDlg::OnInitialUpdate()
{
CFormView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类

//初始化消息订单窗口
//初始化下拉框
CInfoFile file; //引入头文件 InfoFile.h
file.ReadDocline(); //把商品读到file对象中
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
{
	//遍历商品容器 把容器名称放到下拉框中
	//it->name 是string 类型,AddString(CString)   需要sting转char*再转CString
	m_combo.AddString(CString(it->name.c_str()));
}
//默认选择中第一个商品
m_combo.SetCurSel(0);
//更新第一个商品里的数据
OnCbnSelchangeCombo1();

}

8.3.2处理组合框所需控件事件
void CSellDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
//切换商品 触发事件

//先获取到商品的名称
int index = m_combo.GetCurSel();
//根据索引获取到具体内容
CString name;
m_combo.GetLBText(index, name);
//根据商品的名称 获取到该商品的价格和库存 并且显示到控件中
CInfoFile file; //引入头文件 InfoFile.h
file.ReadDocline(); //把商品读到file对象中
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
{
	if (CString(it->name.c_str())==name)
	{
		m_price = it->price;
		m_left = it->num;
	}
}
//同步到控件上
UpdateData(FALSE);
//清空list的内容
file.ls.clear();

}

8.3.3购买按钮功能实现
void CSellDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码

UpdateData(TRUE);
//购买的功能实现
if (m_num<=0)
{
	MessageBox(TEXT("购买数量要大于0"));
	return;
}
//购买的数量 不能大于库存
if (m_num>m_left)
{
	MessageBox(TEXT("购买数量不能大于库存量"));
	return;
}

//购买
//获取到具体要买的商品名称
int index = m_combo.GetCurSel();
CString name;
m_combo.GetLBText(index, name);

CInfoFile file; //引入头文件 InfoFile.h
file.ReadDocline(); //把商品读到file对象中
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
{
	if (CString(it->name.c_str()) == name)
	{
		//同步库存量
		it->num -= m_num;
		m_left = it->num; //控件上的库存量
		//告诉用户具体购买信息
		CString str;
		str.Format(TEXT("商品: %s \r\n单价: %d \r\n个数: %d \r\n总价: %d"),name,m_price,m_num,m_price*m_num);
		m_sellInfo = str;
		UpdateData(FALSE);
		MessageBox(TEXT("购买成功"));
	}
}
//把最新的数据写到文件中
file.WirteDocline();
//清空数据
m_num = 0;
m_sellInfo.Empty();
UpdateData(FALSE);

}

8.3.4取消按钮功能实现
void CSellDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//取消按钮
m_num = 0;
UpdateData(FALSE);
//默认选中第一个
m_combo.SetCurSel(0);
//更新第一个商品里的数据
OnCbnSelchangeCombo1();

}

9、库存信息窗口
9.1 UI设计
9.1.1添加对话框资源(ID修改为DIALOG_INFO),添加所需控件
资源视图→右击Dialog→插入Dialog→改ID为IDD_DIALOG_INFO
在窗口属性中,Border改为None,Style改为Child
库存信息 listctrl属性view改为report(报表模式)

9.1.2选中对话框→右击→添加类→类名:CInfoDlg,基类选择CFormView

9.1.3根据需求,控件关联所需变量
列表控件关联CListCtrl m_list

9.2界面挂载
在CMainFrame类中OnMyChange函数,添加如下代码:
case NM_C:
//MessageBox(TEXT(“NM_C”));
{
//CInfoDlg类需要加入头文件 InfoDlg.h
Context.m_pNewViewClass = RUNTIME_CLASS(CInfoDlg);
Context.m_pCurrentFrame = this;
Context.m_pLastView = (CFormView*)m_spliter.GetPane(0, 1);
m_spliter.DeleteView(0, 1);
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CInfoDlg), CSize(600, 500), &Context);
CInfoDlg pNewview = (CInfoDlg)m_spliter.GetPane(0, 1);
m_spliter.RecalcLayout();
pNewview->OnInitialUpdate();
m_spliter.SetActivePane(0, 1);
}
break;
case NM_D:

9.3功能实现
9.3.1在对话框类中,重写OnInitDialog函数,进行初始化
void CInfoDlg::OnInitialUpdate()
{
CFormView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类
//设置扩展风格
//LVS_EX_FULLROWSELECT选中整行,LVS_EX_GRIDLINES网格
m_list.SetExtendedStyle(m_list.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

//初始化表头
CString field[] = { TEXT("商品ID"), TEXT("商品名称"), TEXT("商品价格"), TEXT("库存数量")};
for (int i = 0;i<sizeof(field)/sizeof(field[0]);i++)
{
	m_list.InsertColumn(i, field[i], LVCFMT_CENTER, 90);
}
//需要加入头文件 InfoFiel.h
CInfoFile file;
file.ReadDocline(); //读取商品信息

//添加数据
int i = 0;
CString str;
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end();it++)
{
	str.Format(TEXT("%d"), it->id);
	m_list.InsertItem(i, str);
	int column = 1;
	m_list.SetItemText(i, column++, (CString)it->name.c_str());
	str.Format(TEXT("%d"), it->price);
	m_list.SetItemText(i, column++, str);
	str.Format(TEXT("%d"), it->num);
	m_list.SetItemText(i, column++, str);
	i++;
}

}

10、库存添加窗口
10.1 UI设计
10.1.1添加对话框资源(ID修改为DIALOG_ADD),添加所需控件
资源视图→右击Dialog→插入Dialog→改ID为IDD_DIALOG_ADD
在窗口属性中,Border改为None,Style改为Child
添加个数:
商品组合框属性type改为drop list,单价编辑框属性readonly改为true

9.1.2选中对话框→右击→添加类→类名:CAddDlg,基类选择CFormView

9.1.3根据需求,控件关联所需变量
添加个数:
商品组合框关联CComboBox m_combo,单价编辑框关联int m_price1,个数编辑框关联int m_num1

添加新产品:
商品组合框关联CString m_name2,单价编辑框关联int m_price2,个数编辑框关联int m_num2

10.2界面挂载
在CMainFrame类中OnMyChange函数,添加如下代码:
case NM_D:
//MessageBox(TEXT(“NM_D”));
{
//CAddDlg类需要加入头文件 AddDlg.h
Context.m_pNewViewClass = RUNTIME_CLASS(CAddDlg);
Context.m_pCurrentFrame = this;
Context.m_pLastView = (CFormView*)m_spliter.GetPane(0, 1);
m_spliter.DeleteView(0, 1);
m_spliter.CreateView(0, 1, RUNTIME_CLASS(CAddDlg), CSize(600, 500), &Context);
CAddDlg pNewview = (CAddDlg)m_spliter.GetPane(0, 1);
m_spliter.RecalcLayout();
pNewview->OnInitialUpdate();
m_spliter.SetActivePane(0, 1);
}
break;
case NM_E:

10.3功能实现
10.3.1在对话框类中,重写OnInitDialog函数,进行商品信息初始化:
void CAddDlg::OnInitialUpdate()
{
CFormView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类

//初始化消息订单窗口
//初始化下拉框
CInfoFile file; //引入头文件 InfoFile.h
file.ReadDocline(); //把商品读到file对象中
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
{
	//遍历商品容器 把容器名称放到下拉框中
	//it->name 是string 类型,AddString(CString)   需要sting转char*再转CString
	m_combo.AddString(CString(it->name.c_str()));
}
//默认选择中第一个商品
m_combo.SetCurSel(0);
//更新第一个商品里的数据
OnCbnSelchangeCombo1();

}

10.3.2处理组合框所需控件事件
void CAddDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码

//切换商品 触发事件

//先获取到商品的名称
int index = m_combo.GetCurSel();
//根据索引获取到具体内容
CString name;
m_combo.GetLBText(index, name);
//根据商品的名称 获取到该商品的价格和库存 并且显示到控件中
CInfoFile file; //引入头文件 InfoFile.h
file.ReadDocline(); //把商品读到file对象中
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
{
	if (CString(it->name.c_str()) == name)
	{
		m_price1 = it->price;
		
	}
}
//同步到控件上
UpdateData(FALSE);

//清空list的内容
file.ls.clear();

}

10.3.3添加个数 添加按钮实现
void CAddDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码

//添加商品的按钮功能实现
//拿到最新数据
UpdateData(TRUE);

if (m_num1<=0)
{
	MessageBox(TEXT("添加的数量要大于0"));
	return;
}

//获取到你要添加的商品名称
int index = m_combo.GetCurSel();
CString name;
m_combo.GetLBText(index, name);
CInfoFile file; //引入头文件 InfoFile.h
file.ReadDocline(); //把商品读到file对象中
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end(); it++)
{
	if (CString(it->name.c_str()) == name)
	{
		//添加库存
		it->num += m_num1;
		m_num1 = 0;
		UpdateData(FALSE);
		MessageBox(TEXT("添加成功"));
	}
}
//把商品同步到文件
file.WirteDocline();

}

10.3.4添加个数 取消按钮实现
void CAddDlg::OnBnClickedButton6()
{
// TODO: 在此添加控件通知处理程序代码

m_num1 = 0;
UpdateData(FALSE);
m_combo.SetCurSel(0);
OnCbnSelchangeCombo1();

}

10.3.5添加商品 添加按钮实现
void CAddDlg::OnBnClickedButton5()
{
// TODO: 在此添加控件通知处理程序代码
//添加新商品
//验证数据的有效性
UpdateData(TRUE);//拿到最新数据
if (m_name2.IsEmpty()||m_num2<=0||m_price2<=0)
{
MessageBox(TEXT(“输入信息有误”));
return;
}

CInfoFile file;
file.ReadDocline();

file.Addline(m_name2, m_num2, m_price2);
file.WirteDocline();
MessageBox(TEXT("新商品添加成功"));

//同步到左侧下拉框中
m_combo.InsertString(0, m_name2);
m_combo.SetCurSel(0);
//更新第一个商品里的数据
OnCbnSelchangeCombo1();

//清空添加的数据
m_name2.Empty();
m_num2 = 0;
m_price2 = 0;
UpdateData(FALSE);

}

10.3.6添加商品 取消按钮实现
void CAddDlg::OnBnClickedButton7()
{
// TODO: 在此添加控件通知处理程序代码

//取消添加新商品
//清空添加的数据
m_name2.Empty();
m_num2 = 0;
m_price2 = 0;
UpdateData(FALSE);

}

11、库存删除窗口
11.1 UI设计
11.1.1添加对话框资源(ID修改为DIALOG_DEL),添加所需控件。
在窗口属性中,Border改为None,Style改为Child
商品组合框属性type改为drop list

11.1.2选中对话框→右击→添加类→类名:CDelDlg,基类选择CFormView

11.1.3根据需求,控件关联所需变量
商品名组合框关联CComboBox m_combo,单价编辑框关联int mprice,个数编辑框关联int m_num

11.2界面挂载
在CMainFrame类中OnMyChange函数,添加如下代码:

11.3功能实现
11.3.1在对话框类中,重写OnInitDialog函数,进行初始化
void CDelDlg::OnInitialUpdate()
{
CFormView::OnInitialUpdate();

// TODO:  在此添加专用代码和/或调用基类

//读取文件,获取商品名,给组合框添加字符串
//需要头文件 InfoFile.h
CInfoFile file;
file.ReadDocline(); //读取商品信息
for (list<msg>::iterator it = file.ls.begin(); it!= file.ls.end();it++)
{
	m_combo.AddString((CString)it->name.c_str());
}

//将第一个商品名设为默认选中项
m_combo.SetCurSel(0);

}

11.3.2处理组合框所需控制事件
void CDelDlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码

CString text;
//获取当前选中项
int index = m_combo.GetCurSel();
//获取当前内容
m_combo.GetLBText(index, text);

//需要头文件 InfoFile.h
CInfoFile file;
file.ReadDocline(); //读取商品信息
for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end();it++)
{
	if (text==it->name.c_str())
	{
		m_price = it->price;
		m_num = 0;
		UpdateData(FALSE); //内容更新到对应的控件
	}
}

}

11.3.3确定按钮功能实现
void CDelDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码

//获取控件上的内容,更新到对应关联的变量中
UpdateData(TRUE);

if (m_num==0)
{
	MessageBox(TEXT("个数不能为0");
	return;
}

CString type;
//获取当前选中项
int index = m_combo.GetCurSel();
//获取组合框当前内容
m_combo.GetLBText(index, type);

CString str;
str.Format(TEXT("删除商品: %s \r\n单价: %d\r\n个数: %d"), type, m_price, m_num);
MessageBox(str);

//需要头文件 
CInfoFile file;
file.ReadDocline(); //读取商品信息

for (list<msg>::iterator it = file.ls.begin(); it != file.ls.end();it++)
{
	if (type==it->name.c_str())
	{
		it->num -= m_num;
	}
}
file.WirteDocline(); //更新文件内容

m_num = 0;
UpdateData(FALSE); //更新到对应控件

}

11.3.4取消按钮功能实现
void CDelDlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码

m_combo.SetCurSel(0); //选择第0项目
m_num = 0;
OnCbnSelchangeCombo1();

}

12菜单栏
12.1切换到资源视图的Menu,点击IDR_MAINFRAME,删除掉所有默认(帮助除外)
添加“开始”,“开始” 下面添加 “退出”
添加“菜单”,“开始” 下面添加 “个人信息”,“销售管理”,“库存信息”,“库存添加”,“库存删除”,

12.2实现功能
12.2.1退出功能实现
右击退出→添加事件处理程序→消息类型为COMMAD,类列表为CMainFrame→添加编辑
void CMainFrame::On32771()
{
// TODO: 在此添加命令处理程序代码
//退出按钮
exit(0);
}

12.2.2个人信息功能实现
右击个人信息→添加事件处理程序→消息类型为COMMAD,类列表为CMainFrame→添加编辑
void CMainFrame::On32772()
{
// TODO: 在此添加命令处理程序代码
//个人信息
//OnMyChange((WPARAM)NM_A, (LPARAM)0);
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);
}

12.2.3其他功能依次类推


本文链接: http://www.dtmao.cc/news_show_600332.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?