这个有弄啊,但是没效果,
而且我的InvalidateRect(NULL,false);已经设为false了,
看了网上的一些双缓存的代码,不知道是不是有问题,反正也还是会闪烁,
是不是我把绘制背景的放在OnPaint里的问题
有什么解决办法没?希望能给出较清晰的代码?
而且我的InvalidateRect(NULL,false);已经设为false了,
看了网上的一些双缓存的代码,不知道是不是有问题,反正也还是会闪烁,
是不是我把绘制背景的放在OnPaint里的问题
有什么解决办法没?希望能给出较清晰的代码?
是不是要写成memdc.FillRect(rcclient, &brush); memdc.SelectObject( &bitmap );
选择了画完以后要选择回来
我认为, 从CStatic派生出一个CBitmapStatic类,
增加类成员HBITMAP m_hBitmap;
把各种绘制在CBitmapStatic里面完成
CTestDlg里面组织和管理各种位图, new CBitmapStatic等等
CBitmapStatic 里面
OnEraseBkgroud(...)
return TRUE; 在OnPaint里面贴图, 用双缓冲, 应该不会闪烁的
我的是用的CStatic控件来贴图的,背景图上还有不少这种贴图的,
每一张图的绘制都是再void CTestDlg::DrawStaPic(CStatic* sta,HBITMAP& hBitmap)
这个函数里进行的,再OnPaint里循环的进行所有图片的绘制的。只不过背景图绘制
放在前面就是了。但是还是会闪烁。
你改成:memdc.FillRect(rcclient, &brush);
看看效果!
dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&memdc, rcclient.left, rcclient.top,SRCCOPY); //SRCPAINT
我改成了这样,效果还是一样闪烁。
在画图的时候,你要记住:
所以得东西都先在内存设备环境中化,画完后,然后用BitBlt拷贝到设备环境中。切忌不要
一会在内存环境中画,一会又到设备环境中画。要么在内存设备环境中画然后拷贝的设备环境中
,要么就在设备环境中画。
Static.GetParent()->RedrawWindow(&m_gbrect,NULL, RDW_INTERNALPAINT|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ALLCHILDREN); //说明: 必须有父窗口,也就是你这里必须有背景图片
CRect m_gbrect; 为你的静态框相对背景图的rect,
你用GetWindowRect获取下背景图的rect以及静态框的rect自己计算下,代码如下类似:
CRect parentrect;
this->GetParent()->GetWindowRect(parentrect);
this->GetWindowRect(m_gbrect);
long tmpwidth = m_gbrect.Width();
long tmpheight = m_gbrect.Height();
m_gbrect.top = m_gbrect.top - parentrect.top;
m_gbrect.left = m_gbrect.left - parentrect.left;
m_gbrect.right = m_gbrect.left + tmpwidth;
m_gbrect.bottom = m_gbrect.top + tmpheight; 晕,刚好前几天我搞定了,你试试能用不
m_memDC.CreateCompatibleDC(GetDC());
m_bmp.CreateCompatibleBitmap(GetDC(),2000,2000);
m_memDC.SelectObject(&m_bmp);
DC的背景默认为黑色,可填充为屏幕默认背景色:
m_memDC.FillSolidRect(0,0,2000,2000,GetSysColor(COLOR_BTNFACE));2、在内存DC上绘图,(选中的位图对象用来保存图像信息):
就是你 DrawStaPic 里的绘图过程,把dc 和bitmap 替换一下3、将内存DC中的图片绘制到屏幕上,OnPaint里写:
CDC *pdc = GetDC();
pdc->BitBlt(0,0,430,420,&m_memDC, posx, posz,SRCCOPY);
&memdc, rcclient.left, rcclient.top,SRCPAINT);
我觉得应该改成
dc.BitBlt(rcclient.left, rcclient.top, rcclient.Width(), rcclient.Height(),
&memdc, rcclient.left, rcclient.top,SRCCOPY); 试试
如果需要合并原位图 就合并了之后再用dc拷贝显示出来
问下这条语句是做什么用的,我这段代码是网上下的,但是把这句代码
屏蔽了也没什么影响,所以感觉有点奇怪