11 MFC 制作记事本

news2025/1/13 10:09:31

文章目录

  • 界面制作
  • 制作菜单
    • 设置编译框随着窗口的变化而变化OnSize
    • 打开文件
    • 文件另存为
    • 设置字体颜色
    • 修改字体
    • 文件的查找与替换
      • 查找与替换对话框显示(非模态对话框)
      • 对话框消息与对话框处理函数
  • 全部代码

界面制作

在这里插入图片描述

制作菜单

选择Menu 点击新建

在这里插入图片描述

将内容写入"_"的用& 符号

在这里插入图片描述

将菜单加入到窗口中

在这里插入图片描述

设置编译框随着窗口的变化而变化OnSize

//设置编译框随着窗口的变化而变化
void CnotepadPlusDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	//获取控件
	CWnd* pEdit=GetDlgItem(IDC_EDIT1);
	if(pEdit!=NULL)
		pEdit->MoveWindow(0, 0, cx, cy);
}

打开文件

右键选择添加事件处理程序

在这里插入图片描述

点击确定

在这里插入图片描述

Edit设置多行显示

在这里插入图片描述

Edit设置按回车能够换行

在这里插入图片描述

Edit设置竖直方向滚动

在这里插入图片描述

打开文件代码

//打开文件
void CnotepadPlusDlg::OnOpen()
{

	CFileDialog dlg(TRUE);
	if (IDCANCEL == dlg.DoModal())
		return;
	
	CString strFilePath = dlg.GetPathName();//获取全路径
	CString strFileName = dlg.GetFileName();

	//文件操作
	//CFile 文件类
	CFile file;
	if (FALSE == file.Open(strFilePath, CFile::modeRead))//file.Open(文件路径,文件读取模式)
	{
		MessageBox(L"打开文件失败", L"温馨提示",MB_OK);
		return;
	}
	//读取内容
	CStringA strContent ;//清空数组
	char szContent[10] = { 0 };
	while (file.Read(szContent, 2))
	{
		strContent = strContent+szContent;//内容连接
	}
	
	//编码转换
	CCharset charset;
	wchar_t* wContent=charset.AnsiToUnicode(strContent);

	//设置窗口
	SetDlgItemText(IDC_EDIT1, wContent);

	//设置标题
	CString strTitle;
	strTitle.Format(L"超级记事本-%s[%d字节]", strFileName, file.GetLength());
	SetWindowText(strTitle);

	file.Close();
}

文件另存为

void CnotepadPlusDlg::OnSaveAs()
{
	CFileDialog dlg(FALSE,NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
	if (IDCANCEL == dlg.DoModal())
		return;
	CString strFilePath = dlg.GetPathName();
	CFile file;
	if (FALSE == file.Open(strFilePath, CFile::modeCreate |CFile::modeWrite))//file.Open(文件路径,文件读取模式)
	{
		MessageBox(L"打开文件失败", L"温馨提示", MB_OK);
		return;
	}

	//读取出控件中所有的文本
	CString strContent;
	GetDlgItemText(IDC_EDIT1, strContent);

	//另存为Unicode
	CCharset charset;
	char* content=charset.UnicodeToAnsi(strContent);


	//file.Write(strContent, strContent.GetLength() * 2);
	file.Write(content, strlen(content));
	file.Close();

	//::MultiByteToWideChar
	//::WideCharToMultiByte
}

设置字体颜色

//设置颜色
void CnotepadPlusDlg::OnBtmColor()
{
	CColorDialog dlg;
	if (IDCANCEL == dlg.DoModal())
		return;
    m_color = dlg.GetColor();//获取到颜色
	
}

//编辑控件颜色
HBRUSH CnotepadPlusDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	switch (pWnd->GetDlgCtrlID())
	{
		case IDC_EDIT1:
			pDC->SetTextColor(m_color);
			break;
	}
	
	return hbr;
}

在这里插入图片描述

修改字体

