MFC实现ini配置文件的读取

MFC实现 ini 配置文件的读取1

实现的功能:点击导入配置文件按钮可以在旁边编辑框中显示配置文件的路径,以及在下面的编辑框中显示配置文件的内容。

image

1. 显示配置文件内容的编辑框设置

对于显示配置文件内容的 Edit Contorl 编辑框的属性设置如下:

  • ID: IDC_INI_SHOW_EDIT
  • Auto HScroll、Auto VScroll、Horizontal Scroll、Vertical Scroll、Multiline、Read Only、Want Return均设置为True

以下是这些属性的含义:

  1. Auto HScroll(自动水平滚动):当文本内容宽度超出编辑框的可视区域时,是否自动显示水平滚动条。
  2. Auto VScroll(自动垂直滚动):当文本内容高度超出编辑框的可视区域时,是否自动显示垂直滚动条。
  3. Horizontal Scroll(水平滚动):是否允许用户手动水平滚动编辑框中的文本内容。
  4. Vertical Scroll(垂直滚动):是否允许用户手动垂直滚动编辑框中的文本内容。
  5. Multiline(多行):指定编辑框是否允许多行文本输入。如果启用了多行模式,编辑框可以显示多行文本,否则只能显示单行文本。
  6. Read Only(只读):指定编辑框是否为只读模式。如果启用了只读模式,用户无法修改编辑框中的文本内容。
  7. Want Return(想要回车):指定编辑框是否将回车键视为换行字符。如果启用了此选项,并且编辑框是多行的,则按下回车键会在文本中插入换行符。

image

2. 显示配置文件路径的设置

ID: IDC_INI_PATH_EDIT

image

3. 导入配置文件按钮的设置

ID: IDC_SHOW_INI_BUTTON

Caption: 导入配置文件

然后双击这个“导入配置文件”按钮跳转到 void CReadWriteiniDlg::OnBnClickedShowIniButton() 函数实现具体操作

