沂水做网站,营销网站建设方案,注册公司流程图片,广告设计公司经营范围免责声明#xff1a;内容仅供学习参考#xff0c;请合法利用知识#xff0c;禁止进行违法犯罪活动#xff01;
如果看不懂、不知道现在做的什么#xff0c;那就跟着做完看效果
内容参考于#xff1a;易道云信息技术研究院VIP课
上一个内容#xff1a;21.配置数据保存…免责声明内容仅供学习参考请合法利用知识禁止进行违法犯罪活动
如果看不懂、不知道现在做的什么那就跟着做完看效果
内容参考于易道云信息技术研究院VIP课
上一个内容21.配置数据保存到文件
码云地址master 分支https://gitee.com/dye_your_fingers/titan
码云版本号5e80379a594a83df9e19753b8a29c634536d7e99
代码下载地址在 titan 目录下文件名为titan-加载配置文件到分析工具界面.zip 链接https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg 提取码q9n5 --来自百度网盘超级会员V4的分享 HOOK引擎文件名为黑兔sdk升级版.zip 链接https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw 提取码78h8 --来自百度网盘超级会员V4的分享 以 21.配置数据保存到文件 它的代码为基础进行修改
换了个电脑这里的配置信息与之前的不一样用下图中的内容或者用上一个内容里面配置内容都可以其它的也可以为了跟节奏最好一模一样 首先把数据分析器项目配置窗口的退出按钮改成加载 然后双击添加点击事件处理函数 由于把退出按钮改成了加载这导致了点击窗口右上角的X关不掉窗口点击之后会弹出选择文件对话框为了解决这个问题要添加一个消息事件处理如下图给窗口添加一个WM_CLOSE消息 代码下面有完整的代码百度网盘有整个项目完整的代码 CSet.cpp文件的修改修改了 OnBnClickedCancel函数新加了 OnClose函数
// CSet.cpp: 实现文件
//#include pch.h
#include DataAnly.h
#include CSet.h
#include afxdialogex.h
#include extern_all.h// CSet 对话框IMPLEMENT_DYNAMIC(CSet, CDialogEx)CSet::CSet(CWnd* pParent /*nullptr*/): CDialogEx(IDD_SET, pParent), txtName(_T()), txtTitle(_T())
{}CSet::~CSet()
{
}void CSet::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, lstMsgType);DDX_Control(pDX, IDC_LIST2, lstDataType);DDX_Text(pDX, IDC_EDIT1, txtName);DDX_Text(pDX, IDC_EDIT2, txtTitle);
}BOOL CSet::OnInitDialog()
{CDialogEx::OnInitDialog();SetListView(lstMsgType);SetListView(lstDataType);lstMsgType.InsertColumn(0, L名称, 0, 100);lstMsgType.InsertColumn(1, L宏定义, 0, 100);lstMsgType.InsertColumn(2, L类型, 0, 100); // 数据和文本文本直接显示数据有点复杂看之后实现位置lstMsgType.InsertColumn(3, L输出到文件, 0, 100);lstDataType.InsertColumn(0, L消息类型, 0, 100);lstDataType.InsertColumn(1, L编号, 0, 100);lstDataType.InsertColumn(2, L名称, 0, 100);lstDataType.InsertColumn(3, L背景颜色, 0, 100);lstDataType.InsertColumn(4, L字体颜色, 0, 100);lstDataType.InsertColumn(5, L显示, 0, 100);lstDataType.InsertColumn(6, L输出, 0, 100);lstDataType.InsertColumn(7, L单独输出, 0, 100);return TRUE;
}BEGIN_MESSAGE_MAP(CSet, CDialogEx)ON_BN_CLICKED(IDOK, CSet::OnBnClickedOk)ON_BN_CLICKED(IDCANCEL, CSet::OnBnClickedCancel)ON_NOTIFY(NM_RCLICK, IDC_LIST1, CSet::OnNMRClickList1)ON_NOTIFY(NM_RCLICK, IDC_LIST2, CSet::OnNMRClickList2)ON_COMMAND(ID_32771, CSet::OnAddMsgType)ON_COMMAND(ID_32772, CSet::OnSetMsg)ON_COMMAND(ID_32773, CSet::OnDelMsg)ON_COMMAND(ID_32777, CSet::OnAddDataType)ON_COMMAND(ID_32775, CSet::OnSetDataType)ON_COMMAND(ID_32776, CSet::OnDelData)ON_WM_CLOSE()
END_MESSAGE_MAP()// CSet 消息处理程序// 保存按钮点击事件处理函数
void CSet::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码// CDialogEx::OnOK();UpdateData(TRUE);int icount lstMsgType.GetItemCount();if (txtName L) {return;}CString inifile ConfigPath txtName .ini;CString txt;CString App;CString _Name;CString AppData;txt.Format(L%d, icount);/*.ini是微软搞的配置文件Windows系统配置文件所采用的结构存储格式.ini文件它有结构详细的结构看当前程序给生成的.ini文件内容WritePrivateProfileString是用来给.ini文件写数据的WritePrivateProfileString它是给.ini文件写一个字符串*/WritePrivateProfileString(Lmain, Lcount, txt, inifile);WritePrivateProfileString(Lmain, Ltitle, txtTitle, inifile);for (int i 0; i icount; i){_Name lstMsgType.GetItemText(i, 0);App.Format(LMessage_%d, i);// 消息定义列表的名称列的内容WritePrivateProfileString(App, Lname, _Name, inifile);// 消息定义列表的宏定义列的内容WritePrivateProfileString(App, Ldefine, lstMsgType.GetItemText(i, 1), inifile);// 消息定义列表的类型列的内容WritePrivateProfileString(App, Ltype, lstMsgType.GetItemText(i, 2), inifile);// 消息定义列表的输出到文件列的内容WritePrivateProfileString(App, Listxt, lstMsgType.GetItemText(i, 3), inifile);int datacount 0;for (int j 0; j lstDataType.GetItemCount(); j){if (lstDataType.GetItemText(j, 0) _Name) {AppData.Format(L%s_%d, _Name, datacount);// 数据定义列表的编号列的内容 WritePrivateProfileString(AppData, Lid, lstDataType.GetItemText(j,1), inifile);// 数据定义列表的名称列的内容 WritePrivateProfileString(AppData, Lname, lstDataType.GetItemText(j,2), inifile);// 数据定义列表的背景颜色列的内容 WritePrivateProfileString(AppData, Lbackcolor, lstDataType.GetItemText(j,3), inifile);// 数据定义列表的字体颜色列的内容 WritePrivateProfileString(AppData, Lfontcolor, lstDataType.GetItemText(j,4), inifile);// 数据定义列表的显示列的内容 WritePrivateProfileString(AppData, Lisui, lstDataType.GetItemText(j,5), inifile);// 数据定义列表的输出列的内容 WritePrivateProfileString(AppData, Listxt, lstDataType.GetItemText(j,6), inifile);// 数据定义列表的单独输出列的内容 WritePrivateProfileString(AppData, Listxtalone, lstDataType.GetItemText(j,7), inifile);}}txt.Format(L%d, datacount);WritePrivateProfileString(App, Lcount, txt, inifile);}
}void CSet::OnBnClickedCancel()
{// CDialogEx::OnCancel();// 声明一个文件选择对话框里的筛选TCHAR szFilters[] _T(数据分析配置*.ini|*.ini||);// 创建一个文件选择对话框CFileDialog dialog(TRUE, NULL, NULL, 6, szFilters);// 设置文件选择对话框打开之后默认地址dialog.m_ofn.lpstrInitialDir ConfigPath;if (dialog.DoModal() IDOK) {lstDataType.DeleteAllItems(); // 清空数据定义列表lstMsgType.DeleteAllItems(); // 清空消息定义列表// 获取选择的文件的目录获取的是绝对路径CString inifile dialog.GetPathName();// 获取选择的文件的文件名txtName dialog.GetFileTitle();/*从配置文件中读取一个数据意思是从main下的count读取一个数字int类型的数字GetPrivateProfileInt用来获取.ini文件里的内容最后的Int表示读取的数据类型Int就表示读取int类型String表示读取String类型也就是一个字符串GetPrivateProfileString(Lmain, Ltitle, L, buff, 0xFF, inifile);里的L是默认值GetPrivateProfileInt(Lmain, Lcount, 0, inifile);里的0是默认值默认值的意思如果读取不到数据就把默认值返回给我们*/int icount GetPrivateProfileInt(Lmain, Lcount, 0, inifile);wchar_t buff[0xFF];GetPrivateProfileString(Lmain, Ltitle, L, buff, 0xFF, inifile);txtTitle buff;/*CString App;CString AppData;CString _Name;它是用来初始化字符串的利用 Foramt 函数把从.ini文件里获取的数据全部转成字符串*/CString App;CString AppData;CString _Name;for (int i 0; i icount; i){App.Format(LMessage_%d, i);GetPrivateProfileString(App, Lname, L, buff, 0xFF, inifile);_Name.Format(L%s,buff);lstMsgType.InsertItem(i, buff);GetPrivateProfileString(App, Ldefine, L, buff, 0xFF, inifile);lstMsgType.SetItemText(i, 1, buff);GetPrivateProfileString(App, Ltype, L, buff, 0xFF, inifile);lstMsgType.SetItemText(i, 2, buff);GetPrivateProfileString(App, Listxt, L, buff, 0xFF, inifile);lstMsgType.SetItemText(i, 3, buff);int lcount GetPrivateProfileInt(App, Lcount,0, inifile);int datacount lstDataType.GetItemCount();for (int j 0; j lcount; j){AppData.Format(L%s_%d, _Name.GetBuffer(),j);lstDataType.InsertItem(datacount, _Name);GetPrivateProfileString(AppData, Lid, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 1, buff);GetPrivateProfileString(AppData, Lname, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 2, buff);GetPrivateProfileString(AppData, Lbackcolor, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 3, buff);GetPrivateProfileString(AppData, Lfontcolor, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 4, buff);GetPrivateProfileString(AppData, Lisui, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 5, buff);GetPrivateProfileString(AppData, Listxt, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 6, buff);GetPrivateProfileString(AppData, Listxtalone, L0, buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 7, buff);}}UpdateData(FALSE);}
}void CSet::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE p reinterpret_castLPNMITEMACTIVATE(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult 0;nMsgSel p-iItem;/*GetMessagePos函数可以获取光标位置返回值低16位是x高16位是y*/DWORD dwPos GetMessagePos();CPoint point(LOWORD(dwPos), HIWORD(dwPos));CMenu menu;menu.LoadMenuW(IDR_MENU1);// 根据菜单窗口id获取一个菜单窗口对象CMenu* pop menu.GetSubMenu(0);// 获取第一个菜单也就是现在的消息设置这个菜单// 在指定位置显示浮动弹出菜单并跟踪弹出菜单上项的选择情况。pop-TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
}void CSet::OnNMRClickList2(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE p reinterpret_castLPNMITEMACTIVATE(pNMHDR);// TODO: 在此添加控件通知处理程序代码*pResult 0;nDataSel p-iItem;/*GetMessagePos函数可以获取光标位置返回值低16位是x高16位是y
*/DWORD dwPos GetMessagePos();CPoint point(LOWORD(dwPos), HIWORD(dwPos));CMenu menu;menu.LoadMenuW(IDR_MENU1);// 根据菜单窗口id获取一个菜单窗口对象CMenu* pop menu.GetSubMenu(1);// 获取第一个菜单也就是现在的消息设置这个菜单// 在指定位置显示浮动弹出菜单并跟踪弹出菜单上项的选择情况。pop-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
}void CSet::OnAddMsgType()
{if (wndMsgSet.DoModal() IDOK) {int icount lstMsgType.GetItemCount();for (int i 0; i icount; i){if (lstMsgType.GetItemText(i, 0) wndMsgSet.txtName) {AfxMessageBox(L消息名已存在);return;}if (lstMsgType.GetItemText(i, 1) wndMsgSet.txtDefine) {AfxMessageBox(L宏定义已存在);return;}}lstMsgType.InsertItem(icount, wndMsgSet.txtName);lstMsgType.SetItemText(icount, 1, wndMsgSet.txtDefine);lstMsgType.SetItemText(icount, 2, wndMsgSet.txtTypeName);lstMsgType.SetItemText(icount, 3, txtBool[wndMsgSet.IsTxt]);}
}void CSet::OnSetMsg()
{if (nMsgSel -1) {wndMsgSet.SetDatas(lstMsgType.GetItemText(nMsgSel, 0), lstMsgType.GetItemText(nMsgSel, 1), lstMsgType.GetItemText(nMsgSel, 2), lstMsgType.GetItemText(nMsgSel, 3)L是);if (wndMsgSet.DoModal() IDOK) {int icount lstMsgType.GetItemCount();for (int i 0; i icount; i){if (lstMsgType.GetItemText(i, 0) wndMsgSet.txtName) {if (i ! nMsgSel) {AfxMessageBox(L消息名已存在);return;}}if (lstMsgType.GetItemText(i, 1) wndMsgSet.txtDefine) {if (i ! nMsgSel) {AfxMessageBox(L宏定义已存在);return;}}}lstMsgType.SetItemText(nMsgSel, 0, wndMsgSet.txtName);lstMsgType.SetItemText(nMsgSel, 1, wndMsgSet.txtDefine);lstMsgType.SetItemText(nMsgSel, 2, wndMsgSet.txtTypeName);lstMsgType.SetItemText(nMsgSel, 3, txtBool[wndMsgSet.IsTxt]);}}
}void CSet::OnDelMsg()
{if (nMsgSel -1) {lstMsgType.DeleteItem(nMsgSel);}
}void CSet::OnAddDataType()
{if (nMsgSel -1) {// 给消息数据窗口里消息名称输入框赋值wndDataSet.txtName lstMsgType.GetItemText(nMsgSel, 0);if (wndDataSet.DoModal() IDOK) {if (!IsExitMsg(wndDataSet.txtName)) {AfxMessageBox(L消息不存在可能已经被删除);return;}if (IsExitData(wndDataSet.txtName, wndDataSet.txtId)) {AfxMessageBox(L消息对应的数据编号已经存在);return;}int icount lstDataType.GetItemCount();lstDataType.InsertItem(icount, wndDataSet.txtName);lstDataType.SetItemText(icount,1, wndDataSet.txtId);lstDataType.SetItemText(icount,2, wndDataSet.txtDataName);lstDataType.SetItemText(icount,3, wndDataSet.txtBackColor);lstDataType.SetItemText(icount,4, wndDataSet.txtFontColor);lstDataType.SetItemText(icount,5, txtBool[wndDataSet.IsShowUI]);lstDataType.SetItemText(icount,6, txtBool[wndDataSet.IsTxt]);lstDataType.SetItemText(icount,7, txtBool[wndDataSet.IsTxtAlone]);}}
}void CSet::OnSetDataType()
{if (nDataSel -1) {wndDataSet.txtName lstDataType.GetItemText(nDataSel, 0),wndDataSet.txtId lstDataType.GetItemText(nDataSel, 1),wndDataSet.txtDataName lstDataType.GetItemText(nDataSel, 2),wndDataSet.txtBackColor lstDataType.GetItemText(nDataSel, 3),wndDataSet.txtFontColor lstDataType.GetItemText(nDataSel, 4),wndDataSet.IsShowUI lstDataType.GetItemText(nDataSel, 5) L是;wndDataSet.IsTxt lstDataType.GetItemText(nDataSel, 6) L是;wndDataSet.IsTxtAlone lstDataType.GetItemText(nDataSel, 7) L是;if (wndDataSet.DoModal() IDOK) {int icount nDataSel;if (!IsExitMsg(wndDataSet.txtName)) {AfxMessageBox(L消息不存在可能已经被删除);lstDataType.DeleteItem(nDataSel);return;}if (IsExitData(wndDataSet.txtName, wndDataSet.txtId, icount)) {AfxMessageBox(L消息对应的数据编号已经存在);return;}lstDataType.SetItemText(icount, 0, wndDataSet.txtName);lstDataType.SetItemText(icount, 1, wndDataSet.txtId);lstDataType.SetItemText(icount, 2, wndDataSet.txtDataName);lstDataType.SetItemText(icount, 3, wndDataSet.txtBackColor);lstDataType.SetItemText(icount, 4, wndDataSet.txtFontColor);lstDataType.SetItemText(icount, 5, txtBool[wndDataSet.IsShowUI]);lstDataType.SetItemText(icount, 6, txtBool[wndDataSet.IsTxt]);lstDataType.SetItemText(icount, 7, txtBool[wndDataSet.IsTxtAlone]);}}
}void CSet::OnDelData()
{if (nDataSel -1) {lstDataType.DeleteItem(nDataSel);}
}bool CSet::IsExitMsg(CString _name)
{for (int i 0; i lstMsgType.GetItemCount(); i){if (lstMsgType.GetItemText(i, 0) _name) {return true;}}return false;
}bool CSet::IsExitData(CString _name, CString _id)
{for (int i 0; i lstDataType.GetItemCount(); i){if ((lstDataType.GetItemText(i, 0) _name)(lstDataType.GetItemText(i, 1) _id)) {return true;}}return false;
}bool CSet::IsExitData(CString _name, CString _id, int index)
{for (int i 0; i lstDataType.GetItemCount(); i){if ((lstDataType.GetItemText(i, 0) _name) (lstDataType.GetItemText(i, 1) _id)(index ! i)) {return true;}}return false;
}void CSet::OnClose()
{// TODO: 在此添加消息处理程序代码和/或调用默认值CDialogEx::OnCancel();
}CSet.h文件的修改新加 OnClose函数
#pragma once
#include CSetMsg.h
#include CSetData.h// CSet 对话框class CSet : public CDialogEx
{DECLARE_DYNAMIC(CSet)public:CSet(CWnd* pParent nullptr); // 标准构造函数virtual ~CSet();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD IDD_SET };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 生成的消息映射函数virtual BOOL OnInitDialog();DECLARE_MESSAGE_MAP()
public:CListCtrl lstMsgType;CListCtrl lstDataType;afx_msg void OnBnClickedOk();afx_msg void OnBnClickedCancel();afx_msg void OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnNMRClickList2(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void OnAddMsgType();
public:CSetMsg wndMsgSet;CSetData wndDataSet;CString txtBool[2]{ L否, L是 };int nMsgSel; // 消息定义列表选中行索引int nDataSel; // 数据定义列表选中行索引afx_msg void OnSetMsg(); // lstMsgType 添加数据afx_msg void OnDelMsg(); // lstMsgType 列表数据删除afx_msg void OnAddDataType(); // 选中 lstMsgType 列表里的一个数据根据这个数据添加一个 lstDataType列表数据afx_msg void OnSetDataType(); // lstDataType 列表数据修改afx_msg void OnDelData(); // lstDataType 列表数据删除// 判断 lstMsgType 列表是否有重复的bool IsExitMsg(CString _name);// 判断 lstDataType 列表里的内容是否有重复的bool IsExitData(CString _name, CString _id);// 判断 lstDataType 列表里的内容是否有重复的 修改里要排除自身所以才有的这个函数bool IsExitData(CString _name, CString _id, int index);CString txtName;CString txtTitle;afx_msg void OnClose();
};