//修改字体
void CnotepadPlusDlg::OnBtnFont()
{
	//字体选择对话框
	CFontDialog dlg;
	if (IDCANCEL == dlg.DoModal())
		return;
	//设置字体
	CFont font;
	font.CreatePointFont(dlg.GetSize(), dlg.GetFaceName());
	GetDlgItem(IDC_EDIT1)->SetFont(&font);
}

请添加图片描述

文件的查找与替换

请添加图片描述

查找与替换对话框显示(非模态对话框)

//显示
//查找非模态对话框,需要注册消息
void CnotepadPlusDlg::OnFind()
{
	CFindReplaceDialog* pFindDlg=new CFindReplaceDialog;
	//第一个:TRUE 代表查找框  FALSE 代表替换框
	//第二个参数:要查找的东西
	//第三个:要替换的东西
	pFindDlg->Create(TRUE,NULL,NULL);
	pFindDlg->ShowWindow(SW_SHOW);
    m_bFind=TRUE;//查找


	
}

//替换
void CnotepadPlusDlg::OnReplace()
{
	CFindReplaceDialog* pFindDlg = new CFindReplaceDialog;
	//第一个:TRUE 代表查找框  FALSE 代表替换框
	//第二个参数:要查找的东西
	//第三个:要替换的东西
	pFindDlg->Create(FALSE, NULL, NULL);
	pFindDlg->ShowWindow(SW_SHOW);
	m_bFind = FALSE;//替换
}

对话框消息与对话框处理函数

在这里插入图片描述
在这里插入图片描述

对话框处理函数

//CFindReplaceDialog处理函数
LONG CnotepadPlusDlg::OnFindReplace(WPARAM wParam, LPARAM lParam)
{
	CFindReplaceDialog* pFindReplaceDlg = CFindReplaceDialog::GetNotifier(lParam);//接收查找到的参数,获取窗口指针
	if (pFindReplaceDlg == NULL)
		return 0;

	//pFindReplaceDlg->IsTerminating();//是否点击关闭
	if (pFindReplaceDlg->IsTerminating())
	{
		return 0;
	}

	CString strFindString=pFindReplaceDlg->GetFindString();//要查找的字符串
	CString strRepalceString = pFindReplaceDlg->GetReplaceString();//要替换的字符串
	BOOL bSearchDown=pFindReplaceDlg->SearchDown();//判断是否向下查找
	BOOL bMatchCase=pFindReplaceDlg->MatchCase();//匹配大小写

	int nStartIndex = 0, nEndIndex = 0;//光标的开始和结束位置

	//获取编辑框里面的所有文本
	CString strContent;
	GetDlgItemText(IDC_EDIT1, strContent);
	//操纵控件
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

	//查找
	if (m_bFind)
	{
		
		//向下查找
		if (bSearchDown)
		{
			//获取光标位置
			pEdit->GetSel(nStartIndex, nEndIndex);
			nStartIndex=strContent.Find(strFindString, nEndIndex);//要查找的内容一直到结束位置

			//找到了
			if (nStartIndex != -1)
			{
				pEdit->SetSel(nStartIndex, nStartIndex + strFindString.GetLength());
				pEdit->SetFocus();//蓝色
			}
			else
			{
				//找不到重头开始找
				nStartIndex = strContent.Find(strFindString, 0);
				//找不到
				if (nStartIndex == -1)
				{
					MessageBox(L"没有找到");
					return 0;
				}
				pEdit->SetSel(nStartIndex, nStartIndex + strFindString.GetLength());
				pEdit->SetFocus();//蓝色
				
			}

		}
		else//向上查找
		{
			pEdit->GetSel(nStartIndex, nEndIndex);
			strContent = strContent.MakeReverse();//反转字符串倒着查找
			CString strReverseFindString=strFindString.MakeReverse();//反转后查找字符串
			nStartIndex = strContent.Find(strReverseFindString,strContent.GetLength()-nStartIndex);//要查找的内容一直到结束位置,比如有10个是第二个数为2,反转后在第八个数的位置上

			if (nStartIndex != -1)
			{
				//设置光标
				nEndIndex = strContent.GetLength()-nStartIndex-1;
				pEdit->SetSel(nEndIndex+1-strFindString.GetAllocLength(),nEndIndex+1);
				pEdit->SetFocus();
			}
			else
			{

			}
		}

	}
	else//替换
	{
		//查找下一个
		if (pFindReplaceDlg->FindNext())
		{

		}
		//替换当前
		if (pFindReplaceDlg->ReplaceCurrent())
		{
			nStartIndex=strContent.Find(strFindString);
			if (nStartIndex == -1)
			{
				MessageBox(L"没有查找到");
				return 0;
			}
			else
			{
				nEndIndex = nStartIndex + strFindString.GetLength();
				//做截取
				CString strLeft=strContent.Left(nStartIndex);//获取左右
				CString strRight = strContent.Right(strContent.GetLength()- nEndIndex);
				//替换的链接
				strContent = strLeft + strRepalceString + strRight;
				pEdit->SetWindowText(strContent);//设置文本内容
			}
		}

		//替换全部
		if (pFindReplaceDlg->ReplaceAll())
		{
			int nCount= strContent.Replace(strFindString,strRepalceString);
			pEdit->SetWindowText(strContent);
			CString str;
			str.Format(L"总共替换了%d处", nCount);
			MessageBox(str);
		}
	}
	return 0;
}

