23.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-实现配置工具数据结构

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

如果看不懂、不知道现在做的什么,那就跟着做完看效果

内容参考于:易道云信息技术研究院VIP课

上一个内容:22.加载配置文件到分析工具界面

码云地址(master 分支):https://gitee.com/dye_your_fingers/titan

码云版本号:1cd891b119c2c98906d566de0786a10d8f477b35

代码下载地址,在 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的分享

22.加载配置文件到分析工具界面 它的代码为基础进行修改

现在通过之前的内容,配置文件读写搞好了,接下来就是把配置文件跟工具联系起来,所以就需要设计一个数据结构

添加类:

添加了两个类,MSG_DEC和DATA_DEC

上面说,创建了两个类,但是由于它们的重复引用导致编译不通过,然后就把DATA_DEC类型给删了

新加MSG_DEC.h

#pragma once
class DATA_DEC;
typedef class MSG_DEC // 消息定义列表里的数据
{
public:wchar_t txtName[0xFF];// 消息名称wchar_t txtDefine[0xFF]; // 宏定义int Type; // 类型bool IsTxt; // 是否写到文件DATA_DEC* Datas; // 数据定义列表里的数据// DataCount 是指的数据定义列表里的个数,也就是Datas它的个数,如果不懂就看使用的位置unsigned DataCount; ~MSG_DEC();
}*_PMSG;typedef class DATA_DEC // 数据定义列表的结构体
{
public:_PMSG Msg; // 消息类型int Id; // 编号列wchar_t Name[0xFF]; // 名称列COLORREF BackColor; // 背景颜色COLORREF FontColor; // 字体颜色bool IsUi; // 显示列bool IsTxt; // 输出列bool IsTxtAlone; // 单独输出列bool Used;
}*PDATA;

新加MSG_DEC.cpp

#include "pch.h"
#include "MSG_DEC.h"MSG_DEC::~MSG_DEC()
{if (Datas) delete[] Datas;
}

extern_all.cpp文件的修改:新加 DefConfigIni变量、MAX_MSG变量、_MsgPtr变量、TxtToType函数、TxtToBool函数、TxtToColor函数

#include "pch.h"
#include "extern_all.h"
CString AppPath; // 用来记录当前程序的目录
CString ConfigPath; // 用来记录当前程序配置文件的目录
CString DataPath; // 用来记录当前程序日志的目录unsigned MAX_MSG = 0; // 消息定义列表数据结构要搞成一个数组,这个是数组的大小
_PMSG _MsgPtr = nullptr; // 数组指针CString txtNameArys[3]{ L"数据包", L"文字-ASCII", L"文字-UTF-16" };CString DefConfigIni;// L"F:\\代码存放地\\c\\titan\\Release\\DataAnly\\Config"; // 默认加载路径void SetListView(CListCtrl* lst)
{auto lStyle = GetWindowLongPtr(lst->m_hWnd, GWL_STYLE); // 获取窗口样式lStyle |= LVS_REPORT; // 设置为报表模式SetWindowLongPtr(lst->m_hWnd, GWL_STYLE, lStyle);// 给窗口设置样式auto dStyle = lst->GetExtendedStyle(); // 获取扩展样式dStyle |= LVS_EX_FULLROWSELECT; // 设置选择时选择一行dStyle |= LVS_EX_GRIDLINES; // 画网格线lst->SetExtendedStyle(dStyle); // 设置扩展样式
}int TxtToType(CString txt) {for (int i = 0; i < 3; i++){if (txt == txtNameArys[i]) {return i;}}return -1;
}
bool TxtToBool(CString txt) {return txt == L"是";
}
COLORREF TxtToColor(CString txt) {return wcstol(txt, NULL, 16);
}

extern_all.h文件的修改:新加 DefConfigIni变量、MAX_MSG变量、_MsgPtr变量、TxtToType函数、TxtToBool函数、TxtToColor函数

#pragma once
#include "MSG_DEC.h"extern void SetListView(CListCtrl* lst);
extern CString AppPath; // 用来记录当前程序的目录
extern CString ConfigPath; // 用来记录当前程序配置文件的目录
extern CString DataPath; // 用来记录当前程序日志的目录extern unsigned MAX_MSG; // 消息定义列表数据结构要搞成一个数组,这个是数组的大小
extern _PMSG _MsgPtr; // 数组指针extern int TxtToType(CString txt);
extern bool TxtToBool(CString txt);
extern COLORREF TxtToColor(CString txt);extern CString DefConfigIni; // 默认加载路径

