0
点赞
收藏
分享

微信扫一扫

MFC---SaleSystem项目(中)


4 静态拆分窗口

4.1 自定义MFC视图类

自定义两个类:CSelectView和CDispalyView(它的基类必须是视图类)。

CSelectView继承于CTreeView,CDispalyView继承于CFormView。

MFC---SaleSystem项目(中)_控件

MFC---SaleSystem项目(中)_控件_02

MFC---SaleSystem项目(中)_c++_03

MFC---SaleSystem项目(中)_#include_04

MFC---SaleSystem项目(中)_自定义_05

4.2 通过CSplitterWnd类拆分窗口

1)CMainFrame类中,声明CSplitterWnd类型的对象:

MFC---SaleSystem项目(中)_c++_06

private:
	CSplitterWnd m_spliter; // 切分窗口类对象

2)重写框架类CMainFrame的OnCreateClient函数

MFC---SaleSystem项目(中)_控件_07

把OnCreateClient()函数的返回值改为Return TRUE:

MFC---SaleSystem项目(中)_自定义_08

静态拆分实现代码如下:

MFC---SaleSystem项目(中)_c++_09

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO:  在此添加专用代码和/或调用基类

	// 静态拆分窗口,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列的位置
	//CDispalyView,需要头文件#include "DispalyView.h"
	m_spliter.CreateView(0, 1, RUNTIME_CLASS(CDispalyView), CSize(600, 500), pContext);

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

程序运行效果图如下:

MFC---SaleSystem项目(中)_自定义_10

##5 树视图功能实现

5.1 添加功能节点

1)加载图标资源

MFC---SaleSystem项目(中)_自定义_11


MFC---SaleSystem项目(中)_c++_12

图标资源ID改为:IDI_ICON_RE

MFC---SaleSystem项目(中)_#include_13

2)CSelectView类中声明相应变量:

MFC---SaleSystem项目(中)_mfc_14

CTreeCtrl *m_treeCtrl;	//树控件
CImageList m_imageList;	//图标列表

3)重写CSelectView的OnInitUpdate函数

MFC---SaleSystem项目(中)_控件_15

void CSelectView::OnInitialUpdate()
{
	CTreeView::OnInitialUpdate();

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

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::InsertItem
	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);
}

程序运行效果图如下:

MFC---SaleSystem项目(中)_mfc_16

5.2 功能节点相应消息处理

MFC---SaleSystem项目(中)_c++_17

void CSelectView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO:  在此添加控件通知处理程序代码
	*pResult = 0;
}

在上面函数,实现获取当前节点选中内容:

void CSelectView::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
	// TODO:  在此添加控件通知处理程序代码
	*pResult = 0;

	//获取当前节点选中项目 CTreeCtrl::GetSelectedItem
	HTREEITEM item = m_treeCtrl->GetSelectedItem();

	//获取选中项的文本内容 CTreeCtrl::GetItemText
	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设计

1)添加对话框资源(ID修改为DIALOG_USER),添加所需控件:

MFC---SaleSystem项目(中)_c++_18

在窗口属性中,Border改为None,Style改为Child:

MFC---SaleSystem项目(中)_自定义_19


MFC---SaleSystem项目(中)_mfc_20

2)选中对话框 -> 右击 -> 添加类 -> 类名:CUserDlg,基类选择CFormView

MFC---SaleSystem项目(中)_控件_21

3)根据需求,控件关联所需变量

身份编辑区关联CString m_user,用户名编辑框关联CString m_name,

新密码编辑框关联CString m_newPwd,确定密码编辑框关联CString m_surePwd。

MFC---SaleSystem项目(中)_mfc_22

6.2 功能实现

1)在对话框类中,重写 OnInitDialog 函数,进行初始化。

MFC---SaleSystem项目(中)_mfc_23

void CUserDlg::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

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

void CUserDlg::OnInitialUpdate()
{
	CFormView::OnInitialUpdate();

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

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

	//初始化个人信息
	m_user = TEXT("销售员");	//身份
	m_name = name;	//用户名

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

2)确定修改密码按钮功能实现

void CUserDlg::OnBnClickedButton1()
{
	// TODO:  在此添加控件通知处理程序代码

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

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

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

	CInfoFile file;	//需要头文件#include "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_surePwd;
	tmpPwd = tmp2.GetBuffer();

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

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

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

3)取消按钮功能实现

void CUserDlg::OnBnClickedButton3()
{
	// TODO:  在此添加控件通知处理程序代码

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

7 界面挂载

7.1 自定义信息发送

1)在CMainFrame 框架类中,添加自定义消息宏

MFC---SaleSystem项目(中)_#include_24

//WM_USER 是用户自定义消息的一个起始值
//WM_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)

2)在CMainFrame框架类中添加自定义消息处理函数:

MFC---SaleSystem项目(中)_#include_25

//自定义消息处理函数
afx_msg LRESULT OnMyChange(WPARAM wParam, LPARAM lParam);

3)对应的.cpp定义其函数

LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam)
{

}

4)在CMainFrame框架类BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加自定义消息入口,与自定义消息处理函数绑定。

MFC---SaleSystem项目(中)_控件_26

//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)

5)发送自定义信号

在CSelectView的OnTvnSelchanged函数中,发送自定义信号:

MFC---SaleSystem项目(中)_#include_27

if (str == TEXT("个人信息"))
{
	//需要包含框架类头文件#include "MainFrm.h" 
	//CWnd::PostMessage 将一个消息放入窗口的消息队列
	//AfxGetMainWnd():框架窗口对象的指针
	//AfxGetMainWnd()->GetSafeHwnd():获取返回窗口的句柄,CWnd::GetSafeHwnd
	//NM_A:发送自定义消息
	//(WPARAM)NM_A:指定了附加的消息信息
	//(LPARAM)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(_T("NM_A"));
		break;
	case NM_B:
		MessageBox(_T("NM_B"));
		break;
	case NM_C:
		MessageBox(_T("NM_C"));
		break;
	case NM_D:
		MessageBox(_T("NM_D"));
		break;
	case NM_E:
		MessageBox(_T("NM_E"));
		break;
	default:
		MessageBox(_T("error"));
	}
	return 0;
}

7.3 界面挂载

如果是NM_A信号,则挂载CUserDlg窗口,后面界面的挂载以此类推。

MFC---SaleSystem项目(中)_控件_28

CCreateContext   Context;
switch (wParam)
{
case NM_A:
{
	//CUserDlg类需要包含头文件#include "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,500), &Context);
	CUserDlg *pNewView = (CUserDlg *)m_spliter.GetPane(0, 1);
	m_spliter.RecalcLayout();
	pNewView->OnInitialUpdate();
	m_spliter.SetActivePane(0, 1);
}
	break;
case NM_B:
//……………

程序运行效果如下:

MFC---SaleSystem项目(中)_控件_29


举报

相关推荐

0 条评论