全部代码

//notepadPlusDlg.h

// notepadPlusDlg.h: 头文件
//

#pragma once


// CnotepadPlusDlg 对话框
class CnotepadPlusDlg : public CDialogEx
{
// 构造
public:
	CnotepadPlusDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_NOTEPADPLUS_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	COLORREF m_color;
	BOOL m_bFind;//判断是点击了查找还是替换
	afx_msg void OnBnClickedOk();
	afx_msg void OnEnChangeEdit1();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	
	afx_msg void OnOpen();
	afx_msg void OnSaveAs();
	afx_msg void OnBtmColor();
	afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
	afx_msg void OnBtnFont();
	afx_msg void OnFind();
	afx_msg void OnReplace();
	afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM lParam);//定义关联函数

};

//notepadPlusDlg.cpp

// notepadPlusDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "notepadPlus.h"
#include "notepadPlusDlg.h"
#include "afxdialogex.h"
#include "CCharset.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


//注册消息
static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);

// CnotepadPlusDlg 对话框

CnotepadPlusDlg::CnotepadPlusDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_NOTEPADPLUS_DIALOG, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_color = RGB(0, 0, 0);
    m_bFind=FALSE;

}

void CnotepadPlusDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CnotepadPlusDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CnotepadPlusDlg::OnBnClickedOk)
	ON_EN_CHANGE(IDC_EDIT1, &CnotepadPlusDlg::OnEnChangeEdit1)
	ON_WM_SIZE()
	ON_COMMAND(IDM_OPEN, &CnotepadPlusDlg::OnOpen)
	ON_COMMAND(IDM_SAVE_AS, &CnotepadPlusDlg::OnSaveAs)
	ON_COMMAND(IDM_BTM_COLOR, &CnotepadPlusDlg::OnBtmColor)
	ON_WM_CTLCOLOR()
	ON_COMMAND(IDM_BTN_FONT, &CnotepadPlusDlg::OnBtnFont)
	ON_COMMAND(IDM_FIND, &CnotepadPlusDlg::OnFind)
	ON_COMMAND(ID_REPLACE, &CnotepadPlusDlg::OnReplace)
	ON_REGISTERED_MESSAGE(WM_FINDREPLACE, &CnotepadPlusDlg::OnFindReplace) 
END_MESSAGE_MAP()


// CnotepadPlusDlg 消息处理程序

BOOL CnotepadPlusDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CnotepadPlusDlg::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 CnotepadPlusDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CnotepadPlusDlg::OnBnClickedOk()
{
	// TODO: 在此添加控件通知处理程序代码
	//CDialogEx::OnOK();
}


