如题,输入法窗口由于每输入一个字符就要更新一下窗口,更新时背景和字都得重新绘制,这样输入很快时就会出现轻微的闪烁现象,虽然不明显,但我还是想避免。我知道有一种方法是判断窗口的哪部分需要更新,对不需要更新的部分就不再重绘制,这样就可以避免未更新区域的闪烁,更新区域由于内容变化了,所以也看不出闪烁来。但这种方法在判断需更新区域时很麻烦,请问有没有其他的方法避免闪烁?我知道现在流行的输入法界面都不闪,难道他们都是用上述方法实现的?还是另有其他函数或方法避免窗口闪烁?

解决方案 »

  1.   


    用到了双缓冲基本不存在这问题了至于刷新区域是考虑效率用的,只画刷新区域快CDC有GetClipBox方法,能取得刷新区域
      

  2.   

    cpio([email protected]):
        您说的双缓冲是什么意思,怎样用法?能说的更详细点吗?
        我在MSDN看了看GetClipBox,不太明白它是怎样取得刷新区域的。比如原来窗口里有三个输入字符,现在增加了第四个字符,我想仅刷新第四个字符所在位置,它怎样取得这个区域呢?我的做法是计算出第四个字符所在区域位置,然后仅刷新此区域。如果有函数能计算刷新区域,它应对刷新前后的两个区域作对比,得出不同的部分,但上述函数并没有这样的两个区域参数,它是怎样实现的呢?闻不吝赐教。
      

  3.   

    双缓冲的实现方法可参看my blog:
    http://blog.csdn.net/seu07201213/archive/2006/07/15/925709.aspx下面的两个函数你能用的上:
    CWnd::InvalidateRect
    void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );
    //可刷新一块区域(LPCRECT lpRect)CDC::GetTextExtent
    CSize GetTextExtent( LPCTSTR lpszString, int nCount ) const;CSize GetTextExtent( const CString& str ) const;Return ValueThe dimensions of the string (in logical units) in a CSize object.
    //可计算文本尺度