20 MFC - 案例总结(中)

简介: 20 MFC - 案例总结(中)

6 个人信息管理窗口

6.1 ui设计

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

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

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

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

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

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

6.2 功能实现

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

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 框架类中,添加自定义消息宏

//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框架类中添加自定义消息处理函数:

//自定义消息处理函数
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之间添加自定义消息入口,与自定义消息处理函数绑定。

//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函数中,发送自定义信号:

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窗口,后面界面的挂载以此类推。

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:
//……………

程序运行效果如下:

8 销售管理窗口

8.1 ui设计

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

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

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

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

商品名组合框关联CComboBox m_combo,单价编辑框关联int m_price,

个数编辑框关联int m_num,销售信息编辑框关联CString m_sellInfo。

8.2 界面挂载

在CMainFrame类中OnMyChange函数,添加如下代码:

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

程序运行效果图:

8.3功能实现

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

void CSellDlg::OnInitialUpdate()
{
  CFormView::OnInitialUpdate();
  // TODO:  在此添加专用代码和/或调用基类
  //读取文件,获取商品名,给组合框添加字符串
  //需要包含#include "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());
  }
  file.ls.clear(); //清空list的内容
  //将第一个商品名设为默认选中项
  m_combo.SetCurSel(0);
}

2)处理组合框所需控制事件

void CSellDlg::OnCbnSelchangeCombo1()
{
  // TODO:  在此添加控件通知处理程序代码
  CString text;
  //获取当前选中项
  int index = m_combo.GetCurSel();
  //获取当前内容
  m_combo.GetLBText(index, text);
  //需要包含#include "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); //内容更新到对应的控件
    }
  }
  file.ls.clear(); //清空list的内容
}

3)购买按钮功能实现

void CSellDlg::OnBnClickedButton1()
{
  // 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(_T("商品:%s \r\n单价:%d \r\n个数:%d \r\n总价:%d"), type, m_price, m_num, m_price*m_num);
  m_sellInfo = str; //销售信息
  UpdateData(FALSE);
  MessageBox(str);
  //需要包含#include "InfoFile.h"
  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 = it->num - m_num;
    }
  }
  file.WirteDocline(); //更新文件内容
  file.ls.clear(); //清空list的内容
  m_sellInfo.Empty();
  m_num = 0;
  UpdateData(FALSE); //更新到对应的控件
}

4)取消按钮功能实现

void CSellDlg::OnBnClickedButton3()
{
  // TODO:  在此添加控件通知处理程序代码
  m_combo.SetCurSel(0); //选择第0项目
  m_sellInfo = "";
  m_num = 0;
  OnCbnSelchangeCombo1();
}


目录
相关文章
20 MFC - 案例总结(下)
20 MFC - 案例总结(下)
68 0
|
程序员 Windows
08 MFC - MFC框架中一些重要的函数
08 MFC - MFC框架中一些重要的函数
62 0
|
API 调度 开发工具
03 MFC - 入门程序
03 MFC - 入门程序
55 0
|
存储 API 区块链
20 MFC - 案例总结(上)
20 MFC - 案例总结
139 0
|
存储 程序员 编译器
MFC——简单示例演示及通过MFC向导创建MFC项目
MFC——简单示例演示及通过MFC向导创建MFC项目
387 0
MFC——简单示例演示及通过MFC向导创建MFC项目
|
消息中间件 设计模式 API
MFC——基础框架内容
MFC——基础框架内容
108 0
MFC——基础框架内容
|
网络协议 C# C++
VS2017编写MFC库以及使用Qt调用MFC库方法
VS2017编写MFC库以及使用Qt调用MFC库方法
VS2017编写MFC库以及使用Qt调用MFC库方法
|
存储 API 数据库
【MFC】MFC基础篇(1)
【MFC】MFC基础篇(1)
【MFC】MFC基础篇(1)
|
C++ Windows
MFC下DLL编程(图解)
MFC下DLL编程(图解) DLL(Dynamic Link Library,动态链接库)是微软公司为Windows和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。DLL是应用程序的一种扩展,也是软件共享和重用的传统方法。
1145 0