DataAnlyDlg.cpp文件的修改:新加 LoadConfig函数,修改了 OnBnClickedButton4函数(配置按钮点击事件处理函数)


// DataAnlyDlg.cpp: 实现文件
//#include "pch.h"
#include "framework.h"
#include "DataAnly.h"
#include "DataAnlyDlg.h"
#include "afxdialogex.h"
#include "extern_all.h"#ifdef _DEBUG
#define new DEBUG_NEW
#endif// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogEx
{
public:CAboutDlg();// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_ABOUTBOX };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()// CDataAnlyDlg 对话框CDataAnlyDlg::CDataAnlyDlg(CWnd* pParent /*=nullptr*/): CDialogEx(IDD_DATAANLY_DIALOG, pParent), Pause(FALSE)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CDataAnlyDlg::DoDataExchange(CDataExchange* pDX)
{CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_LIST1, lstView);DDX_Check(pDX, IDC_CHECK1, Pause);
}BEGIN_MESSAGE_MAP(CDataAnlyDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDOK, &CDataAnlyDlg::OnBnClickedOk)ON_WM_COPYDATA()ON_BN_CLICKED(IDC_CHECK1, &CDataAnlyDlg::OnBnClickedCheck1)ON_BN_CLICKED(IDC_BUTTON1, &CDataAnlyDlg::OnBnClickedButton1)ON_BN_CLICKED(IDC_BUTTON4, &CDataAnlyDlg::OnBnClickedButton4)
END_MESSAGE_MAP()// CDataAnlyDlg 消息处理程序BOOL CDataAnlyDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != nullptr){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);			// 设置大图标SetIcon(m_hIcon, FALSE);		// 设置小图标// ShowWindow(SW_MAXIMIZE); // 设置最大号启动// TODO: 在此添加额外的初始化代码SetListView(&lstView);wchar_t buff[0xFF];/*获取当前程序名,这个名字是全路径,不只有程序名字(就是.exe文件的名字)它还可以获取别人的名字详细看微软的MSDN里的说明(百度搜索 “GetModuleFileName msdn” 关键字,就可以搜索出微软MSDN的说明)*/ GetModuleFileName(0, buff, sizeof(buff));int i;for (i = 0xFF - 1; buff[i] != L'\\'; i--);buff[++i] = 0;AppPath.Format(L"%s", buff);// AfxMessageBox(AppPath);ConfigPath = AppPath + L"Config\\";DataPath = AppPath + L"Datas\\";DefConfigIni = ConfigPath + L"titan.ini";LoadConfig(DefConfigIni);/*lstView.InsertColumn(0, L"消息类型", 0, 70);lstView.InsertColumn(1, L"数据类型", 0, 70);lstView.InsertColumn(2, L"内容", 0, 700);lstView.InsertColumn(3, L"长度", 0, 50);lstView.InsertColumn(4, L"时间", 0, 130);这几行代码意思是设置表头*/lstView.InsertColumn(0, L"消息类型", 0, 70);lstView.InsertColumn(1, L"数据类型", 0, 70);lstView.InsertColumn(2, L"内容", 0, 700);lstView.InsertColumn(3, L"长度", 0, 50);lstView.InsertColumn(4, L"时间", 0, 130);wndSet.Create(IDD_SET);return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CDataAnlyDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CDataAnlyDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}
}//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDataAnlyDlg::OnQueryDragIcon()
{return static_cast<HCURSOR>(m_hIcon);
}void CDataAnlyDlg::OnBnClickedOk()
{wchar_t buff[]{ L"我爱阿民" };COPYDATASTRUCT copydata{};/*这里的0表示字符串0具体是什么要看 WM_COPYDATA消息处理函数怎样写的*/copydata.dwData = 0;copydata.cbData = sizeof(buff);copydata.lpData = buff;SendMessage(WM_COPYDATA, 0, (LPARAM)&copydata);
}BOOL CDataAnlyDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* p)
{UpdateData(true);if (Pause)return CDialogEx::OnCopyData(pWnd, p);PCOPYDATA pdata = (PCOPYDATA)p->lpData;struct tm newtiem {};localtime_s(&newtiem, &pdata->ltime); // 获取时间int type = p->dwData;CString _result;CString _time;_time.Format(L"%.2d-%.2d-%.2d %.2d:%.2d:%.2d", newtiem.tm_year + 1900, newtiem.tm_mon, newtiem.tm_mday, newtiem.tm_hour, newtiem.tm_min, newtiem.tm_sec);if (MsgType[type]) {// 转换为buffunsigned char* buff = (unsigned char*)pdata->buff;CString _tmp;for (int i = 0; i < pdata->len;i++) {_tmp.Format(L"%.2X", buff[i]);_result = _result + L" " + _tmp;}}else {// 显示文本_result.Format(L"%s", pdata->buff);}lstView.InsertItem(0, MsgName[type]);lstView.SetItemText(0, 2, _result);lstView.SetItemText(0, 4, _time);CString wlen;wlen.Format(L"%d", pdata->len);lstView.SetItemText(0, 3, wlen);wlen.Format(L"%X", pdata->MsgType);lstView.SetItemText(0, 1, wlen);return CDialogEx::OnCopyData(pWnd, p);
}void CDataAnlyDlg::OnBnClickedCheck1()
{
}void CDataAnlyDlg::OnBnClickedButton1()
{lstView.DeleteAllItems();
}void CDataAnlyDlg::OnBnClickedButton4()
{wndSet.ShowWindow(TRUE);wndSet.LoadConfig(DefConfigIni, L"titan");
}void CDataAnlyDlg::LoadConfig(CString inifile) {/*从配置文件中读取一个数据,意思是从main下的count读取一个数字int类型的数字GetPrivateProfileInt用来获取.ini文件里的内容,最后的Int表示读取的数据类型Int就表示读取int类型,String表示读取String类型,也就是一个字符串GetPrivateProfileString(L"main", L"title", L"", buff, 0xFF, inifile);里的L""是默认值GetPrivateProfileInt(L"main", L"count", 0, inifile);里的0是默认值默认值的意思,如果读取不到数据就把默认值返回给我们*/int icount = GetPrivateProfileInt(L"main", L"count", 0, inifile);if (_MsgPtr) delete[] _MsgPtr;if (icount < 1) return;MAX_MSG = icount;_MsgPtr = new MSG_DEC[icount];wchar_t buff[0xFF];GetPrivateProfileString(L"main", L"title", L"", buff, 0xFF, inifile);this->SetWindowText(buff);/*CString App;CString AppData;CString _Name;它是用来初始化字符串的,利用 Foramt 函数把从.ini文件里获取的数据全部转成字符串*/CString App;CString AppData;CString _Name;for (int i = 0; i < icount; i++){App.Format(L"Message_%d", i);GetPrivateProfileString(App, L"name", L"", _MsgPtr[i].txtName, 0xFF, inifile);_Name.Format(L"%s", _MsgPtr[i].txtName);GetPrivateProfileString(App, L"define", L"", _MsgPtr[i].txtDefine, 0xFF, inifile);GetPrivateProfileString(App, L"type", L"", buff, 0xFF, inifile);_MsgPtr[i].Type = TxtToType(buff);GetPrivateProfileString(App, L"istxt", L"", buff, 0xFF, inifile);_MsgPtr[i].IsTxt = TxtToBool(buff);;int lcount = GetPrivateProfileInt(App, L"count", 0, inifile);_MsgPtr[i].Datas = new DATA_DEC[lcount];_MsgPtr[i].DataCount = lcount;for (int j = 0; j < lcount; j++){AppData.Format(L"%s_%d", _Name.GetBuffer(), j);DATA_DEC dataDec = _MsgPtr[i].Datas[j];dataDec.Msg = &(_MsgPtr[i]);GetPrivateProfileString(AppData, L"id", L"0", buff, 0xFF, inifile);dataDec.Id = _wtoi(buff);GetPrivateProfileString(AppData, L"name", L"0", dataDec.Name, 0xFF, inifile);GetPrivateProfileString(AppData, L"backcolor", L"0", buff, 0xFF, inifile);dataDec.BackColor = TxtToColor(buff);GetPrivateProfileString(AppData, L"fontcolor", L"0", buff, 0xFF, inifile);dataDec.FontColor = TxtToColor(buff);GetPrivateProfileString(AppData, L"isui", L"0", buff, 0xFF, inifile);dataDec.IsUi = TxtToBool(buff);GetPrivateProfileString(AppData, L"istxt", L"0", buff, 0xFF, inifile);dataDec.IsTxt = TxtToBool(buff);GetPrivateProfileString(AppData, L"istxtalone", L"0", buff, 0xFF, inifile);dataDec.IsTxtAlone = TxtToBool(buff);}}
}

