20.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-数据分析工具数据类型编辑功能的实现

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

内容参考于: 易道云信息技术研究院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();
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LCR 179. 查找总价格为目标值的两个商品 - 力扣

1. 题目 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 2. 示例 3. 分析 我们首先想到暴力解法&#xff0c;这道题目的暴力还是比较简单的&#xff0c;列举每个数的情况即可…

Open CASCADE学习|表面着色显示模型

模型表面着色具有如下作用&#xff1a; 视觉增强&#xff1a;通过为模型表面添加着色&#xff0c;可以使其更加生动和逼真&#xff0c;提高视觉体验。 信息区分&#xff1a;在复杂的模型中&#xff0c;不同的部分或组件可能需要通过不同的颜色来区分&#xff0c;以便更清晰地…

干货!Python函数中的参数类型

1.必须参数 调用函数的时候&#xff0c;必须以正常的顺序传参&#xff0c;实参的数量和形参的数量保持一致 def demo(name, age):print("我的姓名是&#xff1a;%s, 年龄是&#xff1a;%d"%(name, age))demo("张三", 22) # 我的姓名是&#xff1a;张三…

通过测试自动化转移安全关键软件测试

我们正面临安全关键软件的成本危机&#xff0c;这意味着所需增加的功能已经超出了支付其开发费用的能力。例如&#xff0c;波音 787 项目需要 650 万行代码&#xff0c;设计、开发和测试成本达 40 亿美元。波音777X项目的成本数字并未公开披露&#xff0c;波音737 MAX最初估计为…

Python单线程、多线程、多进程

并发和并行 并发&#xff1a;单核CPU在不同时刻只执行一个任务&#xff0c;在同一时间段内&#xff0c;交替执行两个任务。 并行&#xff1a;双核CPU可以在同一时刻执行两个任务。 多核CPU的每个核心都可以独立执行一个任务&#xff0c;而且多个核心之间不会相互干扰。 并发…

typescript学习(更新中)

目录 开发环境搭建类型如何声明有哪些类型编译配置文件 开发环境搭建 npm i -g typescripttsc检查是否安装成功 类型如何声明 // 先声明再赋值 let a: number a 1// 直接赋值 let b 1function sum(a: number, b: number): number {return a b } console.log(sum(1, 2))有…

linux 将 api_key设置环境变量里

vi ~/.bashrc在最后添加api_key的环境变量 export GEMINI_API_KEYAIza**********WvpX7FwbdM刷新配置 source ~/.bashrc使用python 读取环境变量 import os gemini_api_key os.getenv(GEMINI_API_KEY) print(gemini_api_key)

Mysql的Cardinality值

什么是Cardinality值&#xff1f; Cardinality值是Mysql做索引优化时一个非常关键的值&#xff0c;优化器会根据这个值来判断是否使用这个索引&#xff0c;它表示索引中唯一值的数目估计值&#xff0c;该值应该尽可能接近1&#xff0c;如果非常小&#xff0c;则用户需要考虑是否…

企业计算机服务器中了mkp勒索病毒如何解密,mkp勒索病毒解密流程

网络技术的应用与发展&#xff0c;为企业的生产运营提高了效率&#xff0c;越来越多的企业利用网络开展多项工作业务&#xff0c;利用网络的优势&#xff0c;可以为企业更好的服务&#xff0c;但是稍不注意就会被网络威胁所盯上。近日&#xff0c;云天数据恢复中心接到多家企业…

二本双非|逆袭985/211只要做好这3件事

我的本科学校就是双非&#xff0c;但是我并不觉得考研是一件非常容易地事情&#xff0c;并且我身边的同学也没有一个觉得考研很轻松。可能网上很多经验贴说自己双非上岸985&#xff0c;二本上岸985&#xff0c;我觉得这是大家陷入了互联网时代的信息茧房。 考研不管是对985/211…

波奇学Linux: 信号捕捉

