当前位置: 首页 > news >正文

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);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 软件测试工程师必须了解的B/S架构及其测试要点
  • 8.3 数据库基础技术-关系代数
  • 加州大学圣地亚哥分校 沉浸式遥操作机器人系统
  • [GKCTF 2021]excel 骚操作1
  • shadertoy sdSegment 原理
  • 工厂现场多功能帮手,三防平板改善管理体验
  • 简化登录流程,助力应用建立用户体系
  • 计算机视觉概念科普
  • linux 安装kafaka单体服务
  • OD C卷 - Wonderland游乐园
  • 【第57课】SSRF服务端请求Gopher伪协议无回显利用黑白盒挖掘业务功能点
  • Maven的使用
  • 多线程面试常问
  • MarkDown演示
  • 【PostgreSQL教程】PostgreSQL 高级篇之触发器
  • JavaScript-如何实现克隆(clone)函数
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JAVA SE 6 GC调优笔记
  • JS变量作用域
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux链接文件
  • Median of Two Sorted Arrays
  • Next.js之基础概念(二)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python 基础起步 (十) 什么叫函数?
  • Python语法速览与机器学习开发环境搭建
  • webgl (原生)基础入门指南【一】
  • 构造函数(constructor)与原型链(prototype)关系
  • 如何设计一个微型分布式架构?
  • 使用Gradle第一次构建Java程序
  • 正则与JS中的正则
  • ​低代码平台的核心价值与优势
  • ​力扣解法汇总946-验证栈序列
  • # wps必须要登录激活才能使用吗?
  • #{}和${}的区别?
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (Charles)如何抓取手机http的报文
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第一天)包装对象、作用域、创建对象
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (六)软件测试分工
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • **CI中自动类加载的用法总结
  • .JPG图片,各种压缩率下的文件尺寸
  • .net core控制台应用程序初识
  • .NET 给NuGet包添加Readme
  • .net中的Queue和Stack
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [《百万宝贝》观后]To be or not to be?
  • [AHK V2]鼠标悬停展开窗口,鼠标离开折叠窗口