DataAnlyDlg.h文件的修改:新加 LoadConfig函数,修改了 OnBnClickedButton4函数(配置按钮点击事件处理函数)


// DataAnlyDlg.h: 头文件
//#pragma once
#include "CSet.h"
#include "MSG_DEC.h"typedef struct COPY_DATA {time_t ltime; // 时间unsigned MsgType; // 数据类型unsigned len; // 数据长度char buff[0x2000]; // 数据
}*PCOPYDATA;// CDataAnlyDlg 对话框
class CDataAnlyDlg : public CDialogEx
{
// 构造
public:CDataAnlyDlg(CWnd* pParent = nullptr);	// 标准构造函数// 对话框数据
#ifdef AFX_DESIGN_TIMEenum { IDD = IDD_DATAANLY_DIALOG };
#endifprotected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持// 实现
protected:HICON m_hIcon;// 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();DECLARE_MESSAGE_MAP()
public:CListCtrl lstView;afx_msg void OnBnClickedOk();afx_msg BOOL OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct);bool MsgType[5]{ // 意思看使用它的代码true, true, false, false, false};wchar_t MsgName[5][0xFF]{// 意思看使用它的代码L"发送",L"接收",L"发送解析",L"接收解析",L"日志"};/*0 发送数据1 接收数据2 发送数据解析3 接收数据解析4 日志*/BOOL Pause;afx_msg void OnBnClickedCheck1();afx_msg void OnBnClickedButton1();CSet wndSet;afx_msg void OnBnClickedButton4();void CDataAnlyDlg::LoadConfig(CString inifile);
};