void CnotepadPlusDlg::OnEnChangeEdit1()
{
	// TODO:  如果该控件是 RICHEDIT 控件,它将不
	// 发送此通知,除非重写 CDialogEx::OnInitDialog()
	// 函数并调用 CRichEditCtrl().SetEventMask(),
	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。

	// TODO:  在此添加控件通知处理程序代码
}


//设置编译框随着窗口的变化而变化
void CnotepadPlusDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	//获取控件
	CWnd* pEdit=GetDlgItem(IDC_EDIT1);
	if(pEdit!=NULL)
		pEdit->MoveWindow(0, 0, cx, cy);
}




//打开文件
void CnotepadPlusDlg::OnOpen()
{

	CFileDialog dlg(TRUE);
	if (IDCANCEL == dlg.DoModal())
		return;
	
	CString strFilePath = dlg.GetPathName();//获取全路径
	CString strFileName = dlg.GetFileName();

	//文件操作
	//CFile 文件类
	CFile file;
	if (FALSE == file.Open(strFilePath, CFile::modeRead))//file.Open(文件路径,文件读取模式)
	{
		MessageBox(L"打开文件失败", L"温馨提示",MB_OK);
		return;
	}
	//读取内容
	CStringA strContent ;//清空数组
	char szContent[10] = { 0 };
	while (file.Read(szContent, 2))
	{
		strContent = strContent+szContent;//内容连接
	}
	
	//编码转换
	CCharset charset;
	wchar_t* wContent=charset.AnsiToUnicode(strContent);

	//设置窗口
	SetDlgItemText(IDC_EDIT1, wContent);

	//设置标题
	CString strTitle;
	strTitle.Format(L"超级记事本-%s[%d字节]", strFileName, file.GetLength());
	SetWindowText(strTitle);

	file.Close();
}


//另存为
void CnotepadPlusDlg::OnSaveAs()
{
	CFileDialog dlg(FALSE,NULL,NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");
	if (IDCANCEL == dlg.DoModal())
		return;
	CString strFilePath = dlg.GetPathName();
	CFile file;
	if (FALSE == file.Open(strFilePath, CFile::modeCreate |CFile::modeWrite))//file.Open(文件路径,文件读取模式)
	{
		MessageBox(L"打开文件失败", L"温馨提示", MB_OK);
		return;
	}

	//读取出控件中所有的文本
	CString strContent;
	GetDlgItemText(IDC_EDIT1, strContent);

	//另存为Unicode
	CCharset charset;
	char* content=charset.UnicodeToAnsi(strContent);


	//file.Write(strContent, strContent.GetLength() * 2);
	file.Write(content, strlen(content));
	file.Close();

	
}


//设置颜色
void CnotepadPlusDlg::OnBtmColor()
{
	CColorDialog dlg;
	if (IDCANCEL == dlg.DoModal())
		return;
    m_color = dlg.GetColor();//获取到颜色
	
}

//编辑控件颜色
HBRUSH CnotepadPlusDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	switch (pWnd->GetDlgCtrlID())
	{
		case IDC_EDIT1:
			pDC->SetTextColor(m_color);
			break;
	}
	
	return hbr;
}

//修改字体
void CnotepadPlusDlg::OnBtnFont()
{
	//字体选择对话框
	CFontDialog dlg;
	if (IDCANCEL == dlg.DoModal())
		return;
	//设置字体
	CFont font;
	font.CreatePointFont(dlg.GetSize(), dlg.GetFaceName());
	GetDlgItem(IDC_EDIT1)->SetFont(&font);
}







//显示
//查找非模态对话框,需要注册消息
void CnotepadPlusDlg::OnFind()
{
	CFindReplaceDialog* pFindDlg=new CFindReplaceDialog;
	//第一个:TRUE 代表查找框  FALSE 代表替换框
	//第二个参数:要查找的东西
	//第三个:要替换的东西
	pFindDlg->Create(TRUE,NULL,NULL);
	pFindDlg->ShowWindow(SW_SHOW);
    m_bFind=TRUE;//查找


	
}

