windows第八章 系统对话框

文章目录

  • 文件选择对话框
    • CFileDialog
    • CFile文件操作
    • CFolderPickerDialog
  • 字符集编码
    • uincode编码
    • ANSI字符和Unicode字符
    • Windows中的Unicode函数
    • C运行库中的Unicode函数
    • Unicode与ANSI字符串转换
  • 颜色选择对话框
    • CColorDialog
  • 字体选择对话框
    • CFontDialog

文件选择对话框

CFileDialog

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

CFile文件操作

读取

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();//关闭文件
}

CFolderPickerDialog

void C对话框Dlg::OnBnClickedButtonOpendir()
{
	CFolderPickerDialog dlg;//创建文件夹选择对话框
	if (dlg.DoModal() == IDOK)
	{
		MessageBox(dlg.GetPathName());//获取文件夹路径
	}
}

字符集编码

某些语言文字系统字符集非常多,但是一个字节最多能够表示256个字符,为了支持这些语言文字系统,双字节字符集应运而生。

双字节字符集:
一个字符串中的一个字符由1个或者2个字节组成。如果第一个字符在0x81~0x9F之间,或者在0xE0 ~0xFC之间,就必须检查下一个字节,才能判断出一个完整的汉字。所以有些字符是1字节,有些字符是2字节,处理比较复杂

uincode编码

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字符和Unicode字符

ANSI编码
在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 JIS 编码

Windows中的Unicode函数

wchar_t 是指unsinged short 是2个字节

C运行库中的Unicode函数

Unicode与ANSI字符串转换

  1. utf-8转 ANSI
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();//关闭文件

}
  1. ANSI转utf-8
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();//关闭文件
}

颜色选择对话框

CColorDialog

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

字体选择对话框

CFontDialog

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);//设置字体
}

你可能感兴趣的:(windows基础,windows)