MFC工控项目实例之六CFile添加菜单栏

2024-08-26 09:20

本文主要是介绍MFC工控项目实例之六CFile添加菜单栏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本程序基于前期我的博客文章《MFC工控项目实例之五CFile类读写系统参数》
添加两个对话框如下
在这里插入图片描述
在这里插入图片描述

具体添加菜单栏参考我的博客文章MFC_ CFile类实现下拉菜单读写实例(源码下载)

这里给出相关代码
在 SEAL_PRESSURE.h文件中添加

#include <afxtempl.h>
...
class CProductPara
{
public:union{struct{char	m_strTypeName[24];char	m_strBrand[24];			char	m_strRemark[64];};char len[1024];};
};
class CSEAL_PRESSUREApp : public CWinApp
{
public:...int m_nProductSel;CArray<CProductPara,CProductPara> m_allPara;CString	m_strWorkPath,m_strCurDataPath,m_strDataPath;CString m_strControlCFGFileName;CString	m_strTypeCFGFileName;void LoadTypeCFG(void);void SaveTypeCFG(void);...

在 SEAL_PRESSUREDlg.h文件中添加

class CSEAL_PRESSUREDlg : public CDialog
{
// Construction
public:...CMenu m_menuType;int m_nProductSel;int m_nTypeIndex;CArray<CProductPara,CProductPara> m_allPara;CString	m_strWorkPath;CString m_strControlCFGFileName;CString	m_strTypeCFGFileName;CBitmap m_bmSel,m_bmList;void OnTypeChange(UINT nID);void UpdateButton(void);...}

在TypDlg.h文件中添加

class CTypDlg : public CDialog
{
// Construction
public:CProductPara * m_pPara;BOOL UpdatePara(BOOL);CTypDlg(CWnd* pParent = NULL);   // standard constructorCMenu m_menuType;int m_nProductSel;int m_nTypeIndex;
// Dialog Data//{{AFX_DATA(CTypDlg)enum { IDD = IDD_TYP_CHOICE };CListCtrl	m_ctrlType;//}}AFX_DATA// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CTypDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support//}}AFX_VIRTUAL// Implementation
protected:// Generated message map functions//{{AFX_MSG(CTypDlg)virtual BOOL OnInitDialog();afx_msg void OnButton1();afx_msg void OnButton2();//}}AFX_MSGDECLARE_MESSAGE_MAP()
};

在TypData.h文件中添加

class CTypData : public CDialog
{
// Construction
public:CProductPara * m_pPara;BOOL UpdatePara(BOOL);CTypData(CWnd* pParent = NULL);   // standard constructor// Dialog Data//{{AFX_DATA(CTypData)enum { IDD = IDD_TYP_DATA };CString	m_strTypeName;CString	m_strBrand;CString	m_strRemark;// NOTE: the ClassWizard will add data members here//}}AFX_DATA// Overrides// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CTypData)protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support//}}AFX_VIRTUAL// Implementation
protected:// Generated message map functions//{{AFX_MSG(CTypData)virtual BOOL OnInitDialog();virtual void OnOK();// NOTE: the ClassWizard will add member functions here//}}AFX_MSGDECLARE_MESSAGE_MAP()
};

TypDlg.cpp文件中代码

// TypDlg.cpp : implementation file
//#include "stdafx.h"
#include "SEAL_PRESSURE.h"#include "TypDlg.h"
#include "TypData.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CTypDlg dialogCTypDlg::CTypDlg(CWnd* pParent /*=NULL*/): CDialog(CTypDlg::IDD, pParent)
{//{{AFX_DATA_INIT(CTypDlg)// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT
}void CTypDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTypDlg)DDX_Control(pDX, IDC_LIST1, m_ctrlType);//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CTypDlg, CDialog)//{{AFX_MSG_MAP(CTypDlg)ON_BN_CLICKED(IDC_BUTTON1, OnButton1)//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CTypDlg message handlersBOOL CTypDlg::OnInitDialog() 
{CDialog::OnInitDialog();DWORD dwExStyles = m_ctrlType.GetExtendedStyle();m_ctrlType.SetExtendedStyle(dwExStyles |LVS_EX_GRIDLINES |LVS_EX_FULLROWSELECT | LVS_EX_FLATSB |LVS_EX_ONECLICKACTIVATE);LVCOLUMN cloumn;int i;cloumn.mask = LVCF_TEXT|LVCF_WIDTH;cloumn.pszText = "型号名称";cloumn.cx = 90;i = m_ctrlType.InsertColumn(0,&cloumn);cloumn.mask = LVCF_TEXT|LVCF_WIDTH;cloumn.pszText = "产品商标";cloumn.cx = 90;i = m_ctrlType.InsertColumn(1,&cloumn);cloumn.pszText = "      备        注";cloumn.cx = 160;i = m_ctrlType.InsertColumn(2,&cloumn);int nItem;LV_ITEM item;item.mask = LVIF_TEXT|LVIF_IMAGE;char buf[255];for(i = 0; i < theApp.m_allPara.GetSize() ; i ++){nItem = m_ctrlType.GetItemCount();item.iItem = nItem;item.iSubItem = 0;sprintf(buf,"%s",theApp.m_allPara[i].m_strTypeName);item.pszText = buf;item.iImage = 0;m_ctrlType.InsertItem(&item);item.iSubItem = 1;sprintf(buf,"%s",theApp.m_allPara[i].m_strBrand);item.pszText = buf;m_ctrlType.SetItem(&item);item.iSubItem = 2;sprintf(buf,"%s",theApp.m_allPara[i].m_strRemark);item.pszText = buf;m_ctrlType.SetItem(&item);}ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog.  The framework does this automatically//  when the application's main window is not a dialog// TODO: Add extra initialization herereturn TRUE;  // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE
}void CTypDlg::OnButton1() 
{// TODO: Add your control notification handler code hereCTypData dlg;CProductPara paraBuf;	memset(&paraBuf,0,sizeof(CProductPara));dlg.m_pPara = &paraBuf;if(dlg.DoModal() == IDOK){int nItem;if(m_nTypeIndex > -1)nItem = m_nTypeIndex + 1;elsenItem = theApp.m_allPara.GetSize();theApp.m_allPara.InsertAt(nItem,paraBuf);LV_ITEM item;item.mask = LVIF_TEXT;item.iItem = nItem;item.iSubItem = 0;item.pszText = theApp.m_allPara[nItem].m_strTypeName;item.iImage = 0;m_ctrlType.InsertItem(&item);item.iSubItem = 1;item.pszText = theApp.m_allPara[nItem].m_strBrand;m_ctrlType.SetItem(&item);item.iSubItem = 2;item.pszText = theApp.m_allPara[nItem].m_strRemark;m_ctrlType.SetItem(&item);}	
}

