免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
内容参考于: 易道云信息技术研究院VIP课
上一个内容:19.数据分析工具数据类型配置功能的实现
码云地址(master 分支):https://gitee.com/dye_your_fingers/titan
码云版本号:037b8a13a9b2a1b635fe2beddc7c2c1ac7abd602
代码下载地址,在 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的分享
以 19.数据分析工具数据类型配置功能的实现 它的代码为基础进行修改
上一个内容里把输出到列表显示复选框,搞成了控件类型,这里要进行更改,下图是我改好之后的截图,
修改的代码位置:
数据设置里的菜单添加处理事件
修改:
删除:
CSet.cpp文件的修改:修改了 OnNMRClickList2函数、OnAddMsgType函数、OnSetMsg函数,新加 IsExitMsg函数、IsExitData函数、OnSetDataType函数、OnDelData函数、nDataSel变量
// 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)
{
}
CSet::~CSet()
{
}
void CSet::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, lstMsgType);
DDX_Control(pDX, IDC_LIST2, lstDataType);
}
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)
END_MESSAGE_MAP()
// CSet 消息处理程序
void CSet::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnOK();
}
void CSet::OnBnClickedCancel()
{
// TODO: 在此添加控件通知处理程序代码
CDialogEx::OnCancel();
}
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;
}
CSet.h文件的修改:新加 IsExitMsg函数、IsExitData函数、OnSetDataType函数、OnDelData函数、nDataSel变量
#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_TIME
enum { IDD = IDD_SET };
#endif
protected:
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);
};
CSetData.h文件的修改:修改 IsShowUI变量类型
#pragma once
// CSetData 对话框
class CSetData : public CDialogEx
{
DECLARE_DYNAMIC(CSetData)
public:
CSetData(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CSetData();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SETDATA };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
CString txtName;
CString txtId;
CString txtDataName;
CString txtBackColor;
CString txtFontColor;
BOOL IsTxt;
BOOL IsTxtAlone;
BOOL IsShowUI;
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedButton6();
afx_msg void OnBnClickedOk();
};
CSetData.cpp文件的修改:修改了 DoDataExchange函数、CSetData函数
// CSetData.cpp: 实现文件
//
#include "pch.h"
#include "DataAnly.h"
#include "CSetData.h"
#include "afxdialogex.h"
// CSetData 对话框
IMPLEMENT_DYNAMIC(CSetData, CDialogEx)
CSetData::CSetData(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_SETDATA, pParent)
, txtName(_T(""))
, txtId(_T("0"))// 设置数据编号输入框默认值
, txtDataName(_T("无")) // 设置数据名字输入框默认值
, txtBackColor(_T("FFFFFF")) // 设置背景颜色默认值为白色
, txtFontColor(_T("0")) // 设置文字颜色默认值为黑色
, IsTxt(FALSE)
, IsTxtAlone(FALSE)
, IsShowUI(FALSE)
{
}
CSetData::~CSetData()
{
}
void CSetData::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT3, txtName);
DDX_Text(pDX, IDC_EDIT1, txtId);
DDX_Text(pDX, IDC_EDIT2, txtDataName);
DDX_Text(pDX, IDC_EDIT5, txtBackColor);
DDX_Text(pDX, IDC_EDIT6, txtFontColor);
DDX_Check(pDX, IDC_CHECK1, IsTxt);
DDX_Check(pDX, IDC_CHECK2, IsTxtAlone);
DDX_Check(pDX, IDC_CHECK3, IsShowUI);
}
BEGIN_MESSAGE_MAP(CSetData, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &CSetData::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON6, &CSetData::OnBnClickedButton6)
ON_BN_CLICKED(IDOK, &CSetData::OnBnClickedOk)
END_MESSAGE_MAP()
// CSetData 消息处理程序
void CSetData::OnBnClickedButton1()
{
/*
颜色选择Dialog对象
*/
CColorDialog color;
color.m_cc.Flags |= CC_RGBINIT;
/*
color.DoModal() 打开一个颜色选择对话框
*/
if (color.DoModal() == IDOK) {
txtBackColor.Format(L"%X", color.m_cc.rgbResult);
UpdateData(false);
}
}
void CSetData::OnBnClickedButton6()
{
/*
颜色选择Dialog对象
*/
CColorDialog color;
color.m_cc.Flags |= CC_RGBINIT;
/*
color.DoModal() 打开一个颜色选择对话框
*/
if (color.DoModal() == IDOK) {
txtFontColor.Format(L"%X", color.m_cc.rgbResult);
UpdateData(false);
}
}
void CSetData::OnBnClickedOk()
{
UpdateData(TRUE);
CDialogEx::OnOK();
}