GDI中利用内存画布防止位图闪烁

昨天晚上博客园好像打不开。。。所以一大早赶快起来补昨天的作业。。。。。

今天的任务。。。

1、利用双缓冲实现图片特效(例如:百叶窗,等效果)

2、利用mciSendCommand这个结构体写一个播放器。。。

当然是全部封装起来。。。呵呵。。。

昨天的:

先建立一个DBuffer对话框工程

首先创建一个内存画布的对象(CDC)封装起来;

class CMemDC:public CDC
{
private:
 CBitmap m_Bitmap;
 CDC* m_pDC;
 CRect m_Rect;
public:
 CMemDC(CDC *pDC, const CRect& rect)
 {
  m_pDC = pDC;
  m_Rect = rect;
  m_Bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
  CreateCompatibleDC(pDC);
  SelectObject(m_Bitmap);
 }
 ~CMemDC()
 { 
  m_pDC->BitBlt(0,0,m_Rect.Width(),m_Rect.Height(),this,m_Rect.left,m_Rect.top,SRCCOPY);
 }
};

在DBufferDlg.h中声明SetBitmap()方法实现绘图操作

void CDBufferDlg::SetBitmap()
{
 CRect rect;
 GetClientRect(&rect);
 CDC *pDC=GetDC();

 CMemDC memDC(pDC,rect);

 CDC cDC;
 cDC.CreateCompatibleDC(pDC);

 cDC.SelectObject(&m_Bitmap[m_Mode]);
 memDC.BitBlt(x,y,m_hBitmap->bmWidth,m_hBitmap->bmHeight,&cDC,0,0,SRCCOPY);
}

遇到的问题就是:刚开始没有创建一个内存画布对象,而是在CDBufferDlg类中建立一个方法来实现内存画布

由此导致了单次创建了内存画布对象,所以仔细看的话还是有一点闪烁的效果。。。。。

原文地址:https://www.cnblogs.com/ccmfc/p/1718279.html