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

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Apache Ignite缓存基本操作实例详解

《ApacheIgnite缓存基本操作实例详解》文章介绍了ApacheIgnite中IgniteCache的基本操作,涵盖缓存获取、动态创建、销毁、原子及条件更新、异步执行,强调线程池注意事项,避免... 目录一、获取缓存实例(Getting an Instance of a Cache)示例代码:二、动态

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试