我的一个聊天程序,显示聊天内容是用的RichEditCtrl,显示内容的过程是,把当前显示框中已经有的内容加上新来的内容,再显示出来
m_strHistory=m_strHistory+str_final;
m_DisplayMsg.SetText(m_strHistory);
聊天信息中我用结构体包含了CHATFORMAT 字体属性,想根据聊天信息中的字体属性显示在这个RichEdit中,就像QQ群里一样,每个人说的话都是各自设置的颜色字体。但现在我遇到问题了,如何在RichEdit中显示聊天内容时根据接收到的信息中的字体属性显示在RichEdit中呢?我用SetDefaultCharFormat,那样所有显示的内容都变成了刚刚收到的那个信息里带的字体属性了,用SetSel(nStart, nEnd)然后用SetSelectionCharFormat也得不到想要的效果,SetSel里的起始位置也不好判断。
有没有什么其他好的方法,不用我的这种m_strHistory=m_strHistory+str_final的方式
恳请达人赐教,小弟不甚感激。
m_strHistory=m_strHistory+str_final;
m_DisplayMsg.SetText(m_strHistory);
聊天信息中我用结构体包含了CHATFORMAT 字体属性,想根据聊天信息中的字体属性显示在这个RichEdit中,就像QQ群里一样,每个人说的话都是各自设置的颜色字体。但现在我遇到问题了,如何在RichEdit中显示聊天内容时根据接收到的信息中的字体属性显示在RichEdit中呢?我用SetDefaultCharFormat,那样所有显示的内容都变成了刚刚收到的那个信息里带的字体属性了,用SetSel(nStart, nEnd)然后用SetSelectionCharFormat也得不到想要的效果,SetSel里的起始位置也不好判断。
有没有什么其他好的方法,不用我的这种m_strHistory=m_strHistory+str_final的方式
恳请达人赐教,小弟不甚感激。
解决方案 »
- LocalAlloc和HeapAlloc(GetProcessHeap())的结果,能否混用?
- ···散分,庆祝luaEditor2.12发布···
- 如何让客户端自动接收文件
- 为什么通过交换机能udp通信正常,通过直连就不正常收发
- 求救!关于CreateWindowEx创建ListViewControl出现1407错误!
- 缓冲区读取字符出问题
- 急找MFC的CListCtrl源文件
- 帮帮忙呀 在对话框中间 如何才能实现(我的用new建立的无模式对话框的对象,需要delete吗) 帮帮忙呀帮帮忙呀帮帮忙呀帮帮忙呀帮帮忙呀帮
- 网页判断自己手动安装的ActiveX.ocx插件是否存在,已成功注册安装,但是找不到对象,高手指点给高分!
- 奇怪的free使用 。。。。。。。。。。。。
- 如何将CLIPS嵌入VC++中?
- <object onmousedown= "test()" id="dddd" ...></object> 我的onmousedown事件怎么不触发?
BOOL SetSelectionCharFormat( CHARFORMAT& cf );
typedef struct _charformat {
UINT cbSize;
DWORD dwMask;
DWORD dwEffects;
LONG yHeight;
LONG yOffset;
COLORREF crTextColor;
BYTE bCharSet;
BYTE bPitchAndFamily;
TCHAR szFaceName[LF_FACESIZE];
} CHARFORMAT;
比如说:字符串ABCD,属性为t,则输出为红色;下一个字符串EF,属性为s,则输出在ABC
D之后,为绿色(但是ABCD仍然保持红色)。
SetWordCharFormat(cf); //为将要输入的内容设定字体等格式
ReplaceSel(newString); // 把新内容添加到richedit中,将采用上句设置的格式来显示,已有内容不受影响
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_BOLD|CFM_CHARSET|CFM_COLOR|CFM_FACE|CFM_ITALIC|CFM_SIZE|CFM_UNDERLINE|CFM_STRIKEOUT;
if (m_bIsBold)
{
cf.dwEffects |= CFE_BOLD;
}
if (m_bIsItalic)
{
cf.dwEffects |= CFE_ITALIC;
}
if (m_bIsUnderLine)
{
cf.dwEffects |= CFE_UNDERLINE;
}
if (m_bIsStrikeOut)
{
cf.dwEffects |= CFM_STRIKEOUT;
}
cf.yHeight = abs(m_Font.lfHeight) * 20;
cf.crTextColor = m_crFont;
cf.bCharSet = (BYTE)m_Font.lfCharSet;
_tcscpy((TCHAR *)cf.szFaceName, m_Font.lfFaceName);
SetSel(0, -1);
SetSelectionCharFormat(cf);
SetDefaultCharFormat(cf);
SetWordCharFormat(cf);
SetSel(0, 0);
m_strRichEdit += "5678\r\n";
UpdateData(TRUE); 这样的代码来实现.这种方法有问题. 你应该用下面的ReplaceSel方法来实现内容的显示内容的追加CString m_strRichEdit2 = "1234\r\n";
m_richEdit.SetSel(-1,-1);
m_richEdit.ReplaceSel((LPCTSTR)m_strRichEdit2);