大家好,我想做一个滚动文本控件,滚动显示文本。我首先从CStatic派生,然后,在CStatic的派生类OnPaint里,绘制文本。
并使用定时器改变绘制文本的Rect。可是,文本在滚动时,会有闪烁的现象。文本绘制时,已使用双缓冲,但还是有“闪烁”的现象。代码如下: CRect rcClient;
GetClientRect(&rcClient); // 创建内存DC
CDC dcMem;
dcMem.CreateCompatibleDC(&dc); CBitmap bmp, *pOldBmp;
bmp.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height()); pOldBmp = dcMem.SelectObject(&bmp); if (m_hBkBitmap != NULL)
{
// 创建背景DC
CDC dcBk;
dcBk.CreateCompatibleDC(&dc); HBITMAP hOldBmp = NULL;
hOldBmp = (HBITMAP)dcBk.SelectObject(m_hBkBitmap); dcMem.BitBlt(
0, 0, 
rcClient.Width(), rcClient.Height(), 
&dcBk, 
0, 0, 
SRCCOPY
);
dcBk.SelectObject(hOldBmp); if (dcBk.GetSafeHdc() != NULL)
{
dcBk.DeleteDC();
}
}
         ......
         dcMem.SetBkMode(TRANSPARENT);
         dcMem.DrawText(m_vecItems[m_uCurItemIndex].m_strTextTip, rcTextTip, DT_VCENTER | DT_CENTER | DT_SINGLELINE) ;         请大家帮忙分析原因。非常感谢。

解决方案 »

  1.   

    WM_ERASEBKGND消息处理里直接return TRUE;
      

  2.   

    WM_ERASEBKGND消息处理里直接return TRUE;
    顶。
      

  3.   

    我在OnEraseBkgnd函数里,直接返回TRUE。但是,依然会有闪烁的现象。期待更好的答案。呵呵。
      

  4.   

    这是你在定时器中改变rect导致的
    我做文字滚动的时候是通过显示不同的文字来实现滚动效果的,例如显示的文字从"12345"->"2345"->"345"->"45" 这样就相当于文字向左移动了。在定时器中仅仅是改变需要显示的文字在原字符串中的索引位置就可以了。大体思路是这样,细节你就自己去构思吧,循环移动,变色等等都可以实现。