我在OnDraw里面加了这样一段代码:
for(int i=0;i<200;i=i+3)
{
pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
}
然后在CMyView::OnMouseMove里面加了一句Invalidate();
但是这样在鼠标移动的时候会屏幕导致闪烁,我就
把OnDraw里面的代码改成了这样 :
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap = 0;
CRect rect;
pDC->GetClipBox(client);
dc.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = dc.SelectObject(&bitmap);
for(int i=0;i<200;i=i+3)
{
pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
}
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
可是为什么这样还是会导致闪烁呢,后来我把
CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
改成了这样:
CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return TRUE;
}
这样改了之后闪烁就消失了,可又这是为什么呢。
for(int i=0;i<200;i=i+3)
{
pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
}
然后在CMyView::OnMouseMove里面加了一句Invalidate();
但是这样在鼠标移动的时候会屏幕导致闪烁,我就
把OnDraw里面的代码改成了这样 :
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bitmap;
CBitmap* pOldBitmap = 0;
CRect rect;
pDC->GetClipBox(client);
dc.CreateCompatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
pOldBitmap = dc.SelectObject(&bitmap);
for(int i=0;i<200;i=i+3)
{
pDC->Rectangle (&CRect(50+i,50+i,100+i,100+i));
}
pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(),
&dc, 0, 0, SRCCOPY);
可是为什么这样还是会导致闪烁呢,后来我把
CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
return CView::PreCreateWindow(cs);
}
改成了这样:
CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs.lpszClass == NULL)
cs.lpszClass = AfxRegisterWndClass(CS_DBLCLKS);
return TRUE;
}
这样改了之后闪烁就消失了,可又这是为什么呢。
-->
dc.Rectangle (&CRect(50+i,50+i,100+i,100+i));
而下面重载了PreCreateWindow,使它几乎没有什么动作,当然不会出现什么闪烁了
Invalidate();//而不是其他的
这会导致整个视图重画。你应该计算需要重画的区域,调用InvalidateRect等函数,精确需要重画的区域。你可以看看《深入浅出MFC》,里面好像有一节将如何提高重绘的效率,减少闪烁。