void CReadWriteiniDlg::OnBnClickedShowIniButton()
{// TODO: 在此添加控件通知处理程序代码CString iniFilePath;	// 保存配置文件路径CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, _T("All Files(*.ini)|*.ini|所有文件(*.*)|*.*|"), NULL);if(dlg.DoModal()){iniFilePath = dlg.GetPathName();	// 获取配置文件完整路径并存储到 iniFilePath 变量中}SetDlgItemText(IDC_INI_PATH_EDIT, iniFilePath);		// 将 iniFilePath 保存的路径 显示到编辑框中// 打开 INI 文件以读取内容std::ifstream infile(iniFilePath);// 检查文件是否成功打开if (infile.is_open()) {// 创建一个缓冲区,用于存储文件内容std::ostringstream buffer;// 逐行读取文件内容std::string line;while(std::getline(infile, line)) {// 将每行内容添加到缓冲区,并在每行末尾添加换行符buffer << line << "\r\n";}// 关闭文件infile.close();// 将缓冲区中的内容转换为 CString 类型CString strIniContent(buffer.str().c_str());// 显示读取到的内容在编辑框中SetDlgItemText(IDC_INI_SHOW_EDIT, strIniContent);}}

MFC实现 ini 配置文件2

包含导入、查询、修改、显示、单/复选框的选择的功能

1. 页面显示

1.1 导入配置文件自动显示的页面

image

1.2 填写修改信息,以及改变复选框状态

image

image

1.3 点击显示按钮查看配置文件内容

image

1.4 点击刷新按钮清空信息,但不会清楚按钮的选择

image

2. 导入配置文件按钮事件处理函数

// 导入配置文件事件处理函数
void CREADINIDlg::OnBnClickedSelectFileButton()
{// TODO: 在此添加控件通知处理程序代码CString m_strFilePathName;CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All File(*.ini)|*.ini|所有文件(*.*)|*.*|"), NULL);if(dlg.DoModal()){m_strFilePathName = dlg.GetPathName();}SetDlgItemText(IDC_FILE_PATH_EDIT, m_strFilePathName);CREADINIDlg::OnBnClickedGetButton();
}

3. 查询按钮事件处理函数

// 读取配置文件
void CREADINIDlg::OnBnClickedGetButton()
{// TODO: 在此添加控件通知处理程序代码// 读取配置文件方式一:CFileFind finder;CString m_IniFile = _T("");GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowText(m_IniFile);BOOL ifFind = finder.FindFile(m_IniFile);if(!ifFind){AfxMessageBox(_T("没有该文件"));return;}CString str;GetPrivateProfileString(_T("MYSQL"), _T("HostName"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);SetDlgItemText(IDC_EDIT2, str);GetPrivateProfileString(_T("MYSQL"), _T("Port"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);SetDlgItemText(IDC_EDIT3, str);GetPrivateProfileString(_T("MYSQL"), _T("UserName"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);SetDlgItemText(IDC_EDIT4, str);GetPrivateProfileString(_T("MYSQL"), _T("PassWord"), _T(""), str.GetBuffer(MAX_PATH), MAX_PATH, m_IniFile);SetDlgItemText(IDC_EDIT5, str);// 读取配置文件方式二:GetCurrentDirectory(MAX_PATH, IniFile);wcscat_s(IniFile, _T("\\Config.ini"));m_select_1 = GetPrivateProfileInt(_T("Select"),_T("m_select_1"), 0, IniFile);m_select_2 = GetPrivateProfileInt(_T("Select"),_T("m_select_2"), 0, IniFile);m_select_3 = GetPrivateProfileInt(_T("Select"),_T("m_select_3"), 0, IniFile);m_check_1 = GetPrivateProfileInt(_T("Check"),_T("m_check_1"), 0, IniFile);m_check_2 = GetPrivateProfileInt(_T("Check"),_T("m_check_2"), 0, IniFile);m_check_3 = GetPrivateProfileInt(_T("Check"),_T("m_check_3"), 0, IniFile);m_check_4 = GetPrivateProfileInt(_T("Check"),_T("m_check_4"), 0, IniFile);m_check_5 = GetPrivateProfileInt(_T("Check"),_T("m_check_5"), 0, IniFile);m_check_6 = GetPrivateProfileInt(_T("Check"),_T("m_check_6"), 0, IniFile);UpdateData(FALSE);
}

4. 修改按钮事件处理函数

// 修改配置文件
void CREADINIDlg::OnBnClickedWriteButton()
{UpdateData(TRUE);	//	方式二才需要加上这句,方式一不用// TODO: 在此添加控件通知处理程序代码// 写入配置文件方式一:CString m_IniFile = _T("");GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowTextW(m_IniFile);CFile File;File.Open(m_IniFile, CFile::modeCreate | CFile::modeWrite, NULL);File.Close();CFileFind finder;BOOL ifFind = finder.FindFile(m_IniFile);if (!ifFind) {AfxMessageBox(_T("没有该文件"));return;}// 写入基本信息CString str = _T(""), StrTop = _T("MYSQL"), StrHostName = _T("HostName"), StrPort = _T("Port"), StrUserName = _T("UserName"), StrPassWord = _T("PassWord");GetDlgItemText(IDC_EDIT6, str);WritePrivateProfileStringW(StrTop, StrHostName, str, m_IniFile);GetDlgItemText(IDC_EDIT7, str);WritePrivateProfileStringW(StrTop, StrPort, str, m_IniFile);GetDlgItemText(IDC_EDIT8, str);WritePrivateProfileStringW(StrTop, StrUserName, str, m_IniFile);GetDlgItemText(IDC_EDIT9, str);WritePrivateProfileStringW(StrTop, StrPassWord, str, m_IniFile);// 写入配置文件方式二:GetCurrentDirectory(MAX_PATH, IniFile);wcscat_s(IniFile, _T("\\Config.ini"));WritePrivateProfileInt_2(_T("Select"), _T("m_select_1"), m_select_1, IniFile);WritePrivateProfileInt_2(_T("Select"), _T("m_select_2"), m_select_2, IniFile);WritePrivateProfileInt_2(_T("Select"), _T("m_select_3"), m_select_3, IniFile);WritePrivateProfileInt_2(_T("Check"), _T("m_check_1"), m_check_1, IniFile);WritePrivateProfileInt_2(_T("Check"), _T("m_check_2"), m_check_2, IniFile);WritePrivateProfileInt_2(_T("Check"), _T("m_check_3"), m_check_3, IniFile);WritePrivateProfileInt_2(_T("Check"), _T("m_check_4"), m_check_4, IniFile);WritePrivateProfileInt_2(_T("Check"), _T("m_check_5"), m_check_5, IniFile);WritePrivateProfileInt_2(_T("Check"), _T("m_check_6"), m_check_6, IniFile);// 弹出消息框提示修改完成AfxMessageBox(_T("配置文件修改完成!"));
}

5. 刷新按钮事件处理函数

void CREADINIDlg::OnBnClickedFlushButton()
{// TODO: 在此添加控件通知处理程序代码SetDlgItemText(IDC_EDIT2, _T(""));SetDlgItemText(IDC_EDIT3, _T(""));SetDlgItemText(IDC_EDIT4, _T(""));SetDlgItemText(IDC_EDIT5, _T(""));SetDlgItemText(IDC_EDIT6, _T(""));SetDlgItemText(IDC_EDIT7, _T(""));SetDlgItemText(IDC_EDIT8, _T(""));SetDlgItemText(IDC_EDIT9, _T(""));}

6. 显示按钮事件处理函数

void CREADINIDlg::OnBnClickedShowIniButton()
{CString IniFile = _T("");GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowTextW(IniFile);// 打开 INI 文件以读取内容std::ifstream infile(IniFile);if (infile.is_open()){std::ostringstream buffer;// 逐行读取文件内容std::string line;while(std::getline(infile, line)) {buffer << line << "\r\n";}infile.close();// 将缓冲区中的内容转换为 CString 类型CString strIniContent(buffer.str().c_str());// 显示读取到的内容在编辑框中//SetDlgItemText(IDC_CONTENT_EDIT, strIniContent);m_showContentDlg.SetIniContent(strIniContent);m_showContentDlg.DoModal();}
}

6.1 实现步骤

创建一个新的对话框类用于显示完整的 INI 文件内容。以下是实现这个功能的一种方法:

  1. 首先,在资源编辑器中创建一个新的对话框模板,可以命名为 IDD_SHOW_CONTENT_DIALOG,在这个对话框中添加一个多行编辑框控件(ID 设置为 IDC_CONTENT_EDIT)用于显示INI文件内容。

  2. 创建一个新的对话框类,比如 CShowContentDialog,作为刚刚创建的对话框模板的关联类。

  3. CShowContentDialog 类中添加一个成员变量用于存储INI文件的内容,比如 CString m_strIniContent;

    #pragma once
    // CShowContentDialog 对话框
    class CShowContentDialog : public CDialog
    {....
    private:CString m_strIniContent;
    };
    
  4. CShowContentDialog 类中添加一个成员函数,用于设置INI文件的内容,比如:

#pragma once
// 在 ShowContentDialog.h 头文件// CShowContentDialog 对话框class CShowContentDialog : public CDialog
{....
public:void SetIniContent(const CString& content){m_strIniContent = content;}BOOL OnInitDialog();
};
  1. OnInitDialog 函数中将 m_strIniContent 设置到编辑框控件中,以便在对话框初始化时显示INI文件的内容。
// 在 ShowContentDialog.cpp 文件中
BOOL CShowContentDialog::OnInitDialog()
{CDialog::OnInitDialog();SetDlgItemText(IDC_CONTENT_EDIT, m_strIniContent);return TRUE;
}
  1. 在主对话框类(即包含“显示内容”按钮的对话框)中,添加一个成员变量用于存储 CShowContentDialog 的实例,例如:
// READINIDlg.h : 头文件
#pragma once
#include "fstream"
#include "sstream"
#include "ShowContentDialog.h"// CREADINIDlg 对话框
class CREADINIDlg : public CDialog
{
private:CShowContentDialog m_showContentDlg;
};
  1. 在点击“显示内容”按钮的消息处理函数中,读取INI文件的内容,并将内容设置到 CShowContentDialog 实例中,然后显示该对话框,例如:
void CREADINIDlg::OnBnClickedShowIniButton()
{CString IniFile = _T("");GetDlgItem(IDC_FILE_PATH_EDIT)->GetWindowTextW(IniFile);// 打开 INI 文件以读取内容std::ifstream infile(IniFile);if (infile.is_open()){std::ostringstream buffer;// 逐行读取文件内容std::string line;while(std::getline(infile, line)) {buffer << line << "\r\n";}infile.close();// 将缓冲区中的内容转换为 CString 类型CString strIniContent(buffer.str().c_str());// 显示读取到的内容在编辑框中//SetDlgItemText(IDC_CONTENT_EDIT, strIniContent);m_showContentDlg.SetIniContent(strIniContent);m_showContentDlg.DoModal();}
}

这样,点击“显示内容”按钮时,就会弹出一个对话框,其中包含一个编辑框,显示 INI 文件的完整内容。

6.2 成员变量及函数

// READINIDlg.h : 头文件
//#pragma once
#include "fstream"
#include "sstream"
#include "ShowContentDialog.h"// CREADINIDlg 对话框
class CREADINIDlg : public CDialog
{。。。省略
public:。。。省略// 下面这两个才是自己写的afx_msg void ReadRadioCheckStatus(const CString& IniFile, const CString& sectionName, const CString& prefix, int count, UINT baseID);afx_msg BOOL WritePrivateProfileInt_2(TCHAR* AppName, TCHAR*keyName, UINT value, TCHAR* lpFileName);private:TCHAR IniFile[MAX_PATH];	// 方式二存储配置文件的路径int m_select_1;int m_select_2;int m_select_3;int m_check_1;int m_check_2;int m_check_3;int m_check_4;int m_check_5;int m_check_6;
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在Docker容器中部署LibreOffice:通过Dockerfile定制高效办公环境

随着容器技术的普及,Docker已成为快速部署和管理应用的首选工具。LibreOffice作为一款开源的办公套件,以其丰富的功能和兼容性受到许多企业和个人用户的青睐。将LibreOffice集成到Docker容器中,不仅便于跨平台部署,还能实现资源的隔离和管理,特别适合云环境下的文档处理服…

绘唐3怎么联系团长299矩阵反推模块使用说明

反推配置说明看这里:团长https://qvfbz6lhqnd.feishu.cn/wiki/D3YLwmIzmivZ7BkDij6coVcbn7W MJ配置说明 如上图 选择公有云,即可体验

Linux计划任务书以及定时任务的编写

一、程序可以通过两种方式执行&#xff1a; 手动执行利用调度任务&#xff0c;依据一定的条件自动执行 自动执行可通过一下两个命令来实现: &#xff08;1&#xff09;At &#xff08;单一工作调度&#xff09; &#xff08;2&#xff09;Cron &#xff08;循环工作调度&a…

JavaScript 中 ES6

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;JavaScript引入了一些新的语法和特性来支持面向对象编程&#xff08;OOP&#xff09;。下面是对ES6中面向对象编程的详细解释&#xff1a; 类&#xff08;Class&#xff09;&#xff1a; ES6引入了类的概念&#xf…

HTML实体编码

HTML实体编码是HTML中用来替换特殊字符的一种机制&#xff0c;以确保这些特殊字符在浏览器中能够正确显示 这些特殊字符在HTML中具有特定的含义&#xff0c;比如小于号“<”用来表示HTML标签的开始&#xff0c;大于号“>”用来表示HTML标签的结束&#xff0c;而引号可能…

求三个字符数组最大者(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <string.h>int main() {//初始化变量值&#xff1b;int i 0;char str[3][20];char string[20];//循环输入3个字符…

Selenium的四种部署方式

关于selenium 的部署&#xff0c;我在网上找了很多&#xff0c;基本上都没有提到或是说的比较清晰的。当时我一直有个困惑&#xff1a;测试的脚本代码&#xff0c;是放在跟浏览器同一台机器上呢&#xff0c;还是放在Application Server上&#xff1f; 在官方开发文档中&#x…

蛋糕购物商城

蛋糕购物商城 运行前附加数据库.mdf&#xff08;或使用sql生成数据库&#xff09; 登陆账号&#xff1a;admin 密码&#xff1a;123456 修改专辑价格时去掉&#xffe5;以及上传专辑图片 c#_asp.net 蛋糕购物商城 网上商城 三层架构 在线购物网站&#xff0c;电子商务系统 …

Kubernetes中文件挂载的四种方式

一. Kubernetes入门 1.1 Kubernetes创建POD过程 1.2. Kubernetes基本操作 命令说明用法create创建kubectl create -f xx.yamledit编辑kubectl edit svc [POD的service名称]get获取kubectl get pod --namespaceXXXpatch更新kubectl patch -f xx.yamldelete删除kubectl delete …

Golang基础8-go语言依赖管理

go语言依赖管理 探索 GO 项目依赖包管理与Go Module常规操作 - 知乎 https://juejin.cn/post/7054513615625256996 演进过程&#xff1a; GOPATH机制 早期引入GOPATH机制&#xff0c;Go 编译器可以在本地 GOPATH 环境变量配置的路径下&#xff0c;搜寻 Go 程序依赖的第三方…

探索前端开发新利器:MFSU

在前端开发领域&#xff0c;随着项目规模的不断扩大和对性能优化需求的日益增长&#xff0c;开发者们一直在寻找更高效、更智能的构建工具。其中&#xff0c;MFSU&#xff08;Module Federation for Super Ultra Fast&#xff09;作为一种新兴的前端构建加速方案&#xff0c;以…

AWTK 开源串口屏开发(17) - 通过 MODBUS 访问数组数据

在 AWTK 串口屏中&#xff0c;内置了 MODBUS Client Channel 的模型&#xff0c;不用编写代码即可实现在 ListView 中显示数组数据。 MODBUS 协议一次只能读取 125 个 WORD&#xff0c;AWTK-MODBUS Client Channel 支持长数据&#xff0c;自动分成多个请求访问。 1. 功能 不用…

JWT介绍和使用

JWT介绍和使用 JWT介绍 JWT(JSON Web Token)是一个开放的标准&#xff08;RFC 7519&#xff09;&#xff0c;JWT定义了一种简介的、自包含的协议格式。可以用于在通信的双方传递json对象&#xff0c;传递的信息可以被信任&#xff0c;因为信息是被数字签名的。JWT可以使用HMA…

解决python3.10以上pyqt6-tools无法安装问题

情景描述 原本3.9版本python用的好好地&#xff0c;最新的一个自动化库要求必须要3.10以上才能使用。 火急火燎更新3.12版本python&#xff0c;结果安装qt-tools丫的安装不了了。 问题出现原因 python的pyqt-tools他不支持3.10以上的python版本下载。 如果想用pip下载得py…

【后端】Thymeleaf模板引擎学习笔记

文章目录 1. java体系模板引擎介绍2. 使用2.1 初步使用2.2. 引用静态资源模板2.3 引用静态资源模板(配置资源路径和后缀)2.4 整合springboot 视频地址 1. java体系模板引擎介绍 FreeMarkerThymeleafVelocity 2. 使用 2.1 初步使用 引入依赖 <dependency><groupId>…

C++学习随笔(11)——vector

本章我们来学习一下vector&#xff01; 目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vector 增删查改 1.2.5 vector 迭代器失效问题。 1.vector的介绍及使用 1…

selenium 自动化测试课上实操指南2——乐视tv搜索

如果完成了实操1的同学&#xff0c;环境搭建已经ok&#xff0c;环境还没有好的同学请参考 实操1_百度搜索 为了大家顺利&#xff0c;我们还想按照实操1那样&#xff0c;先导入一个基本项目。在次基础上进行代码编写、 我们一起写写看。 1.打开乐视视频网页并最大化 如下图所…

三款数据可视化工具深度解析:Tableau、ECharts与山海鲸可视化

在数字化时代&#xff0c;数据可视化工具成为了企业和个人进行数据分析和决策的重要助手。市面上众多数据可视化工具各具特色&#xff0c;本文将为您介绍三款热门的数据可视化工具&#xff0c;帮助您更好地理解和利用数据。 首先&#xff0c;让我们来认识Tableau。Tableau是一款…

matlab学习006-使用matlab绘出系统的冲激响应和阶跃响应波形并求其冲激响应的数值解

目录 题目 1&#xff0c;绘出系统的冲激响应和阶跃响应波形 1&#xff09;基础 2&#xff09;效果 3&#xff09;代码 2&#xff0c;求出t0.5s,1s,1.5s,2s时系统冲激响应的数值解。 1&#xff09;基础 2&#xff09;效果 ​☀ 3&#xff09;代码 题目 已知描述某连续系…

react之渲染与props

第一章描述用户界面 将Props 传递给组件 React 组件使用 props 来互相通信。每个父组件都可以提供 props 给它的子组件&#xff0c;从而将一些信息传递给它。Props 可能会让你想起 HTML 属性&#xff0c;但你可以通过它们传递任何 JavaScript 值&#xff0c;包括对象、数组和…