//替换
void CnotepadPlusDlg::OnReplace()
{
	CFindReplaceDialog* pFindDlg = new CFindReplaceDialog;
	//第一个:TRUE 代表查找框  FALSE 代表替换框
	//第二个参数:要查找的东西
	//第三个:要替换的东西
	pFindDlg->Create(FALSE, NULL, NULL);
	pFindDlg->ShowWindow(SW_SHOW);
	m_bFind = FALSE;//替换
}


//CFindReplaceDialog处理函数
LONG CnotepadPlusDlg::OnFindReplace(WPARAM wParam, LPARAM lParam)
{
	CFindReplaceDialog* pFindReplaceDlg = CFindReplaceDialog::GetNotifier(lParam);//接收查找到的参数,获取窗口指针
	if (pFindReplaceDlg == NULL)
		return 0;

	//pFindReplaceDlg->IsTerminating();//是否点击关闭
	if (pFindReplaceDlg->IsTerminating())
	{
		return 0;
	}

	CString strFindString=pFindReplaceDlg->GetFindString();//要查找的字符串
	CString strRepalceString = pFindReplaceDlg->GetReplaceString();//要替换的字符串
	BOOL bSearchDown=pFindReplaceDlg->SearchDown();//判断是否向下查找
	BOOL bMatchCase=pFindReplaceDlg->MatchCase();//匹配大小写

	int nStartIndex = 0, nEndIndex = 0;//光标的开始和结束位置

	//获取编辑框里面的所有文本
	CString strContent;
	GetDlgItemText(IDC_EDIT1, strContent);
	//操纵控件
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);

	//查找
	if (m_bFind)
	{
		
		//向下查找
		if (bSearchDown)
		{
			//获取光标位置
			pEdit->GetSel(nStartIndex, nEndIndex);
			nStartIndex=strContent.Find(strFindString, nEndIndex);//要查找的内容一直到结束位置

			//找到了
			if (nStartIndex != -1)
			{
				pEdit->SetSel(nStartIndex, nStartIndex + strFindString.GetLength());
				pEdit->SetFocus();//蓝色
			}
			else
			{
				//找不到重头开始找
				nStartIndex = strContent.Find(strFindString, 0);
				//找不到
				if (nStartIndex == -1)
				{
					MessageBox(L"没有找到");
					return 0;
				}
				pEdit->SetSel(nStartIndex, nStartIndex + strFindString.GetLength());
				pEdit->SetFocus();//蓝色
				
			}

		}
		else//向上查找
		{
			pEdit->GetSel(nStartIndex, nEndIndex);
			strContent = strContent.MakeReverse();//反转字符串倒着查找
			CString strReverseFindString=strFindString.MakeReverse();//反转后查找字符串
			nStartIndex = strContent.Find(strReverseFindString,strContent.GetLength()-nStartIndex);//要查找的内容一直到结束位置,比如有10个是第二个数为2,反转后在第八个数的位置上

			if (nStartIndex != -1)
			{
				//设置光标
				nEndIndex = strContent.GetLength()-nStartIndex-1;
				pEdit->SetSel(nEndIndex+1-strFindString.GetAllocLength(),nEndIndex+1);
				pEdit->SetFocus();
			}
			else
			{

			}
		}

	}
	else//替换
	{
		//查找下一个
		if (pFindReplaceDlg->FindNext())
		{

		}
		//替换当前
		if (pFindReplaceDlg->ReplaceCurrent())
		{
			nStartIndex=strContent.Find(strFindString);
			if (nStartIndex == -1)
			{
				MessageBox(L"没有查找到");
				return 0;
			}
			else
			{
				nEndIndex = nStartIndex + strFindString.GetLength();
				//做截取
				CString strLeft=strContent.Left(nStartIndex);//获取左右
				CString strRight = strContent.Right(strContent.GetLength()- nEndIndex);
				//替换的链接
				strContent = strLeft + strRepalceString + strRight;
				pEdit->SetWindowText(strContent);//设置文本内容
			}
		}

		//替换全部
		if (pFindReplaceDlg->ReplaceAll())
		{
			int nCount= strContent.Replace(strFindString,strRepalceString);
			pEdit->SetWindowText(strContent);
			CString str;
			str.Format(L"总共替换了%d处", nCount);
			MessageBox(str);
		}
	}
	return 0;
}

