建一内存位图+兼容DC(虚屏)
把你所有的图GDI操作放在虚屏上.
重背景处理.在背景时把虚屏的内容贴到前景.
在需要更新时,真接把虚屏往前景贴
OK.
自画式按纽
void CCJFlatButton::OnPaint()
{
CPaintDC dc(this); // device context for painting
// KStowell - Get the client rect.
CRect rcClient, rcClip;
dc.GetClipBox( &rcClip );
GetClientRect( &rcClient );
// KStowell - Create a memory device-context. This is done to help reduce
// screen flicker, since we will paint the entire control to the
// off screen device context first.
CDC memDC;
CBitmap bitmap;
memDC.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc, rcClient.Width(), rcClient.Height());
CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
// KStowell - Repaint the background.
memDC.FillSolidRect(rcClient, m_clrNormal);
// let the control do its default drawing.
CWnd::DefWindowProc( WM_PAINT, (WPARAM)memDC.m_hDC, 0 );
// KStowell - Copy the memory device context back into the original DC via BitBlt().
dc.BitBlt( rcClip.left, rcClip.top, rcClip.Width(), rcClip.Height(), &memDC,
rcClip.left, rcClip.top, SRCCOPY );
// KStowell - Cleanup resources.
memDC.SelectObject(pOldBitmap);
memDC.DeleteDC();
bitmap.DeleteObject();
}
举例在OnPaint中画
//建一个空的bmp图
CBitmap bmp;
bmp.CreateCompatibleBitmap(&dc,长,宽);
//把刚才建的bmp图选入内存设备中
CDC memDC;
memDC.CreateCompatibleDC(&dc);
memDC.SelectObject(&bmp);
//现在就可以向用dc一样画图,现在是画在内存中
.
.
.
//记得画完图要copy到屏幕dc中
dc.BitBlt(...,&memDC,0,0,SRCCOPY);