我是用CDC::TEXTOUT输出汉字,在ONCHAR中接受到字符后,在相应的位置InvalidateRect(),在ONDRAW中先画整个背景,再在相应的位置输出ONCHAR中得到的字符,在输出英文和标点的时候很正常,但是输入汉字就回出现闪烁,奇怪的是,我使用 SENDMESSAGE(WM_CHAR,汉字,0)却没有出现闪烁的现象,请高手指教,

解决方案 »

  1.   

    输入汉字的时候不可能一次一个键输入,每次击键都会引发ONCHAR而导致InvalidateRect,所以会有闪烁!呵呵
      

  2.   

    输入汉字的时候不是每次都引发ONCHAR的,使用输入法,输入几个汉字就会引发几次ONCHAR,重画背景是为了擦除原来的汉字ONDRAW代码如下:
    先用IPICTURE接口输出背景,然后输出文字pDC->SetBkMode(TRANSPARENT);
    int iDoclen=GetDocument()->Curpage->csWords.GetLength();
    if(iDoclen>0)
    {
    CPoint Wordpos; for(i=0;i<iDoclen;i++)
    {  
    Wordpos=GetDocument()->Curpage->m_Wordpos.GetAt(i); 

    CString tempstr=GetDocument()->Curpage->csWords.GetAt(i);
    if(0x0D==tempstr) continue; 
    pDC->TextOut(Wordpos.x+left,Wordpos.y-lTextHeight-m_Bottomblank,tempstr);
    /*CRect rect;
    rect.left=Wordpos.x+left;rect.top=Wordpos.y-lTextHeight-m_Bottomblank;
    rect.right=Wordpos.x+left+16;rect.right=Wordpos.y-m_Bottomblank;
    pDC->DrawText(tempstr,rect,DT_BOTTOM);*/
    }
    }
      

  3.   

    应该重画,不然最小后在打开不是就都没有了吗?我觉得闪烁不是效率的问题,因为使用SENDMESSAGE输入汉字也要调用这段代码来显示汉字,没有闪烁
      

  4.   

    TextOut的时候不需要重画。即在WM_CHAR消息处理的时候不需要InvalidateRect。关于输入的字符可以保存在一个全局变量中,每次添加,不需要计算位置。如果是使用DrawText那么可以使用GetTextExtentPoint32获得字体的高度和宽度,然后计算!具体的参考MSDN。
      

  5.   

    为什么不需要INVALIDATERECT呢,难道更新整个VIEW,那样闪的更严重了,