一个在unicode文本插入标签的程序小结

本文介绍如何使用VC++ MFC读取Unicode编码的文件,并实现在EditBox中显示及分页。同时,文章详细说明了如何通过鼠标点击和键盘输入在EditBox中插入标签、处理回车及退格等操作。

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

声明一下开发环境,xp mfc vc6.0

实现的大致要求是,读入一个unicode编码的文件,显示在EditBox中,分页显示(因为我的目标文件能够清晰的分页)。在选定标签后,单击Editbox在光标处插入标签。如果是选定一段文本内容,则在两边插入标签。同时支持回车和退格操作。

1.首先我要实现读取unicode编码的文件并在Editbox上显示。

   vc上默认是不支持unicode显示的,所以要自己做一些改变。至于为何做这样修改,不太清楚。

   在project -> settings -> c/c++ 下,将Prepreocessor definitions的默认的_MDBS去掉,加上_UNICODE和UNICODE , 在settings -> Link 下,Catagory选为Output, Entry-point symbol 改为 wWinMainCRTStartup。

  这样就能对unicode编码文件正确显示,下面是读入的代码

	CFileDialog dlg(TRUE);
	if(dlg.DoModal() == IDOK)
	{
		headPosVec.clear();
		tailPosVec.clear();
		total = 0;
		str.Empty();
		fileName = dlg.GetPathName();	
		//transfer CString to char*  for FILE 
		int nSize = WideCharToMultiByte(CP_ACP, 
						NULL,
						fileName.GetBuffer(fileName.GetLength()),
						-1,
						NULL,
						0,
						NULL,
						FALSE
						);
		char *pName = new char[nSize];
		WideCharToMultiByte(CP_ACP,
					        NULL,
						fileName.GetBuffer(fileName.GetLength()),
						-1,
						pName,
						nSize,
						NULL,
						FALSE
						);
		
		FILE *file;
		if((file = fopen(pName,"rb")) == NULL)
			return;


		int len;
		while(1)
		{
			wchar_t tempStr[10240 + 1] = {0};
			len = fread(tempStr, sizeof(wchar_t), 10240, file);
			str += tempStr;
			if(len != 10240)
				break;
		}

}

GetDlgItem(XXX)->SetWindowText(str);

这里使用了CFIleDialog类,选定文件后,文件全名保存为CString,因为我要使用FILE对文件进行读取和写入,所以要将CString 转换成 char *,这是在unicode环境下的,CString保存的对象是wchar_t,即2个字节的?

文件读入要使用wchar_t作为基本读入单位。


2. 插入标签和其他操作

  这个直接利用Cedit的Getsel函数,得到光标的位置然后插入指定标签就可以了。因为要在鼠标点击时响应插入事件所以,必须拦截点击事件。在你的DLG对象中,重载 

BOOL PreTranslateMessage(MSG *pMsg)函数

代码如下:

BOOL CNextPreEditDlg::PreTranslateMessage(MSG *pMsg)
{
	if(pMsg->message == WM_LBUTTONUP && pMsg->hwnd == m_txtBox->m_hWnd)
	{
		if(!startLabel.IsEmpty())
		{
			insertLabel();
			//saveFile();

		}
	}
	if(pMsg->message == WM_KEYDOWN)
	{
		//为什么这里回车事件会响应2次???  原因是响应了 keydown  和  keyup ,
		if(pMsg->wParam == VK_RETURN )
		{	
			insertReturn();
			//saveFile();
		}

		if(pMsg->wParam == VK_BACK)
		{
			deleteCurWchar();
		}

		if(pMsg->wParam == VK_LEFT)
		{
			OnButtonPrevious();
		}

		if(pMsg->wParam == VK_RIGHT)
		{
			OnButtonNext();
		}
	}
	return CDialog::PreTranslateMessage(pMsg);
}
同理,可响应其他事件,例如回车啊,退格啊。



3.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值