TypData.cpp文件中代码

// TypData.cpp : implementation file
//#include "stdafx.h"
#include "SEAL_PRESSURE.h"
#include "TypData.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CTypData dialogCTypData::CTypData(CWnd* pParent /*=NULL*/): CDialog(CTypData::IDD, pParent)
{//{{AFX_DATA_INIT(CTypData)m_strTypeName = _T("");m_strBrand = _T("");m_strRemark = _T("");// NOTE: the ClassWizard will add member initialization here//}}AFX_DATA_INIT
}void CTypData::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CTypData)DDX_Text(pDX, IDC_EDIT1, m_strTypeName);DDX_Text(pDX, IDC_EDIT2, m_strBrand);DDX_Text(pDX, IDC_EDIT3, m_strRemark);// NOTE: the ClassWizard will add DDX and DDV calls here//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CTypData, CDialog)//{{AFX_MSG_MAP(CTypData)// NOTE: the ClassWizard will add message map macros here//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CTypData message handlers
BOOL CTypData::OnInitDialog() 
{CDialog::OnInitDialog();UpdatePara(FALSE);
//	UpdatePara(1);return TRUE;  // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE
}BOOL CTypData::UpdatePara(BOOL bUpdate)
{if(m_pPara == NULL)return TRUE;if(bUpdate){if(!UpdateData())return FALSE;sprintf(m_pPara->m_strTypeName,"%s", m_strTypeName);sprintf(m_pPara->m_strRemark,"%s", m_strRemark);sprintf(m_pPara->m_strBrand,"%s", m_strBrand);}else{m_strTypeName = m_pPara->m_strTypeName;m_strRemark = m_pPara->m_strRemark;m_strBrand = m_pPara->m_strBrand;UpdateData(FALSE);}return TRUE;
}void CTypData::OnOK() 
{// TODO: Add extra validation hereif(!UpdatePara(TRUE))return;CDialog::OnOK();UpdateData(TRUE);
}

