void C对话框Dlg::OnBnClickedButtonOpen()
{
CFileDialog dlg(TRUE, L"txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, L"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");//创建打开文件对话框
if (dlg.DoModal() == IDOK)
{
CString strPath = dlg.GetPathName();//获取文件路径
MessageBox(strPath);
strPath = dlg.GetFileTitle();//获取文件名
SetDlgItemText(IDC_EDIT_FILE, strPath);
POSITION pos = dlg.GetStartPosition();//获取文件列表
while (pos)//遍历文件列表
{
strPath = dlg.GetNextPathName(pos);//获取文件路径,pos指向下一个文件
MessageBox(strPath);
}
}
}
void C对话框Dlg::OnBnClickedButtonSave()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(FALSE, L"txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, L"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");//创建保存文件对话框
if (dlg.DoModal() == IDOK)
{
return;
}
}
读取
void C对话框Dlg::OnBnClickedButtonOpen()
{
CFileDialog dlg(TRUE, L"txt", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, L"文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||");//创建打开文件对话框
if (dlg.DoModal() == IDCANCEL)
{
return;
}
CString path = dlg.GetPathName();//获取文件路径
SetDlgItemText(IDC_EDIT_FILE, path);//将文件路径显示在编辑框中
//读取文件
CFile file(path, CFile::modeRead);//打开文件,只读
if (!file)
{
MessageBox(L"文件打开失败");
return;
}
wchar_t buffer[1024] = { 0 };
while (file.Read(buffer, 1024))
{
SetDlgItemText(IDC_EDIT_DETAIL, buffer);//将文件内容显示在编辑框中,但是此时显示是乱码,因为文件编码格式是UTF-8,而编辑框默认编码格式是ANSI
}
//后续再来处理编码问题
}
保存
void C对话框Dlg::OnMsaveAs()
{
CFileDialog dlg(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("文本文件(*.txt)|*.txt|所有文件(*.*)|*.*||"));//创建保存文件对话框
if (dlg.DoModal() == IDCANCEL)
{
return;
}
CString path = dlg.GetPathName();//获取文件路径
CFile file(path, CFile::modeCreate | CFile::modeWrite);//创建文件
if (!file)
{
MessageBox("文件创建失败");
return;
}
//获取编辑框中的文本
CString str;
GetDlgItemText(IDC_EDIT_DETAIL, str);
file.Write(str, str.GetLength());//将文本写入文件
file.Close();//关闭文件
}
void C对话框Dlg::OnBnClickedButtonOpendir()
{
CFolderPickerDialog dlg;//创建文件夹选择对话框
if (dlg.DoModal() == IDOK)
{
MessageBox(dlg.GetPathName());//获取文件夹路径
}
}
某些语言文字系统字符集非常多,但是一个字节最多能够表示256个字符,为了支持这些语言文字系统,双字节字符集应运而生。
双字节字符集:
一个字符串中的一个字符由1个或者2个字节组成。如果第一个字符在0x81~0x9F之间,或者在0xE0 ~0xFC之间,就必须检查下一个字节,才能判断出一个完整的汉字。所以有些字符是1字节,有些字符是2字节,处理比较复杂
Unicode标准: 1988年由Apple和Xerox共同建立的一项标准。到1991年成立了专门的协会来开发和推动unicode
UTF-8: 将一些字符编码为一个字节,一些字符编码为2个,一些3个,有些是4个
值在 0x0080以下的字符压缩为1个字节
值在0x0080 ~ 0x7FF之间的字符转换为2字节
值在0x0800 ~ 0xFFFF的字符转换为3字节
0x01 0000 ~ 0x1F FFFF的字符为4字节
UTF-16: 将每一个字符编码为两个字节
16位不足以表示某些语言的所有字符,支持使用代理,使用32位来表示一个字符。
UTF-32: 将每个字符编码为4个字节,不是一种高效编码格式。(将字符串保存到文件或者网络传输的时候)
ANSI编码
在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 JIS 编码
wchar_t 是指unsinged short 是2个字节
void C对话框Dlg::OnBnClickedButtonToansi()
{
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("所有文件(*.*)|*.*||"));//创建打开文件对话框
if (dlg.DoModal() == IDCANCEL)
return;
CString path = dlg.GetPathName();//获取文件路径
CFile file(path, CFile::modeRead);//打开文件,只读
if (!file)
return;
char buffer[1024] = { 0 };
while (file.Read(buffer, 1024))
{
wchar_t wbuffer[1024] = { 0 };
MultiByteToWideChar(CP_UTF8, 0, buffer, -1, wbuffer, 1024);//将UTF-8编码的文件内容转换为unicode
char ansibuffer[1024] = { 0 };
WideCharToMultiByte(CP_ACP, 0, wbuffer, -1, ansibuffer, 1024, NULL, NULL);//将unicode转换为ANSI编码格式
SetDlgItemText(IDC_EDIT_DETAIL, ansibuffer);//将文件内容显示在编辑框中
}
file.Close();//关闭文件
}
void C对话框Dlg::OnBnClickedButtonToutf8()
{
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("所有文件(*.*)|*.*||"));//创建打开文件对话框
if (dlg.DoModal() == IDCANCEL)
return;
CString path = dlg.GetPathName();//获取文件路径
CFile file(path, CFile::modeRead);//打开文件,只读
if (!file)
return;
char buffer[1024] = { 0 };
while (file.Read(buffer, 1024))
{
wchar_t wbuffer[1024] = { 0 };
MultiByteToWideChar(CP_ACP, 0, buffer, -1, wbuffer, 1024);//将ANSI编码的文件内容转换为unicode
char utf8buffer[1024] = { 0 };
WideCharToMultiByte(CP_UTF8, 0, wbuffer, -1, utf8buffer, 1024, NULL, NULL);//将unicode转换为UTF-8编码格式
SetDlgItemText(IDC_EDIT_DETAIL, utf8buffer);//将文件内容显示在编辑框中,显示的是乱码,编辑框默认编码格式是ANSI
}
file.Close();//关闭文件
}
void C对话框Dlg::OnMcolor()
{
CColorDialog dlg;//创建颜色选择对话框
if (dlg.DoModal() == IDCANCEL)
return;
COLORREF color = dlg.GetColor();//获取选择的颜色
m_clr = color;//将选择的颜色保存到成员变量中
Invalidate();//刷新窗口,调用OnCtlColor函数
}
HBRUSH C对话框Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
switch (pWnd->GetDlgCtrlID())
{
case IDC_EDIT_DETAIL:
{
pDC->SetTextColor(m_clr);//设置文本颜色
break;
}
default:
break;
}
return hbr;
}
void C对话框Dlg::OnMfont()
{
CFontDialog dlg;//创建字体选择对话框
if (dlg.DoModal() == IDCANCEL)
return;
if (m_font.m_hObject)//如果已经创建了字体,则删除原来的字体
m_font.DeleteObject();//删除原来的字体
m_font.CreatePointFont(dlg.GetSize(), dlg.GetFaceName());//创建字体,m_font为我定义的CFont类型的成员变量
GetDlgItem(IDC_EDIT_DETAIL)->SetFont(&m_font);//设置字体
}