• MFC入门(三)


    1 新建项目

    1.1 根据向导创建项目

    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) 设置图标

    打开资源视图,添加本地ICO图标,在res文件夹中添加我们提前准备的图标资源:

    在资源的属性中修改ID(IDI_ICON_WIN)

     

    CMainFrame的 OnCreate()中添加如下代码:

     

    //设置图标,IDI_ICON_WIN为图标资源ID,此为WINAPI函数
    SetClassLong(m_hWnd, GCL_HICON, (LONG)AfxGetApp()->LoadIconW(IDI_ICON_WIN));

    2) 设置窗口大小和居中显示

    还是在CMainFrame的OnCreate()中接着写代码:

        //设置窗口的位置和大小:CWnd::MoveWindow
        //0, 0, 起点坐标x和y
        //800, 500, 窗口宽度和高度
        MoveWindow(0, 0, 800, 500);
    
        //将窗口移动到屏幕中央,CWnd::CenterWindow
        CenterWindow();

    3) 设置窗口标题

    在CSaleSystemDoc文档类中的OnNewDocument()函数中添加如下代码:

     

    //设置窗口标题,CDocument::SetTitle
        SetTitle(TEXT("销售管理系统"));

    设置标题 分左右侧标题Doc --OnNewDocument中设置右侧

                                         Frame中OnCreate中设置左侧

     

    程序运行效果图如下:

     

    文件处理

    2.1 文件内容格式

    登陆用户信息:

    商品信息:

     

    2.2 设计文件处理类CInfoFile

    1) 添加文件处理类CInfoFile

     

    登陆对话框

    3.1 ui设计

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

     

    2)选中对话框 -> 右击 -> 添加类 -> 类名:CLoginDlg

     

     

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

     

    用户名编辑区关联CString m_user,密码登陆框关联CString m_pwd。

    3.2 功能实现

    1)在对话框类中,重写 OnInitDialog 函数,进行初始化,设置一些默认登录信息。

        m_user = TEXT("斧头帮帮主");    //用户名
        m_pwd = TEXT("123456");//密码
        UpdateData(FALSE); //内容更新到对应的控件

    2)登陆窗口的创建

    在应用程序类CSaleSystemApp的InitInstance() 里面的APP 创建之前创建登陆对话框:

     

    CLoginDlg dlg;    //创建登陆对话框,需要头文件#include "LoginDlg.h"
    dlg.DoModal();    //以模态方式运行

    3)登陆按钮功能实现

    void CLoginDlg::OnBnClickedButton1()
    {
        // TODO:  在此添加控件通知处理程序代码
    
        UpdateData(TRUE); //更新控件的数据到对应的变量
    
        CInfoFile file; //创建操作文件类对象,需要头文件#include "InfoFile.h" 
        CString user, pwd;
    
        //读取配置文件,获取用户名密码,参数为引用传递
        file.ReadLogin(user, pwd);
    
        if (m_user == user)//用户名相等
        {
            if (m_pwd != pwd)
            {
                MessageBox(_T("密码错误"));
                m_user.Empty(); //清空
                m_pwd.Empty();
            }
            else
            {
                CDialogEx::OnOK();
            }
        }
        else
        {
            MessageBox(_T("用户名不存在"));
            m_user.Empty();
            m_pwd.Empty();
        }
    }

    4)取消按钮功能实现

    //取消按钮功能实现
    void CLoginDlg::OnBnClickedButton2()
    {
        // TODO:  在此添加控件通知处理程序代码
        exit(0);    //结束整个程序
    }

    5)右上角关闭按钮功能实现

    选中对话框模板 -> 右击 -> 属性 -> 消息 -> WM_CLOSE

     

    //关闭按钮
    void CLoginDlg::OnClose()
    {
        // TODO:  在此添加消息处理程序代码和/或调用默认值
        exit(0);    //结束整个程序
    
        CDialogEx::OnClose();
    }

    6)编辑区回车键关闭对话框问题解决

     

    void CLoginDlg::OnOK()
    {
        // TODO: 在此添加专用代码和/或调用基类
    
        //CDialogEx::OnOK();
    }

    静态拆分窗口

    4.1 自定义MFC视图类

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

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

     

    4.2 通过CSplitterWnd类拆分窗口

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

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

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

     

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

     

    静态拆分实现代码如下:

     

    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;
    }

    程序运行效果图如下:

     

    5 树视图功能实现

    5.1 添加功能节点

    1)加载图标资源

    图标资源ID改为:IDI_ICON_RE

     

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

     

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

    3)重写CSelectView的OnInitUpdate函数

     

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

    程序运行效果图如下:

     

    5.2 功能节点相应消息处理

     

    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.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); //把数据更新到控件上
    }

    界面挂载

    1. 声明自定义的消息

    2. 自定义消息,写到分界宏

    3. 声明OnMyChange方法

    4. SelectView中发送自定义消息::postMessage

    5. 根据不同的参数不同界面的挂载

    6. 界面具体挂载

    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.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 
    单价:%d 
    个数:%d 
    总价:%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();
    }

    9 库存信息窗口

    9.1 ui设计

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

     

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

     View 属性为 Report(报表表模式):

     

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

     

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

    列表控件关联CListCtrl m_list:

     

    9.2 界面挂载

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

     

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

    程序运行效果图:

     

     

    9.3功能实现

    在对话框类中,重写 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[] = { _T("商品ID"), _T("商品名称"), _T("商品价格"), _T("库存数量") };
        for (int i = 0; i < sizeof(field) / sizeof(field[0]); ++i)
        {
            m_list.InsertColumn(i, field[i], LVCFMT_CENTER, 90);
        }
    
        //需要包含#include "InfoFile.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(_T("%d"), it->id);
            m_list.InsertItem(i, str);
            int column = 1;
            m_list.SetItemText(i, column++, (CString)it->name.c_str());
            str.Format(_T("%d"), it->price);
            m_list.SetItemText(i, column++, str);
            str.Format(_T("%d"), it->num);
            m_list.SetItemText(i, column++, str);
            i++;
        }
    
        
    }

    10 库存添加窗口

    10.1 ui设计

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

     

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

     

     

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

     

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

    添加个数:

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

    个数编辑框关联int m_num1

    添加新产品:

    商品组合框关联CString m_name2,单价编辑框关联int m_price2

    个数编辑框关联int m_num2

     

     

    10.2 界面挂载

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

     

    10.3功能实现

    1)在对话框类中,重写 OnInitDialog 函数,进行商品信息初始化:

     

    void CAddDlg::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 CAddDlg::OnCbnSelchangeCombo2()
    {
        // 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_price1 = it->price;
                m_num1 = 0;
                UpdateData(FALSE); //内容更新到对应的控件
            }
        }
    
        file.ls.clear(); //清空list的内容
    }

    3) 添加个数按钮实现

     

    void CAddDlg::OnBnClickedButton1()
    {
        // TODO:  在此添加控件通知处理程序代码
    
        //获取控件上的内容,更新到对应关联的变量中
        UpdateData(TRUE);
    
        if (m_num1 == 0)
        {
            MessageBox(TEXT("个数不能为0"));
            return;
        }
    
        CString type;
        //获取当前选中项
        int index = m_combo.GetCurSel();
        //获取组合框当前内容
        m_combo.GetLBText(index, type);
    
        CString str;
        str.Format(_T("添加了 商品:%s 
    单价:%d 
    个数:%d"), type, m_price1, m_num1);
        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 +=  m_num1;
            }
        }
        file.WirteDocline(); //更新文件内容
    
        file.ls.clear(); //清空list的内容
    
        m_num1 = 0;
        UpdateData(FALSE); //更新到对应的控件
    }

    4) 添加个数取消按钮实现

     

    void CAddDlg::OnBnClickedButton2()
    {
        // TODO:  在此添加控件通知处理程序代码
    
        m_combo.SetCurSel(0);
        m_num1 = 0;
        OnCbnSelchangeCombo2();
    }

    5) 添加新商品按钮实现

     

    void CAddDlg::OnBnClickedButton4()
    {
        // TODO:  在此添加控件通知处理程序代码
    
        UpdateData(TRUE); //获取控件内容
    
        if (m_num2 <= 0 || m_price2 <= 0 || m_name2.IsEmpty())
        {
            MessageBox(TEXT("输入信息有误"));
            return;
        }
    
        //需要包含#include "InfoFile.h"
        CInfoFile file;
        file.ReadDocline(); //读取商品信息
        file.Addline(m_name2, m_num2, m_price2); //添加商品
        file.WirteDocline(); //写文件
        file.ls.clear(); //清空list的内容
        MessageBox(_T("添加成功"));
    
        m_name2.Empty();
        m_num2 = 0;
        m_price2 = 0;
        UpdateData(FALSE);
    }

    6) 添加新商品取消按钮实现

     

    void CAddDlg::OnBnClickedButton5()
    {
        // TODO:  在此添加控件通知处理程序代码
        m_name2.Empty();
        m_num2 = 0;
        m_price2 = 0;
        UpdateData(FALSE);
    }

    11 库存删除窗口

    11.1 ui设计

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

     

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

     

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

     

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

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

    个数编辑框关联int m_num

     

    11.2 界面挂载

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

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

    程序运行效果图:

    11.3功能实现

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

     

    void CDelDlg::OnInitialUpdate()
    {
        CFormView::OnInitialUpdate();
    
        //读取文件,获取商品名,给组合框添加字符串
        //需要包含#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());
        }
    
    
        //将第一个商品名设为默认选中项
        m_combo.SetCurSel(0);
    }

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

    void CDelDlg::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); //内容更新到对应的控件
            }
        }
    
        
    }

    3)确定按钮功能实现

    void CDelDlg::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 
    单价:%d 
    个数:%d "), type, m_price, m_num);
        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(); //更新文件内容
        m_num = 0;
        UpdateData(FALSE); //更新到对应的控件
    }

    4)取消按钮功能实现

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

    12 菜单栏

    1)切换到资源视图的Menu,删除掉所有默认(帮助除外):

     

    2)右键菜单栏项,添加事件处理程序,选择COMMAND 消息类型,添加至CMainFrame框架类中。

     

    3)在事件处理函数中发送自定义信号,其它菜单操作类似。

    //个人信息菜单
    void CMainFrame::On32772()
    {
        // TODO:  在此添加命令处理程序代码
    ::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);
    }
  • 相关阅读:
    爬楼梯
    字母异位词分组
    发射子弹过程
    删除元素
    删除排序数组中的重复项
    JAVA编程-------------9、查找1000以内的完数
    JAVA-------------8、计算a+aa+aaa+.....
    JAVA编程----------7、统计一段字符串中的英语字母数,空格数,数字和其他字符数
    JAVA编程---------6、最大公约数和最小公倍数
    JAVA编程----------5、利用条件运算符的嵌套来完成:成绩>=90(A) 60-89(B) 60分以下(C)
  • 原文地址:https://www.cnblogs.com/yangyuqing/p/10315718.html
Copyright © 2020-2023  润新知