//CCharset.h

#pragma once
class CCharset
{

private:
	wchar_t* m_wstr;
	char* m_str;
	char* m_utf8;
public:
	CCharset();
	~CCharset();

	//ANSIתUnicode
	wchar_t* AnsiToUnicode(const char* str);
	//UnicodeתANSI
	char* UnicodeToAnsi(const wchar_t* wstr);
	//UTF8 תANSI
	char* Utf8ToAnsi(const char* str);
	//ANSIתUTF - 8
	char* AnsitoUtf8(const char* str);
	//Unicode ת UTF-8
	char* UnicodeToUtf8(const wchar_t* wstr);
	//UTF-8תUnicode
	wchar_t* Utf8ToUnicode(const char* str);

};

//CCharset.cpp

#include "pch.h"
#include "CCharset.h"

CCharset::CCharset()
{
	m_wstr = NULL;
	m_str = NULL;
	m_utf8 = NULL;
}


CCharset::~CCharset()
{
	if (m_wstr)
	{
		delete m_wstr;
		m_wstr = NULL;
	}
		
	if (m_str)
	{
		delete m_str;
		m_str = NULL;
	}

	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}
}

//ANSI转Unicode
wchar_t* CCharset::AnsiToUnicode(const char* str)
{
	if (m_wstr)//安全
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}
		
	DWORD dwSize=::MultiByteToWideChar(CP_ACP,0,str,-1,NULL,0);//求宽字符的大小
	m_wstr = new wchar_t[dwSize];
	::MultiByteToWideChar(CP_ACP, 0, str, -1, m_wstr, dwSize);
	return m_wstr;
}

//Unicode转ANSI
char * CCharset::UnicodeToAnsi(const wchar_t * wstr)
{
	if (m_str)
	{
		delete[] m_str;
		m_str = NULL;
	}
	DWORD dwSize=WideCharToMultiByte(CP_ACP, 0, wstr, -1,NULL,0,NULL,NULL);//求字符的大小
	m_str = new char[dwSize];
	::WideCharToMultiByte(CP_ACP, 0, wstr, -1, m_str, dwSize, NULL, NULL);
	return m_str;
}


char * CCharset::Utf8ToAnsi(const char * str)
{
	if (m_wstr)
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}

	if (m_str)
	{
		delete[] m_str;
		m_str = NULL;
	}
	//UTF-8 转Unicode
	m_wstr= Utf8ToUnicode(str);
	//Unicode 转ANSI
	m_str= UnicodeToAnsi(m_wstr);
	return m_str;
}

char* CCharset::AnsitoUtf8(const char* str)
{
	if (m_wstr)
	{
		delete[] m_wstr;
		m_wstr = NULL;
	}

	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}

	//Ansi 转Unicode
	m_wstr= AnsiToUnicode(str);
	//Unicode 转UTF-8
	m_utf8=UnicodeToUtf8(m_wstr);

	return m_utf8;
}

//Unicode 转 UTF-8
char * CCharset::UnicodeToUtf8(const wchar_t * wstr)
{
	if (m_utf8)
	{
		delete[] m_utf8;
		m_utf8 = NULL;
	}
	DWORD dwSize=WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	m_utf8 = new char[dwSize];
	memset(m_utf8,0,dwSize);//清空内存
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, m_utf8, dwSize, NULL, NULL);
	return m_utf8;
}

//utf8 转Unicode
wchar_t* CCharset::Utf8ToUnicode(const char * str)
{
	if (m_wstr)
	{
		delete m_wstr;
		m_wstr = NULL;
	}
	DWORD dwSize=MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
	m_wstr = new wchar_t[dwSize];
	memset(m_wstr, 0, dwSize*sizeof(wchar_t));//清空内存
	MultiByteToWideChar(CP_UTF8, 0, str, -1, m_wstr, dwSize);
	return m_wstr;
}

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

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