sigaction:修改信号对应的handler方法 act输入型参数&#xff0c;oldact输出型参数 void (*sa_handler) (int) //修改的自定义函数 sigset_t sa_mask // void handler(int signo) {cout<<"catch a signal, signal number: "<<signo<<endl; } int …

超市小程序有哪些功能 怎么制作

超市小程序是非常有用的工具&#xff0c;可以帮助超市提升用户体验&#xff0c;提高销售额。下面我们来看一下超市小程序可以具备哪些功能&#xff0c;以及如何制作一个高效的超市小程序。 1. **商品展示与搜索功能**&#xff1a;用户可以浏览超市的商品信息&#xff0c;包括价…

数字化转型导师坚鹏:大模型的应用实践(金融)

大模型的应用实践 ——开启人类AI新纪元 打造数字化转型新利器 课程背景&#xff1a; 很多企业和员工存在以下问题&#xff1a; 不清楚大模型对我们有什么影响&#xff1f; 不知道大模型的发展现状及作用&#xff1f; 不知道大模型的针对性应用案例&#xff1f; 课程…

雍禾医疗耀眼的“小”医生,雍禾植发刘树伟10年热爱一份事业

“你说你一个普外科大大夫&#xff0c;怎么改去做小小毛发医生了呢&#xff1f;”这是雍禾植发刘树伟医生&#xff0c;从公立医院转行做毛发医生时&#xff0c;被人质疑最多的点。然而&#xff0c;选择成为一名毛发医生&#xff0c;却是他花3年时间做出的重要的决定。 2009年&…

【C++ STL详解】——string类

目录 前言 一、string类对象的常见构造 二、string类对象的访问及遍历 1.下标【】&#xff08;底层operator【】函数&#xff09; ​编辑 2.迭代器 3.范围for 4.at 5.back和front 三、string类对象的容量操作 1.size 和 length 2.capacity 3.empty 4.clear 5.res…

【校园安全】支小蜜防校园霸凌语音识别系统的好处

在校园安全领域&#xff0c;防校园霸凌语音识别系统的出现&#xff0c;为预防和应对校园霸凌行为提供了新的技术手段。本文将探讨防校园霸凌语音识别系统的好处&#xff0c;并分析其在校园安全建设中的重要作用。 通过安装在校园各个角落的语音识别设备&#xff0c;系统能够捕…

Flink并行度

1、Task flink中每个算子就是一个Task&#xff0c;比如flatMap、map、sum是一个Task。 2、SubTask 算子有几个并行度SubTask的数量就是几&#xff0c;比如 3、算子并行度 算子并行度指的是每个算子的并行度&#xff0c;可用env.setParallelism(1);设置所有算子的并行度&am…

浏览器是如何渲染页面的?

浏览器是如何渲染页面的&#xff1f; 1. 解析 HTML2. 样式计算 Computed Style3. 布局 Layout4. 分层 Layer5. 绘制 Paint6. 分块 Tiling7. 光栅化 Raster8. 画 draw完整过程面试题什么是 reflow&#xff08;回流/重排&#xff09;?什么是 repaint &#xff08;重绘&#xff0…

智慧城市中的数字孪生:构建城市管理的未来框架

目录 一、引言 二、数字孪生技术概述 三、数字孪生技术在智慧城市中的应用 1、实时监测与预警 2、模拟与优化 3、智能化决策 4、协同与共享 四、数字孪生技术构建城市管理的未来框架的价值 1、提高管理效率 2、优化资源配置 3、提升公共服务水平 4、增强应对突发事…

【Linux】Linux——Centos7安装

目录 虚拟机安装【空壳子】安装VMware Workstation新建虚拟机硬件兼容性(直接下一步)稍后安装操作系统客户及操作系统选择Linux&#xff0c;版本Centos764位给虚拟机命名&#xff0c;并选择安装位置处理器配置&#xff08;默认即可&#xff0c;不够用后面可以调&#xff09;虚拟…