有关网站开发的国外书籍,app开发公司应聘,广州模板网站,公司内部网站源码免责声明#xff1a;内容仅供学习参考#xff0c;请合法利用知识#xff0c;禁止进行违法犯罪活动#xff01;
如果看不懂、不知道现在做的什么#xff0c;那就跟着做完看效果
内容参考于#xff1a;易道云信息技术研究院VIP课
上一个内容#xff1a;22.加载配置文件…免责声明内容仅供学习参考请合法利用知识禁止进行违法犯罪活动
如果看不懂、不知道现在做的什么那就跟着做完看效果
内容参考于易道云信息技术研究院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.hMSG_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;// LF:\\代码存放地\\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.hextern 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 LConfig\\;DataPath AppPath LDatas\\;DefConfigIni ConfigPath Ltitan.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_castWPARAM(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_castHCURSOR(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, Ltitan);
}void CDataAnlyDlg::LoadConfig(CString inifile) {/*从配置文件中读取一个数据意思是从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);if (_MsgPtr) delete[] _MsgPtr;if (icount 1) return;MAX_MSG icount;_MsgPtr new MSG_DEC[icount];wchar_t buff[0xFF];GetPrivateProfileString(Lmain, Ltitle, 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(LMessage_%d, i);GetPrivateProfileString(App, Lname, L, _MsgPtr[i].txtName, 0xFF, inifile);_Name.Format(L%s, _MsgPtr[i].txtName);GetPrivateProfileString(App, Ldefine, L, _MsgPtr[i].txtDefine, 0xFF, inifile);GetPrivateProfileString(App, Ltype, L, buff, 0xFF, inifile);_MsgPtr[i].Type TxtToType(buff);GetPrivateProfileString(App, Listxt, L, buff, 0xFF, inifile);_MsgPtr[i].IsTxt TxtToBool(buff);;int lcount GetPrivateProfileInt(App, Lcount, 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, Lid, L0, buff, 0xFF, inifile);dataDec.Id _wtoi(buff);GetPrivateProfileString(AppData, Lname, L0, dataDec.Name, 0xFF, inifile);GetPrivateProfileString(AppData, Lbackcolor, L0, buff, 0xFF, inifile);dataDec.BackColor TxtToColor(buff);GetPrivateProfileString(AppData, Lfontcolor, L0, buff, 0xFF, inifile);dataDec.FontColor TxtToColor(buff);GetPrivateProfileString(AppData, Lisui, L0, buff, 0xFF, inifile);dataDec.IsUi TxtToBool(buff);GetPrivateProfileString(AppData, Listxt, L0, buff, 0xFF, inifile);dataDec.IsTxt TxtToBool(buff);GetPrivateProfileString(AppData, Listxtalone, L0, buff, 0xFF, inifile);dataDec.IsTxtAlone TxtToBool(buff);}}
}
DataAnlyDlg.h文件的修改新加 LoadConfig函数修改了 OnBnClickedButton4函数配置按钮点击事件处理函数 // DataAnlyDlg.h: 头文件
//#pragma once
#include CSet.h
#include MSG_DEC.htypedef 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(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) {// 获取选择的文件的目录获取的是绝对路径CString inifile dialog.GetPathName();LoadConfig(inifile, dialog.GetFileTitle());}
}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();
}void CSet::LoadConfig(CString inifile, CString _name)
{lstDataType.DeleteAllItems(); // 清空数据定义列表lstMsgType.DeleteAllItems(); // 清空消息定义列表// 获取选择的文件的文件名txtName _name;/*从配置文件中读取一个数据意思是从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);
}