MFC入门(三)

摘要:
修改资源属性中的ID(IDI_CONN_WIN):3)设置窗口标题将以下代码添加到CSaleSystemDoc文档类中的OnNewDocument()函数:将标题设置为左右标题Doc-OnNewDocument设置右框架在OnCreate中设置左程序显示以下效果:
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:

MFC入门(三)第1张

1.3 设置窗口属性

1) 设置图标

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

MFC入门(三)第2张

MFC入门(三)第3张

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

 MFC入门(三)第4张

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

 MFC入门(三)第5张

//设置图标,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()函数中添加如下代码:

 MFC入门(三)第6张

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

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

                                     Frame中OnCreate中设置左侧

 

程序运行效果图如下:

 MFC入门(三)第7张

文件处理

2.1 文件内容格式

登陆用户信息:

MFC入门(三)第8张

商品信息:

 MFC入门(三)第9张

2.2 设计文件处理类CInfoFile

1) 添加文件处理类CInfoFile

 MFC入门(三)第10张

MFC入门(三)第11张

登陆对话框

3.1 ui设计

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

MFC入门(三)第12张

 MFC入门(三)第13张

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

 MFC入门(三)第14张

 MFC入门(三)第15张

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

 MFC入门(三)第16张

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

3.2 功能实现

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

MFC入门(三)第17张

MFC入门(三)第18张

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

2)登陆窗口的创建

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

 MFC入门(三)第19张

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

 MFC入门(三)第20张

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

    CDialogEx::OnClose();
}

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

 MFC入门(三)第21张

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

    //CDialogEx::OnOK();
}
静态拆分窗口

4.1 自定义MFC视图类

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

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

 MFC入门(三)第22张

MFC入门(三)第23张

MFC入门(三)第24张

MFC入门(三)第25张

MFC入门(三)第26张

4.2 通过CSplitterWnd类拆分窗口

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

MFC入门(三)第27张

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

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

 MFC入门(三)第28张

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

 MFC入门(三)第29张

静态拆分实现代码如下:

 MFC入门(三)第30张

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入门(三)第31张

5 树视图功能实现

5.1 添加功能节点

1)加载图标资源

MFC入门(三)第32张

MFC入门(三)第33张

图标资源ID改为:IDI_ICON_RE

 MFC入门(三)第34张

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

 MFC入门(三)第35张

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

3)重写CSelectView的OnInitUpdate函数

 MFC入门(三)第36张

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入门(三)第37张

5.2 功能节点相应消息处理

 MFC入门(三)第38张

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),添加所需控件:

 MFC入门(三)第39张

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

 MFC入门(三)第40张

MFC入门(三)第41张

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

 MFC入门(三)第42张

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

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

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

 MFC入门(三)第43张

6.2 功能实现

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

 MFC入门(三)第44张

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

 MFC入门(三)第45张

//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入门(三)第46张

//自定义消息处理函数
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入门(三)第47张

    //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入门(三)第48张

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入门(三)第49张

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入门(三)第50张

销售管理窗口

8.1 ui设计

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

MFC入门(三)第51张

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

MFC入门(三)第52张

MFC入门(三)第53张

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

 MFC入门(三)第54张

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

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

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

 MFC入门(三)第55张

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 函数,进行初始化。

MFC入门(三)第56张

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)处理组合框所需控制事件

 MFC入门(三)第57张

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),添加所需控件。

 MFC入门(三)第58张

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

MFC入门(三)第59张

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

 MFC入门(三)第60张

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

 MFC入门(三)第61张

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

列表控件关联CListCtrl m_list:

 MFC入门(三)第62张

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;

程序运行效果图:

 MFC入门(三)第63张

 

9.3功能实现

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

 MFC入门(三)第64张

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),添加所需控件。

 MFC入门(三)第65张

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

 MFC入门(三)第66张

MFC入门(三)第67张

 

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

 MFC入门(三)第68张

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

添加个数:

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

个数编辑框关联int m_num1

添加新产品:

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

个数编辑框关联int m_num2

 MFC入门(三)第69张

 

10.2 界面挂载

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

 MFC入门(三)第70张

10.3功能实现

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

 MFC入门(三)第71张

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)处理组合框所需控制事件

 MFC入门(三)第72张

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),添加所需控件。

 MFC入门(三)第73张

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

 MFC入门(三)第74张

MFC入门(三)第75张

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

 MFC入门(三)第76张

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

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

个数编辑框关联int m_num

 MFC入门(三)第77张

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;

程序运行效果图:

MFC入门(三)第78张

11.3功能实现

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

 MFC入门(三)第79张

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)处理组合框所需控制事件

MFC入门(三)第80张

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,删除掉所有默认(帮助除外):

 MFC入门(三)第81张

MFC入门(三)第82张

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

 MFC入门(三)第83张

MFC入门(三)第84张

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

//个人信息菜单
void CMainFrame::On32772()
{
    // TODO:  在此添加命令处理程序代码
::PostMessage(AfxGetMainWnd()->GetSafeHwnd(), NM_A, (WPARAM)NM_A, (LPARAM)0);
}

免责声明:文章转载自《MFC入门(三)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化Obsidian X mindmap下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PyQt5中文手册

PyQt5-Chinese-tutorial PyQt5中文教程,翻译自 zetcode,项目地址:https://github.com/maicss/PyQt5-Chinese-tutoral 这个教程比较好的地方是,能讲解每一段代码的含义。 虽然PyQt的函数命名已经非常语义化了,但是对于新手来说,有这一步还是更好的。 所以我选择了翻译这篇教程,希望能...

实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?

我们可以把函数的运行结果分为两类。一类是预期的结果,也就是函数在正常情况下输出的结果。一类是非预期的结果,也就是函数在异常(或叫出错)情况下输出的结果。比如,在上一节课中,获取本机名的函数,在正常情况下,函数返回字符串格式的本机名;在异常情况下,获取本机名失败,函数返回 UnknownHostException 异常对象。 在正常情况下,函数返回数据的类...

Haskell学习笔记

…高阶函数 map :: (a->b) ->[a] ->[b],将函数f依次应用于序列[a],得到新的序列[b]。 filter :: (a->bool)->[a]->[a],利用函数f过滤序列[a]。 这两个函数都可用list comprehension来实现,不过在某些情况下更简洁。利用这两个函数和CF组合可以...

JNI数据类型(转)

  本文原创,转载请注明出处:http://blog.csdn.net/qinjuning     在Java存在两种数据类型: 基本类型 和 引用类型 ,大家都懂的 。     在JNI的世界里也存在类似的数据类型,与Java比较起来,其范围更具严格性,如下:         1、primitive types ----基本数据类型,如:int、 flo...

【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)

完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第36章       FIR滤波器的Matlab设计(含低通,高通,带通和带阻) 本章节讲解FIR滤波器的Matlab设计。主要是函数fir1和fir2的使用。 36.1 窗函数 36.2 fir1函数 36.2 fir...

第八周课程总结&amp;amp;实验报告

实验目的 理解异常的基本概念; 掌握异常处理方法及熟悉常见异常的捕获方法。 实验要求 练习捕获异常、声明异常、抛出异常的方法、熟悉try和catch子句的使用。 掌握自定义异常类的方法。 实验内容 编写一个类,在其main()方法中创建一个一维数组,在try字句中访问数组元素,使其产生ArrayIndexOutOfBoundsException异常。在ca...