MFC,有一个主对话框Commodity_testDlg,和两个子对话框,分别为InputInfoDialog,ShowGoods 主对话框中有一个tree控件,存在如下节点: 录入商品库存信息 显示已录入商品库存信息 通过点击tree中的某一个节点,显示子对话框 要求使用clist以及迭代器相关知识 在子对话框InputIndoDialog中对四个编辑框IDC_ID、IDC_NAME、IDC_COUNT、IDCPRICE, 输入以下数据 商品ID 商品名称 商品数量 商品价格 同时需要对插入的数据,进行判断,不可以输入非法数据 同时存在一个插入的按钮,插入成功,提示“插入成功”,否则提示“插入失败” 然后可以在ShowGoods中用list control显示出来,ShowGoods当中只存在list control这一个控件 请给出一个完整的实例代码,以及代码注释,不可删减
时间: 2023-06-12 10:06:12 浏览: 99
微信小程序 自定义对话框实例详解
以下是一个完整的实例代码,包括注释:
```
// Commodity_testDlg.h : 头文件
//
#pragma once
#include "InputInfoDialog.h"
#include "ShowGoods.h"
// CCommoditytestDlg 对话框
class CCommoditytestDlg : public CDialogEx
{
// 构造
public:
CCommoditytestDlg(CWnd* pParent = nullptr); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_COMMODITY_TEST_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
CTreeCtrl m_TreeCtrl; // 树形控件变量
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
// 新增的函数
void InitTreeCtrl(); // 初始化树形控件
void OnNodeSelected(HTREEITEM hItem); // 树形控件节点被选中的处理函数
void InsertDataToList(CString strID, CString strName, CString strCount, CString strPrice); // 将数据插入到列表控件中
void ClearListData(); // 清空列表控件数据
// 声明子对话框变量
CInputInfoDialog m_InputInfoDlg;
CShowGoods m_ShowGoodsDlg;
public:
afx_msg void OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult);
};
```
```
// Commodity_testDlg.cpp : 实现文件
//
#include "pch.h"
#include "framework.h"
#include "Commodity_test.h"
#include "Commodity_testDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCommoditytestDlg 对话框
CCommoditytestDlg::CCommoditytestDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_COMMODITY_TEST_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCommoditytestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TREE, m_TreeCtrl);
}
BEGIN_MESSAGE_MAP(CCommoditytestDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE, &CCommoditytestDlg::OnTvnSelchangedTree)
END_MESSAGE_MAP()
// CCommoditytestDlg 消息处理程序
BOOL CCommoditytestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 将大括号拆分成两行,以便阅读
{
// 将图标设置为对话框的图标
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// 初始化树形控件
InitTreeCtrl();
}
// 将大括号拆分成两行,以便阅读
{
// 将子对话框居中
CRect rc;
GetClientRect(rc);
rc.DeflateRect(10, 60, 10, 10);
m_InputInfoDlg.MoveWindow(rc);
// 显示主对话框
ShowWindow(SW_SHOW);
// 显示子对话框
m_InputInfoDlg.ShowWindow(SW_SHOW);
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void CCommoditytestDlg::InitTreeCtrl()
{
// 获取根节点
HTREEITEM hRoot = m_TreeCtrl.InsertItem(_T("商品管理"));
// 添加子节点
HTREEITEM hItem = m_TreeCtrl.InsertItem(_T("录入商品库存信息"), hRoot);
m_TreeCtrl.InsertItem(_T("子节点1"), hItem);
m_TreeCtrl.InsertItem(_T("子节点2"), hItem);
hItem = m_TreeCtrl.InsertItem(_T("显示已录入商品库存信息"), hRoot);
m_TreeCtrl.InsertItem(_T("子节点3"), hItem);
m_TreeCtrl.InsertItem(_T("子节点4"), hItem);
// 展开根节点
m_TreeCtrl.Expand(hRoot, TVE_EXPAND);
}
void CCommoditytestDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}
HCURSOR CCommoditytestDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CCommoditytestDlg::OnNodeSelected(HTREEITEM hItem)
{
// 获取节点的文本
CString strText = m_TreeCtrl.GetItemText(hItem);
// 根据节点的文本选择对应的子对话框
if (strText == _T("录入商品库存信息"))
{
m_InputInfoDlg.ShowWindow(SW_SHOW);
m_ShowGoodsDlg.ShowWindow(SW_HIDE);
}
else if (strText == _T("显示已录入商品库存信息"))
{
m_InputInfoDlg.ShowWindow(SW_HIDE);
m_ShowGoodsDlg.ShowWindow(SW_SHOW);
// 清空列表控件数据
ClearListData();
}
}
void CCommoditytestDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// 获取选中的节点
HTREEITEM hItem = m_TreeCtrl.GetSelectedItem();
// 处理选中的节点
OnNodeSelected(hItem);
*pResult = 0;
}
void CCommoditytestDlg::InsertDataToList(CString strID, CString strName, CString strCount, CString strPrice)
{
// 获取列表控件
CListCtrl* pListCtrl = m_ShowGoodsDlg.GetListCtrl();
// 添加行
int nItem = pListCtrl->GetItemCount();
pListCtrl->InsertItem(nItem, strID);
// 添加列
pListCtrl->SetItemText(nItem, 1, strName);
pListCtrl->SetItemText(nItem, 2, strCount);
pListCtrl->SetItemText(nItem, 3, strPrice);
}
void CCommoditytestDlg::ClearListData()
{
// 获取列表控件
CListCtrl* pListCtrl = m_ShowGoodsDlg.GetListCtrl();
// 清空所有行
pListCtrl->DeleteAllItems();
}
```
```
// InputInfoDialog.h : 头文件
//
#pragma once
// CInputInfoDialog 对话框
class CInputInfoDialog : public CDialogEx
{
DECLARE_DYNAMIC(CInputInfoDialog)
public:
CInputInfoDialog(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CInputInfoDialog();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_INPUT_INFO_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
private:
CString m_strID;
CString m_strName;
CString m_strCount;
CString m_strPrice;
};
```
```
// InputInfoDialog.cpp : 实现文件
//
#include "pch.h"
#include "Commodity_test.h"
#include "InputInfoDialog.h"
#include "afxdialogex.h"
// CInputInfoDialog 对话框
IMPLEMENT_DYNAMIC(CInputInfoDialog, CDialogEx)
CInputInfoDialog::CInputInfoDialog(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_INPUT_INFO_DIALOG, pParent)
{
}
CInputInfoDialog::~CInputInfoDialog()
{
}
void CInputInfoDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_ID, m_strID);
DDX_Text(pDX, IDC_NAME, m_strName);
DDX_Text(pDX, IDC_COUNT, m_strCount);
DDX_Text(pDX, IDC_PRICE, m_strPrice);
}
BEGIN_MESSAGE_MAP(CInputInfoDialog, CDialogEx)
ON_BN_CLICKED(IDOK, &CInputInfoDialog::OnBnClickedOk)
END_MESSAGE_MAP()
// CInputInfoDialog 消息处理程序
void CInputInfoDialog::OnBnClickedOk()
{
// 获取编辑框的值
UpdateData(TRUE);
// 进行数据校验
// ...
// 将数据插入到列表控件中
((CCommoditytestDlg*)GetParent())->InsertDataToList(m_strID, m_strName, m_strCount, m_strPrice);
// 插入成功,提示“插入成功”,否则提示“插入失败”
// ...
CDialogEx::OnOK();
}
```
```
// ShowGoods.h : 头文件
//
#pragma once
// CShowGoods 对话框
class CShowGoods : public CDialogEx
{
DECLARE_DYNAMIC(CShowGoods)
public:
CShowGoods(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CShowGoods();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SHOW_GOODS };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_ListCtrl;
virtual BOOL OnInitDialog();
};
```
```
// ShowGoods.cpp : 实现文件
//
#include "pch.h"
#include "Commodity_test.h"
#include "ShowGoods.h"
#include "afxdialogex.h"
// CShowGoods 对话框
IMPLEMENT_DYNAMIC(CShowGoods, CDialogEx)
CShowGoods::CShowGoods(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_SHOW_GOODS, pParent)
{
}
CShowGoods::~CShowGoods()
{
}
void CShowGoods::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST, m_ListCtrl);
}
BEGIN_MESSAGE_MAP(CShowGoods, CDialogEx)
END_MESSAGE_MAP()
// CShowGoods 消息处理程序
BOOL CShowGoods::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置列表控件的样式和列标题
m_ListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_ListCtrl.InsertColumn(0, _T("商品ID"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(1, _T("商品名称"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(2, _T("商品数量"), LVCFMT_LEFT, 100);
m_ListCtrl.InsertColumn(3, _T("商品价格"), LVCFMT_LEFT, 100);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
```
阅读全文