选择Menu 点击新建
将内容写入"_"的用& 符号
将菜单加入到窗口中
//设置编译框随着窗口的变化而变化
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;
}