做了一个类似qq聊天的对话框 
发送方的字以绿色显示 
接收到的字以蓝色显示 
但是当richedit里面的字符数超过255的时候 
新添加进去的字还是有颜色 
但以前的字全部变黑色了,望高手们指点! 

解决方案 »

  1.   

    呵呵,我知道怎么改属性,也能成功修改richedit里面选定字的颜色、字体等等
    但是就是添加的内容一旦超过255个字符,前面的格式就丢了
      

  2.   

    /*-==============================================================
      * 增加命令提示,并将控件中的文字总数取得,以便后来确定只读的区域
      * str为在CommandEdit控件中的提示语句
      * bBold 判断显示的字是否为加粗
      * clr   为新增加的字使用什么颜色
      * =================================================================*/
    void CReadOnlyRichEdit::AddText(CString str,BOOL bBold,COLORREF clr)
    {
    //str = "\n" + str;
    LONG nStart,nEnd; 
        //插入传入的字符串
        this->SetSel(0,-1);
        this->GetSel(nStart,nEnd);
        this->SetSel(nEnd,nEnd + 1);
    this->ReplaceSel(str);
        int nLen        = str.GetLength();
        SetSel(nEnd - 1,nEnd + nLen);    DWORD dwEffects = bBold ? CFE_BOLD : 0;
        CHARFORMAT2 cfm;
        cfm.cbSize      = sizeof(cfm);
        cfm.dwEffects   = CFE_BOLD;
        cfm.crTextColor = clr;
      
        //设置字高
        //  cfm.wWeight     = 22;
        //  cfm.yHeight     = 196;
        //  cfm.dwMask      = bBold ? (CFM_BOLD | CFM_COLOR | CFM_SIZE | CFM_WEIGHT) : CFM_COLOR | CFM_SIZE | CFM_WEIGHT;
        cfm.dwMask      = bBold ? (CFM_BOLD | CFM_COLOR) : CFM_COLOR;
        SetSelectionCharFormat(cfm); this->SetSel(0,-1);
    this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);
    this->m_crReadOnlyPos.cpMax -= 1;
    this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);
        this->EnableScrollBar(SB_BOTH,ESB_DISABLE_BOTH);
    }
    我这个添加了过于255字符,好象没有这个问题嘛
      

  3.   

    to: pioneer_public() 我用的和你是同一段代码啊,怎么我的会出现这个问题呢?我用的是richedit2.0
      

  4.   

    哦,
    this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);
    this->m_crReadOnlyPos.cpMax -= 1;
    this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);这三句我没用,因为不知道m_crReadOnlyPos是什么变量。代码都是从网上找来的,没头没尾。
    请问m_crReadOnlyPos是什么呢?
      

  5.   

    this->GetSel(this->m_crReadOnlyPos.cpMin,this->m_crReadOnlyPos.cpMax);
    this->m_crReadOnlyPos.cpMax -= 1;
    this->SetSel(this->m_crReadOnlyPos.cpMax + 1,-1);----这个就是将前面不需要改变的字符不选中,然后修改其他的字符就可以了啊
      

  6.   

    我在用Richedit的过程中,也曾经发现过,如果一直发不同颜色的字体的时候,或者拷贝显示区的字体就会出现颜色乱了。后来才发现,Richedit是先设置格式,然后才对选定的字符串设置颜色以及字体CString strMessage = "Chat Message here."
    //获取显示区域空白处,以免他之前选择的格式覆盖之后要显示的字体和颜色
    GetDlgItem(IDC_RICHEDIT)->SetSel(-1, -1);CHARFORMAT2 cfm;
    cfm.cbSize = sizeof(cfm);
    cfm.crTextColor = clr;
    cfm.dwEffects = CFE_BOLD;
    cfm.dwMask = bBold ? (CFM_BOLD | CFM_COLOR) : CFM_COLOR;
    GetDlgItem(IDC_RICHEDIT)->.SetSelectionCharFormat(cfm);//添加字符串并设置格式
    GetDlgItem(IDC_RICHEDIT)->.SetSel(-1, -1);
    GetDlgItem(IDC_RICHEDIT)->.ReplaceSel(strMessage);