做了一个自绘的波形控件,可以拖拉伸缩的。利用了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) ;
}
{
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) ;
}
解决方案 »
- afxcontrolbars.h 编译错误
- 散分
- 是多线程还是timer?关于异步处理数据的问题,详细见题!!!
- UDP 使用CSocket类,重载 OnReceive 函数! 怎么样发送函数能等待服务器返回后再返回!(求高手帮忙,小妹感激不尽)
- 重装vc后,以前的工程不能打开,请教.
- 急用IDownloadManager,可根据msdn 上的叙述,我搜遍了也没找到DownloadMgr.h, DownloadMgr.idl 这样的2个文件 ;
- 命令提示行问题
- 请问opencv对图像的色彩直方图显示//rate=0.151216是什么意思?
- 硬盘对拷----源盘是NTFS格式的。请问如何进行????//???
- 怎样使用Rebar?
- 怎样另窗口又上方的关闭键(X键)失效?
- 关于catch(...)异常类型的问题
写错了
解决办法:响应擦除背景的消息,去掉默认处理BOOL CXXXView::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}