CSet.h文件的修改:新加 LoadConfig函数

#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();void LoadConfig(CString inifile, CString _name);
};

CSet.cpp文件的修改:新加 LoadConfig函数

// 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(L"main", L"count", txt, inifile);WritePrivateProfileString(L"main", L"title", txtTitle, inifile);for (int i = 0; i < icount; i++){_Name = lstMsgType.GetItemText(i, 0);App.Format(L"Message_%d", i);// 消息定义列表的名称列的内容WritePrivateProfileString(App, L"name", _Name, inifile);// 消息定义列表的宏定义列的内容WritePrivateProfileString(App, L"define", lstMsgType.GetItemText(i, 1), inifile);// 消息定义列表的类型列的内容WritePrivateProfileString(App, L"type", lstMsgType.GetItemText(i, 2), inifile);// 消息定义列表的输出到文件列的内容WritePrivateProfileString(App, L"istxt", 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, L"id", lstDataType.GetItemText(j,1), inifile);// 数据定义列表的名称列的内容 WritePrivateProfileString(AppData, L"name", lstDataType.GetItemText(j,2), inifile);// 数据定义列表的背景颜色列的内容 WritePrivateProfileString(AppData, L"backcolor", lstDataType.GetItemText(j,3), inifile);// 数据定义列表的字体颜色列的内容 WritePrivateProfileString(AppData, L"fontcolor", lstDataType.GetItemText(j,4), inifile);// 数据定义列表的显示列的内容 WritePrivateProfileString(AppData, L"isui", lstDataType.GetItemText(j,5), inifile);// 数据定义列表的输出列的内容 WritePrivateProfileString(AppData, L"istxt", lstDataType.GetItemText(j,6), inifile);// 数据定义列表的单独输出列的内容 WritePrivateProfileString(AppData, L"istxtalone", lstDataType.GetItemText(j,7), inifile);}}txt.Format(L"%d", datacount);WritePrivateProfileString(App, L"count", 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) {// 获取选择的文件的目录,获取的是绝对路径CString inifile = dialog.GetPathName();LoadConfig(inifile, dialog.GetFileTitle());}
}void CSet::OnNMRClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{LPNMITEMACTIVATE p = reinterpret_cast<LPNMITEMACTIVATE>(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_cast<LPNMITEMACTIVATE>(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();
}void CSet::LoadConfig(CString inifile, CString _name)
{lstDataType.DeleteAllItems(); // 清空数据定义列表lstMsgType.DeleteAllItems(); // 清空消息定义列表// 获取选择的文件的文件名txtName = _name;/*从配置文件中读取一个数据,意思是从main下的count读取一个数字int类型的数字GetPrivateProfileInt用来获取.ini文件里的内容,最后的Int表示读取的数据类型Int就表示读取int类型,String表示读取String类型,也就是一个字符串GetPrivateProfileString(L"main", L"title", L"", buff, 0xFF, inifile);里的L""是默认值GetPrivateProfileInt(L"main", L"count", 0, inifile);里的0是默认值默认值的意思,如果读取不到数据就把默认值返回给我们*/int icount = GetPrivateProfileInt(L"main", L"count", 0, inifile);wchar_t buff[0xFF];GetPrivateProfileString(L"main", L"title", 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(L"Message_%d", i);GetPrivateProfileString(App, L"name", L"", buff, 0xFF, inifile);_Name.Format(L"%s", buff);lstMsgType.InsertItem(i, buff);GetPrivateProfileString(App, L"define", L"", buff, 0xFF, inifile);lstMsgType.SetItemText(i, 1, buff);GetPrivateProfileString(App, L"type", L"", buff, 0xFF, inifile);lstMsgType.SetItemText(i, 2, buff);GetPrivateProfileString(App, L"istxt", L"", buff, 0xFF, inifile);lstMsgType.SetItemText(i, 3, buff);int lcount = GetPrivateProfileInt(App, L"count", 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, L"id", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 1, buff);GetPrivateProfileString(AppData, L"name", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 2, buff);GetPrivateProfileString(AppData, L"backcolor", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 3, buff);GetPrivateProfileString(AppData, L"fontcolor", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 4, buff);GetPrivateProfileString(AppData, L"isui", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 5, buff);GetPrivateProfileString(AppData, L"istxt", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 6, buff);GetPrivateProfileString(AppData, L"istxtalone", L"0", buff, 0xFF, inifile);lstDataType.SetItemText(datacount, 7, buff);}}UpdateData(FALSE);
}

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

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

相关文章

站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站

文章目录 概要整体架构流程技术名词解释技术细节ssh-ubuntu服务器docker-映射-链接-通信nginx反代mysql设置数据库新密码 小结我的mysql映射目录我的wordpress映射目录 成果展示 概要 新买了一个云服务器&#xff0c;想搭建一个站库分离的wordpress为主的网站&#xff0c;采用d…

PID控制器组(完整SCL代码)

PID控制器组不是什么新概念,是在PID控制器的基础上,利用面向对象的思想对对象进行封装 批量实例化。 1、增量式PID https://rxxw-control.blog.csdn.net/article/details/124363197https://rxxw-control.blog.csdn.net/article/details/1243631972、完全增量式PID https:/…

Vue 3:引领前端开发的未来

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

自制STLink-V2.1

STLink-V2.1需要使用的芯片是STM32F103CBT6 原理图如下&#xff1a; PCB如下&#xff1a; 将板子焊接好后下载&#xff1a;STM32 DebugMass storageVCP V2.J40.M27的固件后&#xff0c;再使用ST官方ST-LinkUpgrade工具对我们自制的STLink-V2.1进行升级。升级完成后&#xff0c…

数据结构---复杂度(2)

1.斐波那契数列的时间复杂度问题 每一行分别是2^0---2^1---2^2-----2^3-------------------------------------------2^(n-2) 利用错位相减法&#xff0c;可以得到结果是&#xff0c;2^(n-1)-1,其实还是要减去右下角的灰色部分&#xff0c;我们可以拿简单的数字进行举例子&…

Redis 的基本全局命令

前言 Redis 常用的有 5 种数据结构&#xff0c;字符串&#xff0c;列表&#xff0c;哈希表&#xff0c;集合&#xff0c;有序集合&#xff0c;每一种数据结构都有自己独特的命令&#xff0c;但也有些通用的全局命令&#xff0c;本文所提到的是最基本的命令&#xff0c;Redis 的…

前端存储方案

如今主流的存储方案&#xff1a; cookieweb storageindexDB 这三个浏览器兼容性最高的三种前端储存方案 1、cookie 它的出现是为了解决 HTTP 协议无状态特性的问题&#xff0c;简单来说就是想要得到上次http请求的数据是办不到的&#xff0c;只有再次从新请求。我们见得最多…

2024年零基础自学网络安全/Web安全,看这一篇就够了

作为一个安全从业人员&#xff0c;我自知web安全的概念太过于宽泛&#xff0c;我本人了解的也并不够精深&#xff0c;还需要继续学习。 但又不想新入行的人走弯路&#xff0c;所以今天随手写写关于web安全的内容&#xff0c;希望对初次遇到web安全问题的同学提供帮助&#xff…

设计模式:软件开发的秘密武器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

HTML:注释的 5 种场景和 5 点注意事项

你好&#xff0c;我是云桃桃。 HTML 代码注释是用来在 HTML 源代码中添加一些说明性文字&#xff0c;而不会显示在页面中的内容。它们不会在浏览器中显示或渲染。 现在我们一起来看看它的语法&#xff0c;用途和注意事项吧。 注释语法 HTML 注释的基本语法格式是: <!--…

利用Nginx正向代理实现局域网电脑访问外网

引言 在网络环境中&#xff0c;有时候我们需要让局域网内的电脑访问外网&#xff0c;但是由于网络策略或其他原因&#xff0c;直接访问外网是不可行的。这时候&#xff0c;可以借助 Nginx 来搭建一个正向代理服务器&#xff0c;实现局域网内电脑通过 Nginx 转发访问外网的需求…

绝赞春招拯救计划 -- 数据结构篇

哈希表 来吧&#xff01;一文彻底搞定哈希表&#xff01; - 知乎 (zhihu.com) 百科解释&#xff1a; “散列表&#xff08;Hash table&#xff0c;也叫哈希表&#xff09;&#xff0c;是根据键&#xff08;Key&#xff09;而直接访问在内存存储位置的数据结构。也就是说&…

免费的 AI 视频生成工具 Moonvalley 厉害了!Moonvalley 怎么用(保姆级教程)

一、Moonvalley 介绍 Moonvalley&#xff0c;号称地表最强的 AI 视频生成工具&#xff0c;到底有多厉害&#xff1f;今天一起来看一下~ 这是 Moonvalley 官网的介绍&#xff1a; Moonvalley 是一个开创性的新型文本到视频的生成式 AI 模型。用简单的文本即可创建出惊人的电影和…

蓝桥杯练习系统(算法训练)ALGO-976 P0804字符串压缩

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 编写一个函数void strcompress(char *s)&#xff0c;输入一个字符串&#xff08;只包含小写字母和空格&#xff0c;且长度小于1000&am…

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 这篇论文是基于VideoCrafter的&#xff0c;而VideoCrafter是基于LVDM的 关于LVDM可以看https://blog.csdn.net/Are_you_ready/article/details/136615853 2023年12月6日发表在arxiv 这篇论文讨论…

【深度学习】线性回归

Linear Regression 一个例子线性回归机器学习中的表达评价函数好坏的度量&#xff1a;损失&#xff08;Loss&#xff09;损失函数&#xff08;Loss function&#xff09;哪个数据集的均方误差 (MSE) 高 如何找出最优b和w?寻找最优b和w如何降低损失 (Reducing Loss)梯度下降法梯…

绪论——算法设计原则【数据科学与工程算法基础】

一、题记 最近情绪不太稳定&#xff0c;些许烦躁&#xff0c;也就一直没践行前边说的“学习记录”的想法。现在开始做了&#xff0c;春华易逝&#xff0c;正当时&#xff0c;有想法就去做&#xff0c;踌躇懊悔是这个年纪最不该做的事。 二、前言 之前说了分块做这个系列&#x…

101. Go单测系列1---使用monkey打桩

本文将介绍如何在单元测试中使用monkey进行打桩。 monkey支持为任意函数及方法进行打桩。 monkey介绍 monkey是一个Go单元测试中十分常用的打桩工具&#xff0c;它在运行时通过汇编语言重写可执行文件&#xff0c;将目标函数或方法的实现跳转到桩实现&#xff0c;其原理类似…

我用 Python 做了个小仙女代码蹦迪视频

前言 最近在B站上看到一个漂亮的仙女姐姐跳舞视频&#xff0c;循环看了亿遍又亿遍&#xff0c;久久不能离开&#xff01; 看着仙紫小姐姐的蹦迪视频&#xff0c;除了一键三连还能做什么&#xff1f;突发奇想&#xff0c;能不能把小仙女的蹦迪视频转成代码舞呢&#xff1f; 说…

uniapp引入jQuery

安装 npm install jquery --saveoryarn add jquery引入 import Vue from vue import jquery from "jquery"; Vue.prototype.$ jquery;<template><view>abc</view> </template><script>export default {data() {return {}}} </scr…