11 MFC 制作记事本

文章目录

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

界面制作

11 MFC 制作记事本_第1张图片

制作菜单

选择Menu 点击新建

11 MFC 制作记事本_第2张图片

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

11 MFC 制作记事本_第3张图片

将菜单加入到窗口中

11 MFC 制作记事本_第4张图片

设置编译框随着窗口的变化而变化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);
}

打开文件

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

11 MFC 制作记事本_第5张图片

点击确定

11 MFC 制作记事本_第6张图片

Edit设置多行显示

11 MFC 制作记事本_第7张图片

Edit设置按回车能够换行

11 MFC 制作记事本_第8张图片

Edit设置竖直方向滚动

11 MFC 制作记事本_第9张图片

打开文件代码

//打开文件
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;
}

11 MFC 制作记事本_第10张图片

修改字体

//修改字体
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;//替换
}

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

11 MFC 制作记事本_第11张图片
11 MFC 制作记事本_第12张图片

对话框处理函数

//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;
}

你可能感兴趣的:(mfc,dreamweaver,html)