MFC使用RichEditor显示消息

        在VC10的MFC中,RichEditor富文本控件升至2.0版本,现在使用RichEditor可以显示多种内容,这篇博客将提供一个方法,将这个方法封装在类中可以轻松的使用RichEditor显示文本消息,我们开始吧!

        首先,我们为对话框添加一个RichEditor编辑框,你可以设置这个对话框不接受输入,可以设置其属性(快捷键F4)为拒绝输入,这样它就成为一个只用于显示的控件了。

        关于RichEditor的安装和使用方法,推荐这两篇博客:RichEidt的基本使用方法RichEdit使用方法总结RichEdit控件的使用。这里特别提醒,添加初始化实例的位置要和博客中提示的一致,否则仍有可能导致编译错误。

        添加好控件之后,在我们的类中添加AppendMessage方法,其中m_pMsgCtrl为指向RichEditor控件变量的指针,下面的代码对AppendMessage方法进行重载,你可以输入std::string类型,也可以输入LPCTSTR类型,在输入string类型时进行宽字节转换,然后再送入LPCTSTR参数类型的处理方法。如下代码适配UNICODE,如果在你的MFC程序中不使用UNICODE而使用宽字节字符集,那么你可能需要修改一些代码。

void CModelLabelToolDlg::AppendMessage(std::string msg){
	//std::string msg = tmp + path + name + "\n";
	size_t size = msg.length();
	wchar_t *w_msg = new wchar_t[size + 1];
	MultiByteToWideChar(CP_ACP, 0, msg.c_str(), size, w_msg, size * sizeof(wchar_t));
	w_msg[size] = 0;
	AppendMessage((LPCTSTR)w_msg);
}

void CModelLabelToolDlg::AppendMessage(LPCTSTR strText){
	if (NULL == m_pMsgCtrl){
		return;
	}
	strText = strText;
	CString addTimeStr;
	SYSTEMTIME sysTime;
	GetLocalTime(&sysTime);
	addTimeStr.Format(_T("%4d/%02d/%02d %02d:%02d:%02d: %s"), sysTime.wYear, sysTime.wMonth,
		sysTime.wDay, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, strText);
	//fprintf(m_infoFile, "%s", (CStringA)addTimeStr);	// save to txt file

	HWND hWnd = m_pMsgCtrl->GetSafeHwnd();
	
	ULONG_PTR dwResult = 0;
	ULONG_PTR p = dwResult;
	if (SendMessageTimeoutW(hWnd, WM_GETTEXTLENGTH, 0, 0, SMTO_NORMAL, 1000L, &dwResult) != 0)
	{
		int nLen = (int)dwResult;
		if (SendMessageTimeout(hWnd, EM_SETSEL, nLen, nLen, SMTO_NORMAL, 1000L, &dwResult) != 0)
		{
			if (SendMessageTimeout(hWnd, EM_REPLACESEL, FALSE, (LPARAM)(LPCTSTR)addTimeStr,
				SMTO_NORMAL, 1000L, &dwResult) != 0)
			{
			}
		}
	}
	m_pMsgCtrl->LineScroll(1);
}

        我们在使用过程中,首先需要绑定控件,就是将m_pMsgCtrl指向要显示的控件,由于代码采用SendMessageTimeout发送消息,所以,你完全可以在其它类中添加上面的方法,而显示控件仍为主对话框类。

        然后我们要显示信息时,可以给出如下参考代码:

std::string msg = "This is a message.\n";
AppendMessage(msg);

        这样,我们就可以在任何类中,将消息流指向指定对话框中得富文本控件了。

        See You Next Chapter!

发表评论