相关文章

Nightingle夜莺Docker版SNMP监控

起因 对夜莺很感兴趣&#xff0c;想使用一下。我看官方提供了v6版本的docker-compose。而且我之前有使用过promtheus和grafana&#xff0c;虽然很好但是总觉得还是得二开。总有一天有人去搞一个不错的玩意儿出来。官方文档地址 安装与配置 直接运行docker版本的demo&#xf…

mysql内部结构和InnoDB底层原理

一、mysql内部结构 mysql总体上分为客户端、Server层、引擎层&#xff0c;具体如下图&#xff1a; 1、连接器 一般客户端通过jdbc、navicat等工具发送请求连接到mysql服务端&#xff0c;完成TCP三次握手后&#xff0c;连接器就开始认证身份&#xff0c;如果身份认证成功&…

数据结构-串、数组和广义表

数据结构之串、数组和广义表 串的定义一、串的顺序存储结构1.1、串的链式存储结构1.2、串的模式匹配算法1.2.1、Brute-Force简称为BF算法1.2.2、KMP算法 数组的定义2.1、数组的顺序存储结构2.2、数组的特点&#xff1a;结构固定-----维数和维界不变2.3、特殊矩阵的压缩存储 广义…

密码学—Kasiski测试法Python程序

Kasiski Kasiski是辅助破解Vigenere的前提工作&#xff0c;Kasiski是猜测加密者使用Vigenere密码体系的密钥的长度&#xff0c;Kasiski只是猜测长度而已&#xff0c;所以说是辅助破解Vigenere 若密文中出现两个相同的密文段(密文段的长度m>2)&#xff0c;则它们对应的明文&…

leetcode第66题:加一

题目 这是一道简单的小题&#xff0c;自己却也没写出来。。。逆序遍历数组digits&#xff0c;用carry标记当前元素是否需要进位&#xff08;0不要&#xff0c;1要&#xff09;。 若carry1&#xff0c;则当前元素要么置0&#xff0c;要么自加1。自加1之后&#xff0c;再也不需要…

【深入了解Spring Cloud Alibaba Nacos:服务注册和配置中心】—— 每天一点小知识

&#x1f4a7; 深入了解 S p r i n g C l o u d A l i b a b a N a c o s &#xff1a;服务注册和配置中心 \color{#FF1493}{深入了解Spring Cloud Alibaba Nacos&#xff1a;服务注册和配置中心} 深入了解SpringCloudAlibabaNacos&#xff1a;服务注册和配置中心&#x1f4a7;…

深入浅出解析LoRA完整核心基础知识 | 【算法兵器谱】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【算法兵器谱】栏目专注分享AI行业中的前沿/经典/必备的模型&论文&#xff0c;并对具备划时代意义的模型&论文进行全方位系统的解析&#xff0c;比如Rocky之前出品的爆款文章Make YOLO Great Again系列。也欢迎大家提…

让Ai帮我们画个粽子,它会画成什么样呢?

让Ai帮我们画个粽子&#xff0c;它会画成什么样呢&#xff1f; 本文目录&#xff1a; 一、Ai绘图技术的现状 二、看看Ai理解的粽子是怎样的 2.1、基础粽子 2.2、生成不同风格的粽子 2.2.1、真实风格的粽子 2.2.2、插图风格的粽子 2.2.3、3D风格的粽子 2.2.4、卡通风格…

Mysql锁机制介绍

Mysql锁机制 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中&#xff0c;除传统的计算资源(如CPU、RAM、I/O等)的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题&#xff0…

vue-cli笔记

vue的生命周期&#xff1a; 借鉴react 钩子函数&#xff1a; change() 挂载完毕&#xff0c;vue完成模板解析&#xff0c;并把初始的真实的dom元素放入到页面后执行 beforeCreate() {// 数据代理和数据监测创建之前console.log(beforeCreate) }, created() {console.l…