SEAL_PRESSURE.cpp文件代码

// SEAL_PRESSURE.cpp : Defines the class behaviors for the application.
//#include "stdafx.h"
#include "SEAL_PRESSURE.h"
#include "SEAL_PRESSUREDlg.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/
// CSEAL_PRESSUREAppBEGIN_MESSAGE_MAP(CSEAL_PRESSUREApp, CWinApp)//{{AFX_MSG_MAP(CSEAL_PRESSUREApp)// NOTE - the ClassWizard will add and remove mapping macros here.//    DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSGON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()/
// CSEAL_PRESSUREApp constructionCSEAL_PRESSUREApp::CSEAL_PRESSUREApp()
{// TODO: add construction code here,// Place all significant initialization in InitInstanceTCHAR exeFullPath[MAX_PATH];GetModuleFileName(NULL,exeFullPath,MAX_PATH);m_Path = exeFullPath;for(int i = m_Path.GetLength() - 1; i > 0 ; i --){if(m_Path.GetAt(i) == '\\')break;}SetCurrentDirectory(m_Path);m_Path = m_Path.Left(i);m_DataPath = m_Path + "\\DATA\\";m_TempPath = m_Path + "\\TEMP\\";m_LibPath = m_Path + "\\LIB\\";	CreateDirectory(m_LibPath,FALSE);CreateDirectory(m_DataPath,FALSE);CreateDirectory(m_TempPath,FALSE);m_CFGFileName = m_Path + "\\CFG.PAR";m_strTypeCFGFileName = m_Path + "\\TYPE.CFG";m_strDataPath = m_Path + "\\DATA\\";CreateDirectory(m_strDataPath,FALSE);}/
// The one and only CSEAL_PRESSUREApp objectCSEAL_PRESSUREApp theApp;/
// CSEAL_PRESSUREApp initializationBOOL CSEAL_PRESSUREApp::InitInstance()
{AfxEnableControlContainer();// Standard initialization// If you are not using these features and wish to reduce the size//  of your final executable, you should remove from the following//  the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls();			// Call this when using MFC in a shared DLL
#elseEnable3dControlsStatic();	// Call this when linking to MFC statically
#endifLoadCFGFile();LoadTypeCFG();CSEAL_PRESSUREDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse == IDOK){// TODO: Place code here to handle when the dialog is//  dismissed with OK}else if (nResponse == IDCANCEL){// TODO: Place code here to handle when the dialog is//  dismissed with Cancel}// Since the dialog has been closed, return FALSE so that we exit the//  application, rather than start the application's message pump.SaveCFGFile();SaveTypeCFG();return FALSE;
}void CSEAL_PRESSUREApp::LoadCFGFile()
{CFile file;if(file.Open(m_CFGFileName,CFile::modeRead)){if(!file.Read(&m_sys_data,sizeof(m_sys_data))){memset(&m_sys_data,0,sizeof(m_sys_data));}file.Close();}else{memset(&m_sys_data,0,sizeof(m_sys_data));}
}void CSEAL_PRESSUREApp::SaveCFGFile()
{CFile file;if(file.Open(m_CFGFileName,CFile::modeCreate|CFile::modeWrite)){file.Write(&m_sys_data,sizeof(m_sys_data));file.Close();}
}void CSEAL_PRESSUREApp::SaveTypeCFG()
{CFile file;CProductPara paraBuf;file.Open(m_strTypeCFGFileName,CFile::modeCreate|CFile::modeWrite);for(int i = 0 ; i < theApp.m_allPara.GetSize() ; i ++){paraBuf = m_allPara[i];file.Write(&paraBuf,sizeof(m_allPara[i]));}file.Close();
}void CSEAL_PRESSUREApp::LoadTypeCFG()
{
CFile file;int nProductCount = 0;CProductPara paraBuf;if(file.Open(m_strTypeCFGFileName,CFile::modeRead)){nProductCount = file.GetLength() / sizeof(CProductPara);for(int i = 0 ; i < nProductCount ; i ++){file.Read(&paraBuf,sizeof(m_allPara[i]));m_allPara.Add(paraBuf);}file.Close();}if(nProductCount ==0){memset(&paraBuf,0,sizeof(CProductPara));strcpy(paraBuf.m_strTypeName,"默认值");strcpy(paraBuf.m_strRemark,"默认值");strcpy(paraBuf.m_strBrand,"默认值");m_allPara.Add(paraBuf);}
}

在SEAL_PRESSUREDlg.cpp文件中添加


BOOL CSEAL_PRESSUREDlg::OnInitDialog()
{CDialog::OnInitDialog();...m_menuType.LoadMenu(IDR_MENU1);	return TRUE;  // return TRUE  unless you set the focus to a control
}
void CSEAL_PRESSUREDlg::OnTypChoice() 
{// TODO: Add your control notification handler code here
//	CTypDlg dlg;
//	dlg.DoModal();int	m_nActivePlace = 0;
int	ID_DEF_PRODUCT =5000;CRect rect;GetDlgItem(IDC_TYP_CHOICE)->GetWindowRect(&rect);while(m_menuType.GetSubMenu(0)->GetMenuItemCount() >2){m_menuType.GetSubMenu(0)->RemoveMenu(2,MF_BYPOSITION);}for(int i = 0 ; i < theApp.m_allPara.GetSize() -1; i ++){CString str;if(strlen(theApp.m_allPara[i + 1].m_strBrand) > 0)str.Format("%s(%s)",theApp.m_allPara[i + 1].m_strTypeName,theApp.m_allPara[i + 1].m_strBrand);elsestr.Format("%s",theApp.m_allPara[i + 1].m_strTypeName,theApp.m_allPara[i + 1].m_strBrand);m_menuType.GetSubMenu(0)->AppendMenu(MF_STRING,ID_DEF_PRODUCT + i,str);}if(theApp.m_nProductSel > 0)m_menuType.GetSubMenu(0)->CheckMenuItem(2 + theApp.m_nProductSel - 1,MF_CHECKED|MF_BYPOSITION);m_menuType.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,rect.left,rect.bottom,this);
}

这篇关于MFC工控项目实例之六CFile添加菜单栏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1108165

相关文章

将Java项目提交到云服务器的流程步骤

《将Java项目提交到云服务器的流程步骤》所谓将项目提交到云服务器即将你的项目打成一个jar包然后提交到云服务器即可,因此我们需要准备服务器环境为:Linux+JDK+MariDB(MySQL)+Gi... 目录1. 安装 jdk1.1 查看 jdk 版本1.2 下载 jdk2. 安装 mariadb(my

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

springboot security验证码的登录实例

《springbootsecurity验证码的登录实例》:本文主要介绍springbootsecurity验证码的登录实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录前言代码示例引入依赖定义验证码生成器定义获取验证码及认证接口测试获取验证码登录总结前言在spring

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加