我的一个聊天程序,显示聊天内容是用的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的方式
恳请达人赐教,小弟不甚感激。

解决方案 »

  1.   

    BOOL SetDefaultCharFormat( CHARFORMAT& cf );
    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; 
      

  2.   

    要实现的东西其实很简单,但是就是搞不对啊,大虾们帮忙呀~   
      比如说:字符串ABCD,属性为t,则输出为红色;下一个字符串EF,属性为s,则输出在ABC   
      D之后,为绿色(但是ABCD仍然保持红色)。  
      

  3.   

    基本操作过程如下:SetSel(-1,-1); //将光标放在文本最末
    SetWordCharFormat(cf); //为将要输入的内容设定字体等格式
    ReplaceSel(newString); // 把新内容添加到richedit中,将采用上句设置的格式来显示,已有内容不受影响
      

  4.   

    设置字体   
      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); 
      

  5.   

    记住: 当你需要向CRichEdit追加内容时,不能用
    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);