关于用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);
------解决方案--------------------
------解决方案--------------------
重载对话框类的WM_ERASEBKGND,函数里面直接返回TRUE;
------解决方案--------------------
我按你给出的函数编了,并没闪烁,移动对话框也没被盖住按钮.你把所有的引起重绘的先去掉试试,比如Invalidate什么的.
问题是这样的,我做了个基于对话框的工程,在工程里我想用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);
------解决方案--------------------
------解决方案--------------------
重载对话框类的WM_ERASEBKGND,函数里面直接返回TRUE;
------解决方案--------------------
我按你给出的函数编了,并没闪烁,移动对话框也没被盖住按钮.你把所有的引起重绘的先去掉试试,比如Invalidate什么的.