自绘滚动文本控件,滚动时有闪烁的现象

zwz1984 2011-05-17 09:26:29
大家好,我想做一个滚动文本控件,滚动显示文本。我首先从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) ;

请大家帮忙分析原因。非常感谢。
...全文
141 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwz1984 2011-05-22
  • 打赏
  • 举报
回复
仅改变显示文字索引,会有一个问题。就是每次只能显示完整的文字。效果不是很好。
guo693 2011-05-20
  • 打赏
  • 举报
回复
这是你在定时器中改变rect导致的。。。
我做文字滚动的时候是通过显示不同的文字来实现滚动效果的,例如显示的文字从"12345"->"2345"->"345"->"45" 这样就相当于文字向左移动了。在定时器中仅仅是改变需要显示的文字在原字符串中的索引位置就可以了。大体思路是这样,细节你就自己去构思吧,循环移动,变色等等都可以实现。
zwz1984 2011-05-19
  • 打赏
  • 举报
回复
附带说一句,我说的闪烁不是背景闪烁,而是,文本在滚动中,文本的闪烁。
如果,不用双缓冲,则背景也会闪烁。
zwz1984 2011-05-18
  • 打赏
  • 举报
回复
我在OnEraseBkgnd函数里,直接返回TRUE。但是,依然会有闪烁的现象。期待更好的答案。呵呵。
lijianli9 2011-05-17
  • 打赏
  • 举报
回复
WM_ERASEBKGND消息处理里直接return TRUE;
顶。
Eleven 2011-05-17
  • 打赏
  • 举报
回复
WM_ERASEBKGND消息处理里直接return TRUE;
  • 打赏
  • 举报
回复
codeproject上有类似的代码

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