我从CWnd派生了一个类CPicWnd用来显示图片然后放到CView上,现在当CView改变大小的时候,CPicWnd会重绘图片,请问怎么不让它重绘,我看了以前的帖子,说是CView的“窗口类”有两个属性CS_HREDRAW,CS_VREDRAW,怎么把它去掉呢?或者其它的办法也行,不过我想双缓冲的办法可能不适合我这个问题,我想怎么样能避免改变窗口大小的时候重绘子窗口可能能解决我的问题。谢谢!
调试欢乐多
cs.lpszClass = AfxRegisterWndClass(0);
return TRUE;
就可以了。
重载View的OnEraseBkgnd函数,直接return TRUE应该就不会闪了。
不过这样view的背景就会出问题,所以你还要处理一下view的背景。如果你知道view上的窗口大小和位置,那么可以刷这个窗口之外的所有地方。比如:BOOL CXXXView::OnEraseBkgnd(CDC* pDC)
{
extern CRect rectWnd;//你窗口的位置,自己想办法获得,应该很容易
CRect rectClient;//view的客户区
GetClientRect(rectClient);
//创建两个rgn
CRgn rgn1,rgn2;
rgn1.CreateRectRgn(rectClient.left,rectClient.top,rectClient.right,rectClient.bottom);
rgn2.CreateRectRgn(rectWnd.left,rectWnd.top,rectWnd.right,rectWnd.bottom);
//做异或操作,使rgn1只包含你的wnd位置之外的view客户区范围
if(rgn1.CombineRgn(&rgn1,&rgn2,RGN_XOR) == ERROR)
{
ASSERT(FALSE);
return FALSE;
}
//创建一个刷子刷背景
CBrush brushWhite;
brushWhite.CreateSolidBrush(RGB(255,255,255));
pDC->FillRgn(&rgn1,&brushWhite);
brushWhite.DeleteObject();
return TRUE;//原来调用基类的OnEraseBkgnd一定记得去掉,它就是引起闪烁的根本原因
}
你说 “双缓冲的办法可能不适合我这个问题”不知道你是什么意思
HUST,很亲切的地方,老弟。