在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!