大哥请帮小弟一下:
我想编一个打字软件,当用户输入错的字符的时候,就会用几它的颜色显示,但我有一个问题!
代码如下:
  我自己派生了一个CRichEditCtrl(myRichEdit)
并定义了一个消息响应函数(代码如下):
void myRichEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{

static int i;
m_CompareChar=nChar;
m_temp+=m_CompareChar;
//选取当前输入的字符
SetSel(m_StrAt,m_StrAt); 
         //判断输入是否正确!
if(m_CompareChar==GetParent()->m_str[i]->GetAt(m_StrAt++))
{
SetFontColor();//默认为黑色
        /////////////////////定义如下:
          void myRichEdit::SetFontColor(COLORREF m_color)
        {
   CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_COLOR | CFM_UNDERLINE |CFM_BOLD;
cf.dwEffects =(unsigned long) ~( CFE_AUTOCOLOR |  CFE_UNDERLINE | CFE_BOLD);
cf.crTextColor=m_color;
SetWordCharFormat(cf);
}
//////////////////////////////
}
    else
{

        SetFontColor(RGB(255,0,0));

}
    //换行 
if(GetParent()->m_str[i]->GetLength()>=93 ) 
i++;
CRichEditCtrl::OnChar(nChar, nRepCnt, nFlags);
 
}一开始我在对话框中定义一个CEdit控件,然后通过SubclassDlgItem()相捆绑,
,当用户输入错误的字符时,结果如人所愿!但我在对话框中动态生成10个myRichEdit时:
for(int i=0;i<10;i++)
{
              myedit[i]->SubclassDlgItem(m_IDCr[i],this); 
}
/////////////////////
UINT m_IDCr[10]={IDC_EDIT1,IDC_EDIT2,IDC_EDIT3,IDC_EDIT4,IDC_EDIT5
                ,IDC_EDIT6,IDC_EDIT7,IDC_EDIT8,IDC_EDIT9,IDC_EDIT10};
for(int i=0;i<10;i++)
{    
                myRedit=new myRichEdit;
       myedit[i]=myRedit;
       myRedit=NULL;
                delete myRedit;
}
/////////////////////
当用户输入错误的字符时,结果就是没有改变字体的颜色,我想其原因就是没有选择字体。

解决方案 »

  1.   

    SetWordCharFormat(cf);只能更改当前被选中的内容//但你可以为CRichEditCtrl中的某部分绑定显示方式,如下
    //##以下摘自MSDN// The pointer to my rich edit control.
    extern CRichEditCtrl* pmyRichEditCtrl;
    // A pointer to a printer DC.
    extern CDC* pMyPrinterDC;FORMATRANGE fr;// Get the page width and height from the printer.
    long lPageWidth = ::MulDiv(pMyPrinterDC->GetDeviceCaps(PHYSICALWIDTH),
        1440, pMyPrinterDC->GetDeviceCaps(LOGPIXELSX));
    long lPageHeight = ::MulDiv(pMyPrinterDC->GetDeviceCaps(PHYSICALHEIGHT),
        1440, pMyPrinterDC->GetDeviceCaps(LOGPIXELSY));
    CRect rcPage(0, 0, lPageWidth, lPageHeight);// Format the text and render it to the printer.
    fr.hdc = pMyPrinterDC->m_hDC;
    fr.hdcTarget = pMyPrinterDC->m_hDC;
    fr.rc = rcPage;
    fr.rcPage = rcPage;
    fr.chrg.cpMin = 0;
    fr.chrg.cpMax = -1;
    pmyRichEditCtrl->FormatRange(&fr, TRUE);// Update the display with the new formatting.
    RECT rcClient;
    pmyRichEditCtrl->GetClientRect(&rcClient);
    pmyRichEditCtrl->DisplayBand(&rcClient);
      

  2.   

    我怀疑是你定义的static int i;静态变量在做怪!!
      

  3.   

    想必这个对你有帮助。
    http://www.codeproject.com/editctrl/crysedit.asp
      

  4.   

    Hankuu() :
    小弟愚昧:看不明?
    我的目的就是:用户每输入一个字母,就会触发OnChar(),并选择当前用户输入的字母,然后判断,如果跟给出的字母不同,就用别的颜色显示.Hankuu():
    可不可解释一下之种现象?
      

  5.   

    mahatma_cn:
    我试过了,把程序改为如下:
    void myRichEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
    {
    //选取当前输入的字符
    SetSel(m_StrAt,m_StrAt++); 
             
              SetFontColor(RGB(255,0,0));
    CRichEditCtrl::OnChar(nChar, nRepCnt, nFlags);
     
    }
    还是一样字符没有改变颜色!!
      

  6.   

    代码发给我看看(假如没有商业秘密的话)
    [email protected]
      

  7.   

    for(int i=0;i<10;i++)
    {    
                    myRedit=new myRichEdit;
           myedit[i]=myRedit;
           myRedit=NULL;
                    delete myRedit;  //你这里都释放了,以后还怎么
                                       SubClassDlgItem啊?
    }
      

  8.   

    for(int i=0;i<10;i++)
    {    
                    myRedit=new myRichEdit;
           myedit[i]=myRedit;
           myRedit=NULL;
                    delete myRedit;
    }
    这段代码明显有问题,创建一个新的myRichEdit实例后,但是又把它释放掉了,myedit[i]指向何处???以后怎用SubClassDlgItem捆绑???无法与父窗口进行关联捆绑即使在编辑窗口内输入字体,也不会响应你自定义的消息
    (愚见)
    把最后两行注释掉看看
      

  9.   

    siphonelee(sifone)
    snoopyhap:
    两位:
    但我的程序编释通过,并且可以运行(应响 myRichEdit的OnChar()函数,但不能改变颜色),我在调试的时候,当我输入字符时,
    是可以应响 myRichEdit的OnChar()函数那是否可以证明SubClassDlgItem可以绑定呢?
      

  10.   

    从CEdit控件子类化成CRichEditCtrl不能正常工作你试一下从CRichEditCtrl控件子类化成myRichEdit如果你知道怎样从CEdit子类化成CRichEditCtrl,能不能把你的代码贴出来一下