MFC记事本

本文介绍了一种文本编辑器如何处理不同编码的文本文件读取,包括ANSI、UTF-8和Unicode格式,以及实现拖放、复制、粘贴、全选、时间日期插入等功能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于实现文件的拖拽二进制和非二进制文本文件的显示(WM_DROPFILES)消息函数,以及复制,粘贴,全选,时间日期的添加,删除,剪切功能的实现。

以下展示部分关键代码:

void CjishibenDlg::ReadAnsi(CFile& file)//读取方式1:ANSI //传对象传引用
{
	file.Seek(0, CFile::begin);//回到头开始
	char buff[1024];
	UINT nRet = 0;//三种文件:ANSI:窄字符集 Unicode:宽字符集也叫UTF-16 UTF-8:窄字符集:属于Unicode 
	CString str;
	while (nRet = file.Read(buff, sizeof(buff) - 1))//nRet != 0
	{
		buff[nRet] = _T('\0');
		str += buff;
	}
	SetDlgItemText(IDC_TEXT, str);
}

void CjishibenDlg::ReadUTF8(CFile& file)//UTF-8文件编码读取
{
	file.Seek(3, CFile::begin);//向后移动三个字节
	LONGLONG nLen = file.GetLength();//64位操作系统
	char* p = new char[nLen + 1];
	nLen = file.Read(p, nLen);
	p[nLen] = '\0';
	TCHAR* pText = new TCHAR[nLen / 2 + 2];//防止不够 + 2
	nLen = MultiByteToWideChar(CP_UTF8, NULL, p, -1, pText, nLen / 2 + 2);//代入p 传出 pText
	SetDlgItemText(IDC_TEXT, pText);
	delete[] p;
	delete[] pText;
}

void CjishibenDlg::ReadUnicode(CFile& file)//Unicode文件编码获取
{
	file.Seek(2, CFile::begin);//向后移动三个字节
	LONGLONG nLen = file.GetLength();//64位操作系统
	TCHAR* pText = new TCHAR[nLen / 2 + 1];//防止不够 + 1
	nLen = file.Read(pText, nLen);
	pText[nLen / 2] = _T('\0');
	SetDlgItemText(IDC_TEXT, pText);
	delete[] pText;
}

void CjishibenDlg::OnDropFiles(HDROP hDropInfo) //WM_DROPFILES
{
	CDialogEx::OnDropFiles(hDropInfo);
	TCHAR sFile[256];
	int nCount = DragQueryFile(hDropInfo, 0, sFile, _countof(sFile));
	CFile file;
	if (!file.Open(sFile, CFile::modeRead))
	{//文件在拖动过程被删除了,或者文件被占用
		AfxMessageBox(_T("打开文件时失败!请检查文件名称是否正确!"));
		return;
	}
	if (file.Read(sFile,2) == 2)
	{
		switch (sFile[0])
		{
		case 0xBBEF:
			ReadUTF8(file);
			return;
		case 0xFFFE:
			ReadUnicode(file);
			return;
		}
	}
	ReadAnsi(file);
	/*file.Close();*/
	//int i = 0;
	//while (i < nCount)
	//{
	//	DragQueryFile(hDropInfo, i, sFile, _countof(sFile));
	//	++i;
	//} 
}
void CjishibenDlg::OnSize(UINT nType, int cx, int cy)//改变窗口大小//WM_SIZE
{
	CDialogEx::OnSize(nType, cx, cy);
	CWnd* p =  GetDlgItem(IDC_TEXT);//IDOK//IDCANCEL
	if (p)
	{
		CRect rect;
		GetClientRect(rect);
		p->MoveWindow(rect);
	}
}
void CjishibenDlg::OnEditPaste()//粘贴 ID_EDIT_PASTE
{
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
	pEdit->Paste();
}


void CjishibenDlg::OnEditClear()//删除
{
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
	pEdit->Clear();
}


void CjishibenDlg::OnEditSelect()//全选
{
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
	pEdit->SetSel(0, -1);
}


void CjishibenDlg::OnEditCopy()//复制
{
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
	pEdit->Copy();
}


void CjishibenDlg::OnEditCut()//剪切
{
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
	pEdit->Cut();
}

void CjishibenDlg::OnEditDate()//时间
{
	COleDateTime time = COleDateTime::GetCurrentTime();
	CString str = time.Format(_T("%H:%M %Y/%m/%d %W"));
	CEdit* pEdit = (CEdit*)GetDlgItem(IDC_TEXT);
	pEdit->ReplaceSel(str);//选中插入
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值