深度:全面解析数据智能的金融“炼金术”!

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 金融以其财富效应&#xff0c;成为最新科技的试金石。一项新技术出来后&#xff0c;人们首先闪过的念头就是“能不能用它赚钱”。例如&#xff0c;ChatGPT带火了大模型&#xff0c;人们也开始将目标聚焦到大模型在金融领域的…

【实战】 JWT、用户认证与异步请求(下) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(五)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1~56.用useAuth切换登录与非登录状态7.用fetch抽象通用HTTP请求方法&#xff0c;增强通用性8.用useHt…

AR宇航员互动体验软件:虚拟与现实叠加增强体验感

随着科技的不断发展&#xff0c;人们对太空探索的兴趣和热情也越来越高涨。为了满足人们对太空探索的渴望&#xff0c;广州华锐互动研发了宇航员AR模拟体验软件&#xff0c;这种软件可以让用户身临其境地体验太空探索的过程&#xff0c;提供一种全新的、令人兴奋的太空探索新体…

css基础知识十一:CSS3新增了哪些新特性?

一、是什么 css&#xff0c;即层叠样式表&#xff08;Cascading Style Sheets&#xff09;的简称&#xff0c;是一种标记语言&#xff0c;由浏览器解释执行用来使页面变得更为美观 css3是css的最新标准&#xff0c;是向后兼容的&#xff0c;CSS1/2的特性在CSS3 里都是可以使用…

图解CNN中的卷积(卷积运算、池化、Padding、多通道的卷积)

文章目录 卷积操作池化Padding对多通道&#xff08;channels&#xff09;图片的卷积套上激活函数是什么样的参考&#xff1a; 卷积层是深度学习神经网络中经常使用的一种层。它通过卷积运算来提取输入的特征&#xff0c;常用于图像、语音等信号处理任务中。 卷积层有以下几个参…

rocketmq-spring-boot-starter支持SpringBoot 1.x(spring-context 4.x)版本

1 问题说明 由于历史原因&#xff0c;项目使用的是SpringBoot1.x版本&#xff0c;而且由于种种原因&#xff0c;不能升级。在项目开发迭代过程中&#xff0c;决定使用RocketMQ作为消息中间件&#xff0c;因为是SpringBoot项目&#xff0c;理所应当的引入了rocketmq-spring-boo…

简单聊聊数字孪生与GIS融合的必要性

随着科技的不断发展和应用的不断深入&#xff0c;数字孪生和GIS在各自领域中展现出巨大的潜力。然而&#xff0c;更引人注目的是&#xff0c;数字孪生和GIS的融合将为许多行业带来全新的机遇和变革。在本文中&#xff0c;我们将探讨数字孪生和GIS融合的必要性&#xff0c;以及它…

2023ty计网期末综合题满分冲刺版

1. 假设有段1km长的CSMA/CD网络链路的数据传输率为1Gb/s。设信号在此链路媒介上的传播速度为2x105 km/s&#xff0c;求使用此协议的最短数据帧长度。 &#xff08;1&#xff09;传播时延&#xff1a;1/2000005微秒&#xff0c; &#xff08;2&#xff09;往返时延&#xff1a…

List合并的操作

List合并的操作 1.addAll方法 List list1new ArrayList();List list2new ArrayList();for (int i 0; i < 10; i) {list1.add(i*2);list2.add(i*21);}System.out.println(list1);//方法1&#xff1a;addAlllist1.addAll(list2);System.out.println(list1); 2.Stream操作 L…

ATTCK(二)之ATTCK的发展历史

ATT&CK的发展历史 MITRE公司 MITRE是美国NIST标准化组织选择的专注于网络安全的组织&#xff0c;由美国联邦政府资助。很多安全标准都MITRE制定的&#xff0c;比如有名的漏洞CVE编号规则以及威胁情报格式STIX。所以ATT&CK非常有影响力&#xff0c;而且未来能成为一个公…