利用BitBlt()双缓冲技术制作波形控件,拖拽时还是存在闪烁?
做了一个自绘的波形控件,可以拖拉伸缩的。利用了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) ;
}