关于用GDI+ 画图,引起的画面闪烁,该如何解决

关于用GDI+ 画图,引起的画面闪烁
问题是这样的,我做了个基于对话框的工程,在工程里我想用GDI+里的方法,用DrawImage方法在窗口背景里画了一个jpg格式的图,用来当做背景,然后对话框上面我自画了很多按钮,为了避免窗口发生局部重绘时,导致其它按钮无法显示,所以我在
OnActivate //当CWnd要被激活或退出激活状态时调用这个函数  
OnActivateApp //当应用程序要被激活或退出激活状态时调用这个函数
这两个函数里,都调用了
InvalidateRect(NULL,FALSE);//在当前的更新区域中加入给定的矩形,使客户区的给定矩形无效
工程中,每一次OnAntivate和OnActiveApp的调用,画面都出现闪烁 ,用鼠标拖标题栏的时候对话框上面只有一张图片,一个按钮都没显示 ;
其实,我主要就是想实现WINDOWS桌面背景那种功能,但我的工程画面闪烁有点太明显了,不知是不是按钮太多了;
双缓冲在这里好像不能用吧?
那位有实现类似的项目源码,给我发一个,小菜在这里谢过了


------解决方案--------------------
这跟是不是 GdiPlus 没关系,重点是你的 OnPaint 函数要使用双缓冲绘图。
------解决方案--------------------
双缓存能用

先画图,再在图上添按钮
------解决方案--------------------
为主窗口设置WS_CLIPCHILDREN属性
------解决方案--------------------
RECT rc;
GetClientRect(g_hwnd,&rc);
Bitmap bmp(int(rc.right),int(rc.bottom));、
Graphics bmpGraphics(&bmp);
bmpGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
/*Drawing on bitmap*/
SolidBrush bkBrush(Color(0,0,0));
bmpGraphics.FillRectangle(&bkBrush,0,0,rc.right,rc.bottom);
/*Drawing on DC*/
Graphics graphics(hdc);
/*Important! Create a CacheBitmap object for quick drawing*/
CachedBitmap cachedBmp(&bmp,&graphics);
graphics.DrawCachedBitmap(&cachedBmp,0,0);

------解决方案--------------------
探讨
引用:
双缓存能用

先画图,再在图上添按钮

首先我想问一个问题,函数的流程是怎样的,是不是先执行主窗口的OnPaint,然后是每个按钮的DrawItem,那么把兼容DC的图拷备到目的DC,是在那里执行的;
步骤是不是在主窗口创建一个兼容DC,然后在主窗口的OnPaint函数中,在兼容DC上面贴图,对于按钮我重新派生了一CButton类,重载了DraoItem函数,是……

------解决方案--------------------
重载对话框类的WM_ERASEBKGND,函数里面直接返回TRUE;
------解决方案--------------------
我按你给出的函数编了,并没闪烁,移动对话框也没被盖住按钮.你把所有的引起重绘的先去掉试试,比如Invalidate什么的.