利用BitBlt()双缓冲技术制作波形控件,拖拽时还是存在闪烁?

小木2000 2009-04-21 12:58:05
做了一个自绘的波形控件,可以拖拉伸缩的。利用了BitBlt()双缓冲技术,先把要显示的图形在内存中绘制好,然后再一次性地将内存中的图形输出到屏幕上。

基本功能实现得差不多了,也实现了实时伸缩,绘制波形时也没有闪烁,但是有两个问题:

1、当拖拽对话框,波形控件大小也随之变化时,波形控件还是存在闪烁现象。

我的做法是在OnSize中先销毁原有的由CreateCompatibleBitmap函数创建的位图,再用拖拽后新的width和height创建一个新位图,在这个新位图上绘出新波形后,再在OnPaint中输出到屏幕上。

不明白的是,用了双缓冲技术,为什么在拖拽时,还是存在闪烁现象?

2、参照XP自带的“任务管理器”中的波形图,当拖拽对话框时,波形仍在继续绘制。但我的控件在拖拽时,则停止绘制,拖拽完成后,波形又从头开始绘制,先前的数据就丢失了。

我现在想做出类似XP“任务管理器”中的CPU波形控件,重点解决上面的两个问题。

不知道有没有大虾做过,给个详细的思路,多谢^_^

程序:

void CMyCtrl::InvalidateCtrl()
{
GetClientRect(m_rectClient) ;//获取客户区大小
……
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc) ;
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid) ;

}
else
{
if (m_pbitmapOldGrid != NULL)
m_dcGrid.SelectObject(m_pbitmapOldGrid) ;
m_bitmapGrid.DeleteObject();
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid) ;
}

……//绘制背景、坐标、波形
InvalidateRect(m_rectClient, FALSE) ;
}

void CMyCtrl::OnPaint()
{
CPaintDC dc(this) ; // device context for painting
CDC memDC ;
CBitmap memBitmap ;
CBitmap* oldBitmap ; // bitmap originally found in CMemDC

memDC.CreateCompatibleDC(&dc) ;
memBitmap.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;
if (memDC.GetSafeHdc() != NULL)
{
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcGrid, 0, 0, SRCCOPY) ;
……
dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &memDC, 0, 0, SRCCOPY) ;
}
memDC.SelectObject(oldBitmap) ;
}




...全文
155 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gamesuwei 2009-04-21
  • 打赏
  • 举报
回复
仍然闪是因为你的背景仍然在重绘
解决办法:响应擦除背景的消息,去掉默认处理

BOOL CXXXView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}
小木2000 2009-04-21
  • 打赏
  • 举报
回复
第一个函数是void CMyCtrl::OnSize() ,不是void CMyCtrl::InvalidateCtrl()
写错了

15,979

社区成员

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

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