我想一个richedit做一个结果显示的程式,如:
Test Video            PASS
Test Signal           PASS
目的是将最后的结果显示颜色PASS 为蓝色,Test Video,Test Signal为黑色.
但我用如下的代码在第一行的PASS显示为蓝色,后面的都是黑色.不知为什么?
代码如下:
void testDlg::Test()
{
  AddText("Test Video            PASS");
  AddText("Test Signal            PASS");}
void testDlg::AddText(char buf[])
{
CString str;
str = buf;
str +="\r\n";
    m_richedit.SetSel(-1, -1);
    m_richedit.ReplaceSel(str);
//strMsg+=buf;
//strMsg+="\r\n";
//m_richedit.SetWindowText(strMsg);
//m_richedit.LineScroll(m_richedit.GetLineCount(),0); CHARFORMAT cf;
    ZeroMemory(&cf, sizeof(CHARFORMAT));
    cf.cbSize = sizeof(CHARFORMAT);
    cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
                         CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
    cf.dwEffects = 0;
    cf.yHeight = 18*18;//文字高度
    cf.crTextColor = RGB(0, 0, 255); //文字颜色
    strcpy(cf.szFaceName ,_T("Arial"));//设置字体
int iCount = strlen(buf);
    m_richedit.SetSel(iCount-6, iCount); //设置处理区域
    m_richedit.SetSelectionCharFormat(cf);
    //自动滚动至最后一行
   m_richedit.SendMessage(WM_VSCROLL, SB_BOTTOM, 0);
}

解决方案 »

  1.   


    问题出在下面这句话:int iCount = strlen(buf)因为你AddText的时候,这个buf的长度是固定的,是"Test Signal PASS"的长度,而不是Richedit本身字符串的长度,所以你总是在设置第一行固定区域的那个pass的格式.
    这就是为什么只有第一行是蓝色的原因了.void testDlg::AddText(char buf[])
    {long nSelPosStart, nSelPosEnd;
    m_richedit.GetSel(nSelPosStart, nSelPosEnd);
    m_richedit.SetSel(nSelPosEnd-4, nSelPosEnd); //设置处理区域
    m_richedit.SetSelectionCharFormat(cf);
    m_richedit.SetSel(-1, -1);}
      

  2.   

    http://community.csdn.net/Expert/topic/5149/5149429.xml?temp=.978512
    中已解决
      

  3.   

    To:119365374(砖头) 
    多谢.
    但如果我再进一步,"Test Signal"及"PASS"的字体大小也设做一下设定,变成一样大,然后再设一下PASS的颜色,我用如下的代码,为什么会不行呢?"Test Signal"的字体没有被设到."PASS"却被设到了.
    cf.yHeight = 18*18;//文字高度
    ..
    long nSelPosStart, nSelPosEnd;
    m_richedit.GetSel(nSelPosStart, nSelPosEnd);
    m_richedit.SetSel(nSelPosStart, nSelPosEnd);
    m_richedit.SetSelectionCharFormat(cf);  //先设置全部的字符大小为18*18. m_richedit.SetSel(nSelPosEnd-5, nSelPosEnd); //设置处理区域
    cf.crTextColor = RGB(0, 0, 255); //文字颜色
    m_richedit.SetSelectionCharFormat(cf);
    m_richedit.SetSel(-1, -1);
      

  4.   

    void C****Dlg::AddText(char buf[])
    {
    CString str;
        str = buf;
        str +="\r\n";
    int nLength = m_richedit.GetTextLength();
        m_richedit.SetSel(-1, -1);
        m_richedit.ReplaceSel(str);    CHARFORMAT cf;
        ZeroMemory(&cf, sizeof(CHARFORMAT));
        cf.cbSize = sizeof(CHARFORMAT);
        cf.dwMask = CFM_BOLD | CFM_COLOR | CFM_FACE |
                             CFM_ITALIC | CFM_SIZE | CFM_UNDERLINE;
        cf.dwEffects = 0;
        cf.yHeight = 18*18;//文字高度
    m_richedit.SetSel(nLength, -1); //设置处理区域
        m_richedit.SetSelectionCharFormat(cf);
    m_richedit.SetSel(-1, -1);
        cf.crTextColor = RGB(0, 0, 255); //文字颜色
        strcpy(cf.szFaceName ,_T("Arial"));//设置字体
        int iCount = strlen(buf);    m_richedit.SetSel(iCount-6+nLength, iCount+nLength); //设置处理区域
        m_richedit.SetSelectionCharFormat(cf);    //自动滚动至最后一行
        m_richedit.SendMessage(WM_VSCROLL, SB_BOTTOM, 0);}
      

  5.   

    多谢,但好象有一个问题,开始三行很正确,但到第四行就开始乱了,"Tes   ass"变成了蓝色了
      

  6.   

    用我给的代码段,直接调用AddText,试过没问题