MFC如何避免重绘闪烁

只需要重写OnPaint()和OnEraseBkgnd(CDC* pDC)即可

OnPaint()代码如下:

if (IsIconic())
{
	CPaintDC dc(this); // 用于绘制的设备上下文

	SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

	// 使图标在工作区矩形中居中
	int cxIcon = GetSystemMetrics(SM_CXICON);
	int cyIcon = GetSystemMetrics(SM_CYICON);
	CRect rect;
	GetClientRect(&rect);
	int x = (rect.Width() - cxIcon + 1) / 2;
	int y = (rect.Height() - cyIcon + 1) / 2;

	// 绘制图标
	dc.DrawIcon(x, y, m_hIcon);
}
else
{
	CPaintDC dc(this);
	CRect rect;
	GetClientRect(&rect);
	CDC dcMem;                                                 //用于缓冲作图的内存DC
	CBitmap bmp;                                                //内存中承载临时图象的位图
	dcMem.CreateCompatibleDC(&dc);              //依附窗口DC创建兼容内存DC
	bmp.CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());//创建兼容位图
	dcMem.SelectObject(&bmp);                         //将位图选择进内存DC
	dcMem.FillSolidRect(rect,dc.GetBkColor());//按原来背景填充客户区,不然会是黑色
	//Draw()//你得重绘内容,使用dcMem      
       dc.BitBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,SRCCOPY);//将内存DC上的图象拷贝到前台
	dcMem.DeleteDC();                                      //删除DC
	bmp.DeleteObject();                                       //删除位图
	CDialog::OnPaint();
}


OnEraseBkgnd(CDC* pDC)如下:

//return CDialog::OnEraseBkgnd(pDC);
return TRUE;





你可能感兴趣的:(C++,MFC)