2023年7月17日发(作者:)
MFC——对话框的创建及使⽤⽂章⽬录MFC对话框的创建实例对话框程序的创建过程:选择“⽂件 | 新建 | 项⽬”菜单;在“新建项⽬”对话框中,选择“ MFC 应⽤程序 ”,输⼊⼯程名称,选择“确定”。选择“ 基于对话框”,即创建基于对话框的应⽤程序,选择“完成”。对话框应⽤程序框架介绍资源视图⽤ AppWizard 创建基于对话框的应⽤程序框架(假定⼯程名为 Dialog )后,项⽬⼯作区上增加了⼀个“资源视图”选项卡。或者,通过视图找到“资源视图”选项卡:在 MFC中,与⽤户进⾏交互的对话框界⾯被认为是⼀种资源。展开“Dialog”,可以看到有⼀个ID为IDD_ DIALOG _DIALOG(中间部分(DIALOG)与项⽬名称相同)的资源,对应中间的对话框设计界⾯。不管在何时,只要双击对话框资源的ID,对话框设计界⾯就会显⽰在中间。类视图在类视图中,可以看到⽣成了3 个类:CAboutDlg、CDialogApp和CDialogDlg。CAboutDlg:对应⽣成的版本信息对话框。CDialogApp:应⽤程序类,从 CWinApp 继承过来,封装了初始化、运⾏、终⽌该程序的代码。CDialogDlg:对话框类,从CdialogEx继承过来的,在程序运⾏时看到的对话框就是它的⼀个具体对象。DoDataExchange函数:该函数主要完成对话框数据的交换和校验。OnInitDialog函数:相当于对对话框进⾏初始化处理。设计界⾯和⼯具箱模态对话框当模态对话框显⽰时,程序会暂停执⾏,直到关闭这个模态对话框之后,才能执⾏程序中的其他任务。1)通过⼯具箱在界⾯上放⼀个Button,双击此按钮即可跳转到按钮处理函数://按钮处理函数void CDialogDlg::OnBnClickedButton1(){ // TODO:
在此添加控件通知处理程序代码}2)资源视图 -> Dialog -> 右击 -> 插⼊ Dialog:3)修改对话框ID:4)点击对话框模板 -> 右击 -> 添加类:5)类视图中多了⼀个⾃定义类:6)按钮处理函数创建对话框,以模态⽅式运⾏。实现模态对话框的创建需要调⽤CDialog类的成员函数CDialog::DoModel,该函数的功能就是创建并显⽰⼀个对话框://启动模态对话框按钮void CDialogDlg::OnBnClickedButton1(){ //需要包含头⽂件:#include "DlgExec.h" CDlgExec dlg; l(); //以模态⽅式运⾏}⾮模态对话框当⾮模态对话框显⽰时,运⾏转⽽执⾏程序中的其他任务,⽽不⽤关闭这个对话框。图形界⾯操作过程和模态对话框⼀样,只是,⾮模态对话框实现⽅式不⼀样,先创建(CDialog::Create)⼀次,然后再显⽰(CWnd::ShowWindow)。1)主对话框.h类中声明对话框对象:2)创建对话框放在主对话框类的构造函数或OnCreate()函数,⽬的只创建⼀次对话框://主对话框构造函数CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CDialogDlg::IDD, pParent){ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_(IDD_DIALOG_SHOW); //IDD_DIALOG_SHOW为对话框ID}3)按钮处理函数显⽰对话框://启动⾮模态对话框按钮void CDialogDlg::OnBnClickedButton2(){ // TODO:
在此添加控件通知处理程序代码 m_ndow(SW_SHOWNORMAL); //显⽰⾮模态对话框}MFC常⽤控件静态⽂本框CStatic静态⽂本框是最简单的控件,它主要⽤来显⽰⽂本信息,不能接受⽤户输⼊,⼀般不需要连接变量,也不需要处理消息。静态⽂本框的重要属性有:ID:所有静态⽂本框的缺省ID都是IDC_STATIC,静态ID,不响应任何消息(事件)Caption:修改显⽰的内容接⼝CWnd::SetWindowTextCWnd::GetWindowTextCStatic::SetBitmap功能设置控件内容获取控件内容设置位图(后缀为bmp的图⽚)关联控件变量由于XXX_STATIC静态ID是不能关联变量,故需把ID修改后,再关联变量:在主对话框类OnInitDialog()中,完成相应接⼝测试://设置静态控件内容为Tom m_dowText(TEXT("Tom")); //获取静态控件的内容 CString str; m_dowText(str); MessageBox(str); //设置静态控件窗⼝风格为位图居中显⽰ m_Style(0xf, SS_BITMAP | SS_CENTERIMAGE); //通过路径获取bitmap句柄#define HBMP(filepath,width,height) (HBITMAP)LoadImage(AfxGetInstanceHandle(),filepath,IMAGE_BITMAP,width,height,LR_LOADFROMFILE|LR_CREATEDIBSECTION) //静态控件设置bitmap m_map(HBMP(TEXT("./"), 300, 250));普通按钮 CButton按钮是最常见的、应⽤最⼴泛的⼀种控件。在程序执⾏期间,当单击某个按钮后就会执⾏相应的消息处理函数。按钮的主要属性是Caption,来设置在按钮上显⽰的⽂本。命令按钮处理的最多的消息是:BN_CLICKED,双击按钮即可跳转到处理函数。或者,通过按钮属性 -> 控制事件 -> 选择所需事件,添加处理函数://按钮BN_CLICKED事件处理函数void CMFCApplication2Dlg::OnBnClickedButton1(){ // TODO:
在此添加控件通知处理程序代码}常⽤接⼝:接⼝CWnd::SetWindowTextCWnd::GetWindowTextCWnd::EnableWindow功能设置控件内容获取控件内容设置控件是否变灰关联控件变量在主对话框类OnInitDialog()中,完成相应接⼝测试://获取按钮的内容 CString str; m_dowText(str); MessageBox(str); //设置按钮内容 m_dowText(TEXT("^_^")); //设置按钮状态为灰⾊ m_Window(FALSE); m_Window(TRUE);编辑框 CEdit常⽤属性设置:属性NumberPasswordWant returnMultilineAuto VScrollVertical ScrollHorizontal ScrollRead Only含义True只能输⼊数字True密码模式True接收回车键,⾃动换⾏,只有在多⾏模式下,才能换⾏True多⾏模式True 当垂直⽅向字符太多,⾃动出现滚动条,同时设置Vertical Scroll才有效True当垂直⽅向字符太多,⾃动出现滚动条,和Auto VScroll配合使⽤True当垂直⽅向字符太多,⾃动出现滚动条,和Auto HScroll配合使⽤True 只读常⽤接⼝:接⼝CWnd::SetWindowTextCWnd::GetWindowText功能设置控件内容获取控件内容关联控件变量在主对话框类OnInitDialog()中,完成相应接⼝测试://设置按钮内容 m_dowText(TEXT("this is a test")); //获取按钮的内容 CString str; m_dowText(str); MessageBox(str);管理基本类型变量若⼀个编辑框连接了⼀个Value类别的变量,则该变量就表⽰这个编辑框,编辑框中显⽰的内容就是变量的值。但是,改变了编辑框的内容并不会⾃动更新对应的变量的值,同样,改变了变量的值也不会⾃动刷新编辑框的内容。若要保持⼀致,需要使⽤UpdateData()函数更新:若编辑框的内容改变了,则应使⽤语句UpdateData(TRUE) 获取对话框数据若变量的值改变了,则应使⽤语句UpdateData(FALSE) 初始化对话框控件在主对话框类OnInitDialog()中,完成相应代码测试: m_e1 = 10.11; UpdateData(FALSE); //FALSE说明把m_e1的值更新到对应的控件中 UpdateData(TRUE); //TRUE说明把控件的值更新到m_e1变量中组合框(下拉框)CComboBox常⽤属性设置:属性datatypeSort含义设置内容,不同内容间⽤英⽂的分号“;”分隔显⽰风格True 内容⾃动排序常⽤接⼝:接⼝CComboBox::AddStringCComboBox::SetCurSelCComboBox::GetCurSelCComboBox::GetLBTextCComboBox::DeleteStringCComboBox::InsertString功能组合框添加⼀个字符串设置当前选择项(当前显⽰第⼏项),下标从0开始获取组合框中当前选中项的下标获取指定位置的内容删除指定位置的字符串在指定位置插⼊字符串关联控件变量后,测试接⼝://添加字符串内容 m_ing(TEXT("可乐"));
m_ing(TEXT("雪碧")); m_Sel(1);//显⽰显⽰第1项 //获取组合框中当前选中项的下标 int index = m_Sel();
CString str; m_ext(index, str); //获取指定下标的内容 MessageBox(str); m_String(0); //删除第0项字符串
m_String(0, _T("hello")); //在第0位置插⼊“hello”组合框常⽤的事件为:CBN_SELCHANGE,当选择组合框某⼀项时,⾃动触发此事件。void CMFCApplication2Dlg::OnCbnSelchangeCombo1(){ // TODO:
在此添加控件通知处理程序代码}列表控件 CListCtrl常⽤属性设置:view -> Report(报表⽅式)常⽤接⼝:接⼝CListCtrl::SetExtendedStyleCListCtrl::GetExtendedStyleCListCtrl::InsertColumn功能设置列表风格获取列表风格插⼊某列内容,主要⽤于设置标题CListCtrl::InsertItemCListCtrl::SetItemText在某⾏插⼊新项内容设置某⾏某列的⼦项内容CListCtrl::GetItemText接⼝获取某⾏某列的内容功能关联控件变量后,测试接⼝://设置风格样式 //LVS_EX_GRIDLINES
⽹格 //LVS_EX_FULLROWSELECT
选中整⾏ m_endedStyle(m_endedStyle() | LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); //插⼊标题 CString head[] = { TEXT("姓名"), TEXT("年龄"), TEXT("性别") }; //插⼊列 m_Column(0, head[0], LVCFMT_LEFT, 100); m_Column(1, head[1], LVCFMT_LEFT, 100); m_Column(2, head[2], LVCFMT_LEFT, 100); //插⼊正⽂内容,先确定⾏,再确定列 for (int i = 0; i < 10; i++) { CString str; (TEXT("张三_%d"), i ); //确定⾏ m_Item(i, str); //设置列 int j = 0; m_mText(i, ++j, TEXT("男")); m_mText(i, ++j, TEXT("23")); }程序效果图:树控件 CTreeCtrl常⽤属性设置:属性has buttonshas lineslines at root含义True 有展开按钮True 有展开线True 有根节点常⽤接⼝:接⼝AfxGetApp()CWinApp::LoadIconCImageList::CreateCImageList::AddCTreeCtrl::SetImageListCTreeCtrl::InsertItemCTreeCtrl::SelectItemCTreeCtrl::GetSelectedItemCTreeCtrl::GetItemText功能获取应⽤程序对象指针加载⾃定义图标创建图像列表图像列表追加图标设置图形状态列表插⼊节点设置默认选中项获取选中项获取某项内容关联控件变量添加图标资源(icon)资源视图 -> Icon -> 添加资源:导⼊ico⽂件3)通过代码加载图标 //加载图标 HICON icon[3]; icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1); icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2); icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);创建图像列表.h⽂件中定义图形列表(CImageList)对象CImageList m_imageList; //图像列表.cpp⽂件中OnInitDialog()函数中完成图像列表的创建、图标的追加//图像列表,程序完毕不能释放,
创建 //30, 30:
图⽚的宽度和⾼度 //ILC_COLOR32:样式 // 3, 3:
有多少图⽚写多少 m_(30, 30, ILC_COLOR32, 3, 3); //给图像列表添加图⽚ for (int i = 0; i < 3; i++) { //图⽚列表加载图标 m_(icon[i]); }树控件的相应操作 //树控件设置图⽚列表 m_geList(&m_imageList, TVSIL_NORMAL); //给树创建节点 //根节点,⽗节点,⼦节点 HTREEITEM root = m_Item(TEXT("中国"), 0, 0, NULL); HTREEITEM fathter = m_Item(TEXT("北京"), 1, 1, root); HTREEITEM son = m_Item(TEXT("海淀"), 2, 2, fathter); //设置某个节点被选中 m_Item(fathter);程序效果图树控件常⽤事件为:TVN_SELCHANGED,当选择某个节点时,⾃动触发此事件。void CMy01_TreeCtrlDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult){ LPNMTREEVIEW pNMTreeView = reinterpret_cast
在此添加控件通知处理程序代码 *pResult = 0; HTREEITEM selItem; //获得选择项 selItem = m_ectedItem(); //获取选中的内容 CString cs = m_mText(selItem); MessageBox(cs);}标签控件 CTabCtrl在UI⼯具箱拖放 Tab Control把 TabSheet.h和 放在项⽬⽂件同级⽬录,并且添加到⼯程⽬录中给UI上 Tab Control 关联Control类型(CTabSheet)添加对话框资源视图 -> Dialog -> 右击 -> 插⼊ Dialog设置相应属性:Style -> Child (⼦窗⼝)Border -> None (⽆边框)⾃定义类:点击对话框模板 -> 右击 -> 添加类(MyDlg1、MyDlg2)主对话框类中, 定义⾃定义类对象,需要相应头⽂件 //给tab控件添加对话框//IDD_DIALOG1为dlg1资源ID m_e(TEXT("系统管理"), &dlg1, IDD_DIALOG1);
//IDD_DIALOG1为dlg2资源ID m_e(TEXT("系统设置"), &dlg2, IDD_DIALOG2);
//显⽰tab控件 m_();程序效果图综合案例通过MFC向导创建综合案例(销售信息管理系统)项⽬。项⽬总体框架整个项⽬分为登录界⾯、主界⾯。⽽主界⾯分裂成两个界⾯显⽰,分别为左侧选择界⾯和右侧显⽰界⾯。功能上分别有个⼈信息管理、销售管理窗⼝、库存信息窗⼝、库存添加窗⼝、库存删除窗⼝以及菜单栏。⽂件处理项⽬中使⽤到将数据保存到⽂件进⾏保存的功能,这部分设计成⼀个单独的⽂件处理类CInfoFile。在解决⽅案中添加类–>CInfoFile。CInfoFole.h#pragma once#include #include
转为CString
memset(buf, 0, sizeof(buf));//清空buf e(buf, sizeof(buf)); pwd = CString(buf); ();//关闭⽂件}void CInfoFile::WritePwd(char* name, char* pwd){ std::ofstream ofs;//创建⽂件输出对象 (_F_LOGIN);//打开⽂件 ofs << name << std::endl;//将name写⼊⽂件并换⾏ ofs << pwd << std::endl;//将pwd写⼊⽂件并换⾏ ();//关闭⽂件}void CInfoFile::ReadDocline(){ std::ifstream ifs(_F_STOCK);//输⼊⽅式打开⽂件 char buf[1024] = { 0 }; num = 0;//初始化商品数⽬ ();//初始化容器 //取出表头 e(buf, sizeof(buf)); while (!())//循环执⾏到⽂件结尾 { msg tmp;//声明暂存变量
e(buf, sizeof(buf)); num++; char* set = strtok(buf, "|");//以|为分隔符切割字符串 if (set != NULL) { = std::atoi(set);//第⼀个为商品id } else { break;//找不到分隔符则跳出循环 } set = strtok(NULL, "|"); = set;//商品名称 set = strtok(NULL, "|"); = std::atoi(set);//商品价格 set = strtok(NULL, "|"); = std::atoi(set);//商品数⽬ _back(tmp); } ();//关闭⽂件}void CInfoFile::WriteDocline(){ std::ofstream ofs(_F_STOCK);//输出⽅式打开⽂件 if (() > 0) { ofs << "商品ID|商品名称|商品价格|库存" << std::endl;//写⼊表头 //通过迭代器写⼊内容 for (auto it = (); it != (); ++it) { ofs << it->id << "|"; ofs << it->name << "|"; ofs << it->price << "|"; ofs << it->num << std::endl; } } ();//关闭⽂件}void CInfoFile::AddLine(CString name, int num, int price){ msg tmp; if (() > 0) { if (!y() && num > 0 && price > 0) { = () + 1; CStringA str; str = name; = fer(); = num; = price; _back(tmp);//放在链表后 } }}登录对话框添加对话框资源(ID修改为DIALOG_LOGIN),添加所需控件:选中对话框-> 右击 -> 添加类 -> 类名:CLoginDlg,添加关联变量。具体功能实现:需要重写OnInitDialog在应⽤程序类CSaleSystemApp的InitInstance() ⾥⾯的APP 创建之前创建登陆对话框。 CLoginDlg dlg; //创建登陆对话框,需要头⽂件#include "LoginDlg.h" l(); //以模态⽅式运⾏登录按钮功能实现。CLoginDlg.h#pragma once// CLoginDlg
对话框class CLoginDlg : public CDialogEx{ DECLARE_DYNAMIC(CLoginDlg)public: CLoginDlg(CWnd* pParent = nullptr); //
标准构造函数 virtual ~CLoginDlg();//
对话框数据#ifdef AFX_DESIGN_TIME enum { IDD = IDD_LOGIN };#endifprotected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV
⽀持 DECLARE_MESSAGE_MAP()private: CString m_user; CString m_pwd;public: virtual BOOL OnInitDialog(); afx_msg void OnBnClickedButton2(); afx_msg void OnBnClickedButton1(); afx_msg void OnClose(); virtual void OnOK();};// :
实现⽂件//#include "pch.h"#include "SaleSystem.h"#include "CLoginDlg.h"#include "afxdialogex.h"#include "CInfoFile.h"// CLoginDlg
对话框IMPLEMENT_DYNAMIC(CLoginDlg, CDialogEx)CLoginDlg::CLoginDlg(CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_LOGIN, pParent) , m_user(_T("")) , m_pwd(_T("")){}CLoginDlg::~CLoginDlg(){}void CLoginDlg::DoDataExchange(CDataExchange* pDX){ CDialogEx::DoDataExchange(pDX); CDialogEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, m_user); DDX_Text(pDX, IDC_EDIT2, m_pwd);}BEGIN_MESSAGE_MAP(CLoginDlg, CDialogEx) ON_BN_CLICKED(IDC_BUTTON2, &CLoginDlg::OnBnClickedButton2) ON_BN_CLICKED(IDC_BUTTON1, &CLoginDlg::OnBnClickedButton1) ON_WM_CLOSE()END_MESSAGE_MAP()// CLoginDlg
消息处理程序BOOL CLoginDlg::OnInitDialog(){ CDialogEx::OnInitDialog(); // TODO:
在此添加额外的初始化 m_user = TEXT("斧头帮帮主"); m_pwd = TEXT("123456"); UpdateData(FALSE);//内容更新到对应控件 return TRUE; // return TRUE unless you set the focus to a control //
异常: OCX
属性页应返回 FALSE}void CLoginDlg::OnBnClickedButton2(){ // TODO:
在此添加控件通知处理程序代码 UpdateData(TRUE);//更新控件数据到数据区 CInfoFile file; CString user, pwd; user = TEXT("斧头帮帮主"); pwd = TEXT("123456");
//gin(user, pwd); if (m_user == user) { if (m_pwd != pwd) { MessageBox(TEXT("密码错误")); m_(); m_(); } else { CDialogEx::OnOK(); } } else { MessageBox(TEXT("⽤户不存在")); m_(); m_(); }}void CLoginDlg::OnBnClickedButton1()void CLoginDlg::OnBnClickedButton1(){ // TODO:
在此添加控件通知处理程序代码 exit(0);}void CLoginDlg::OnClose(){ // TODO:
在此添加消息处理程序代码和/或调⽤默认值 exit(0); //CDialogEx::OnClose();}void CLoginDlg::OnOK(){ // TODO:
在此添加专⽤代码和/或调⽤基类 //CDialogEx::OnOK();}静态拆分窗⼝实现主界⾯的拆分显⽰,左侧选择界⾯显⽰(CSelectView)和右侧显⽰界⾯(CDisplayView)。CSelectView继承于CTreeView,CDispalyView继承于CFormView。在CMainFrame类中,声明CSplitterWnd类型的对象:private: CSplitterWnd m_spliter; //
切分窗⼝类对象重写框架类CMainFrame的OnCreateClient函数BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext){ // TODO:
在此添加专⽤代码和/或调⽤基类 //return CFrameWnd::OnCreateClient(lpcs, pContext); //静态拆分窗⼝ m_Static(this, 1, 2); m_View(0, 0, RUNTIME_CLASS(CSelectView), CSize(200, 500), pContext); m_View(0, 1, RUNTIME_CLASS(CDisplayView), CSize(600, 500), pContext); return TRUE;}显⽰如下:左侧选择界⾯树视图实现添加树视图图标。CSelectView类中声明相应变量: CTreeCtrl *m_treeCtrl; //树控件 CImageList m_imageList; //图标列表重写CSelectView的OnInitUpdate函数void CSelectView::OnInitialUpdate(){ CTreeView::OnInitialUpdate(); // TODO:
在此添加专⽤代码和/或调⽤基类 HICON icon = AfxGetApp()->LoadIconW(IDI_ICON_RE); //图⽚列表的串讲,指定图标的宽度和⾼度 m_(30, 30, ILC_COLOR32, 1, 1); m_(icon); //获取树视图中的控件 m_treeCtrl = &GetTreeCtrl(); //树控件设置图⽚列表 m_treeCtrl->SetImageList(&m_imageList, TVSIL_NORMAL); //树控件设置节点 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);}功能节点消息处理当左侧窗⼝点击树节点,会发送对应的消息给mainframe,主窗⼝接收到对应消息后会进⾏相应处理,将右侧窗⼝挂载成不同的显⽰界⾯。树节点改变响应处理:void CSelectView::OnTvnSelchanged(NMHDR* pNMHDR, LRESULT* pResult){ LPNMTREEVIEW pNMTreeView = reinterpret_cast
在此添加控件通知处理程序代码 //获取当前项⽬ HTREEITEM item = m_treeCtrl->GetSelectedItem(); //根据所选项⽬获取内容 CString str = m_treeCtrl->GetItemText(item); //MessageBox(str); if (str == TEXT("个⼈信息")) { ::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); } *pResult = 0;}在CMainFrame.h中声明了对应的消息宏:#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)在中的宏节点声明对应的消息处理声明:BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook) ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook) ON_WM_SETTINGCHANGE() //⾃定义消息 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) ON_COMMAND(ID_EDIT_UNDO, &CMainFrame::OnEditUser) ON_COMMAND(ID_EDIT_CUT, &CMainFrame::OnEditSell) ON_COMMAND(ID_EDIT_COPY, &CMainFrame::OnEditCopy) ON_COMMAND(ID_EDIT_PASTE, &CMainFrame::OnEditAdd) ON_COMMAND(ID_32771, &CMainFrame::OnEditDel)END_MESSAGE_MAP()⾃定义对应的消息处理函数//⾃定义处理消息函数LRESULT CMainFrame::OnMyChange(WPARAM wParam, LPARAM lParam){ CCreateContext Context; switch (wParam) { case NM_A: { //MessageBox(TEXT("个⼈信息界⾯显⽰")); //界⾯挂载 Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg); Context.m_pCurrentFrame = this; Context.m_pLastView = (CFormView*)m_e(0, 1); m_View(0, 1); m_View(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context); CUserDlg* pNewView = (CUserDlg*)m_e(0, 1); m_Layout(); pNewView->OnInitialUpdate(); m_ivePane(0, 1); } break; case NM_B: { Context.m_pNewViewClass = RUNTIME_CLASS(CSellDlg); Context.m_pCurrentFrame = this; Context.m_pLastView = (CFormView*)m_e(0, 1); m_View(0, 1); m_View(0, 1, RUNTIME_CLASS(CSellDlg), CSize(600, 0), &Context); CSellDlg* pNewView = (CSellDlg*)m_e(0, 1); m_Layout(); pNewView->OnInitialUpdate(); m_ivePane(0, 1); } break; case NM_C: { Context.m_pNewViewClass = RUNTIME_CLASS(CInfoDlg); Context.m_pCurrentFrame = this; Context.m_pLastView = (CFormView*)m_e(0, 1); m_View(0, 1); m_View(0, 1, RUNTIME_CLASS(CInfoDlg), CSize(600, 0), &Context); CInfoDlg* pNewView = (CInfoDlg*)m_e(0, 1); CInfoDlg* pNewView = (CInfoDlg*)m_e(0, 1); m_Layout(); pNewView->OnInitialUpdate(); m_ivePane(0, 1); } break; case NM_D: { Context.m_pNewViewClass = RUNTIME_CLASS(CAddDlg); Context.m_pCurrentFrame = this; Context.m_pLastView = (CFormView*)m_e(0, 1); m_View(0, 1); m_View(0, 1, RUNTIME_CLASS(CAddDlg), CSize(600, 0), &Context); CAddDlg* pNewView = (CAddDlg*)m_e(0, 1); m_Layout(); pNewView->OnInitialUpdate(); m_ivePane(0, 1); } break; case NM_E: { Context.m_pNewViewClass = RUNTIME_CLASS(CDelDlg); Context.m_pCurrentFrame = this; Context.m_pLastView = (CFormView*)m_e(0, 1); m_View(0, 1); m_View(0, 1, RUNTIME_CLASS(CDelDlg), CSize(600, 0), &Context); CDelDlg* pNewView = (CDelDlg*)m_e(0, 1); m_Layout(); pNewView->OnInitialUpdate(); m_ivePane(0, 1); } break; default: break; } /* if (wParam == NM_A) { //MessageBox(TEXT("个⼈信息界⾯显⽰")); //界⾯挂载 Context.m_pNewViewClass = RUNTIME_CLASS(CUserDlg); Context.m_pCurrentFrame = this; Context.m_pLastView = (CFormView*)m_e(0, 1); m_View(0, 1); m_View(0, 1, RUNTIME_CLASS(CUserDlg), CSize(600, 500), &Context); CUserDlg* pNewView = (CUserDlg*)m_e(0, 1); m_Layout(); pNewView->OnInitialUpdate(); m_ivePane(0, 1); } */
return LRESULT();}个⼈信息管理窗⼝添加对话框资源(ID修改为DIALOG_USER),添加所需控件,在窗⼝属性中,Border改为None,Style改为Child:选中对话框 -> 右击 -> 添加类 -> 类名:CUserDlg,基类选择CFormView根据需求,控件关联所需变量⾝份编辑区关联CString m_user,⽤户名编辑框关联CString m_name,新密码编辑框关联CString m_newPwd,确定密码编辑框关联CString m_surePwd。重写界⾯初始化函数OnInitDialog// CUserDlg
消息处理程序void CUserDlg::OnInitialUpdate(){ CFormView::OnInitialUpdate(); //初始化代码 m_user = TEXT("销售员"); CInfoFile file; CString name, pwd; cline(); gin(name, pwd); m_name = name; UpdateData(FALSE); // TODO:
在此添加专⽤代码和/或调⽤基类}实现确定按钮功能实现void CUserDlg::OnBnClickedButton1(){ // TODO:
在此添加控件通知处理程序代码 UpdateData(TRUE); if (m_y() || m_y()) { MessageBox(TEXT("输⼊的内容不能为空")); return; } //密码不⼀致 if (m_newPwd != m_surePwd) { MessageBox(TEXT("新密码与确定密码不⼀致")); return; } CInfoFile file; CString name, pwd; gin(name, pwd); //新密码与原密码要不⼀致 if (m_newPwd == pwd) { MessageBox(TEXT("新密码与原密码重复!")); return; } //修改密码 CStringA tmpName; CStringA tmpPwd; tmpName = name; tmpPwd = m_newPwd; wd(fer(), fer()); MessageBox(TEXT("修改密码成功")); //清空输⼊内容 m_(); m_(); UpdateData(FALSE);}取消按钮功能实现void CUserDlg::OnBnClickedButton2(){ // TODO:
在此添加控件通知处理程序代码 m_(); m_(); UpdateData(FALSE);}销售管理窗⼝添加新对话框,选中对话框 -> 右击 -> 添加类 -> 类名:CSellDlg,基类选择CFormView根据需求,控件关联所需变量商品名组合框关联CComboBox m_combo,单价编辑框关联int m_price,个数编辑框关联int m_num,销售信息编辑框关联CString m_sellInfo。重写OnInitDialog 函数。void CSellDlg::OnInitialUpdate(){ CFormView::OnInitialUpdate(); // TODO:
在此添加专⽤代码和/或调⽤基类 CInfoFile file; cline();//读取商品信息 for (auto it = (); it != (); ++it) { m_ing((CString)it->name.c_str()); } (); m_Sel(0);}处理组合框处理实现void CSellDlg::OnCbnSelchangeCombo1(){ // TODO:
在此添加控件通知处理程序代码 CString text; int index = m_Sel(); m_ext(index, text);//获取当前选择的字符 CInfoFile file; cline(); for (auto it = (); it != (); ++it) { if (text == it->name.c_str()) { m_price = it->price; m_num = 0; UpdateData(FALSE);//内容更新到显⽰空间 } } ();
}购买按钮实现void CSellDlg::OnBnClickedButton1(){ // TODO:
在此添加控件通知处理程序代码 UpdateData(TRUE);//界⾯数据更新 if (m_num == 0) { MessageBox(TEXT("购买个数不能为0")); return; } CString type; //获取当前选择项⽬ int index = m_Sel(); m_ext(index, type); CString str; (TEXT("商品:%s rn 单价:%d rn 总价:%d"), type, m_price, m_num, m_price * m_num); m_sellInfo = str; UpdateData(FALSE);//更新到控件显⽰ MessageBox(str); //更新到库存⽂件 CInfoFile file; cline(); for (auto it = (); it != (); ++it) { if (type == it->name.c_str()) { it->num = it->num - m_num; } } ocline();//更新内容 (); m_();//清空 m_num = 0; UpdateData(FALSE);}取消按钮实现void CSellDlg::OnBnClickedButton2(){ // TODO:
在此添加控件通知处理程序代码 //取消按钮处理 m_Sel(0);//选择第⼀个项⽬ m_(); m_num = 0; OnCbnSelchangeCombo1();}库存信息窗⼝添加对话框资源(ID修改为DIALOG_INFO),添加所需控件。View 属性为 Report(报表表模式):选中对话框 -> 右击 -> 添加类 -> 类名:CInfoDlg,基类选择CFormView根据需求,控件关联所需变量列表控件关联CListCtrl m_list:重写 OnInitDialog 函数,进⾏商品信息初始化:void CInfoDlg::OnInitialUpdate(){ CFormView::OnInitialUpdate(); // TODO:
在此添加专⽤代码和/或调⽤基类 m_endedStyle(m_endedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); //初始化表 CString field[] = { TEXT("商品ID"), TEXT("商品名称"), TEXT("商品价格"), TEXT("库存数量") }; for (int i = 0; i < sizeof(field) / sizeof(field[0]); ++i) { m_Column(i, field[i], LVCFMT_CENTER, 90); } //读取数据 CInfoFile file; cline(); int i = 0; CString str; for (auto it = (); it != (); ++it) { (TEXT("%d"), it->id); m_Item(i, str); int column = 1; m_mText(i, column++, (CString)it->name.c_str()); (TEXT("%d"), it->price); m_mText(i, column++, str); (TEXT("%d"), it->num); m_mText(i, column++, str); i++; }}库存添加窗⼝
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1689605160a269944.html
评论列表(0条)