DDraw+双缓冲还是闪烁,帮忙看看是不是我写得不对??
sboom 2006-04-16 04:28:59 MFC/DOC/VIEW结构的
OnDraw已经被我置空了,在OnPain里面用DDraw画图,
void CdinView::OnPaint()
{
PAINTSTRUCT ps;
::BeginPaint(this->m_hWnd,&ps);
Flip();
::EndPaint(this->m_hWnd,&ps);
}
void CdinView::Flip(){
HRESULT hr=S_OK;
HDC hdc;
CPoint p(0,0);
RECT DesRect;
this->GetClientRect(&DesRect);
if (!(DesRect.bottom==ClientRect.bottom &&
DesRect.top==ClientRect.top &&
DesRect.left==ClientRect.left &&
DesRect.right==ClientRect.right)){
ClientRect=DesRect;
SurfaceSecondary->Release();
DDSURFACEDESC2 ddsd;
memset( &ddsd, 0, sizeof(ddsd) );
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = ClientRect.right;
ddsd.dwHeight = ClientRect.bottom;
hr = lpDD->CreateSurface( &ddsd, &SurfaceSecondary, NULL );
ASSERT(SUCCEEDED(hr));
}
CdinDoc *doc = (CdinDoc*)GetDocument();
RECT r=doc->r;
hr=SurfaceSecondary->GetDC(&hdc);
{
::FillRect(hdc,&ClientRect,(HBRUSH)GetSysColor(COLOR_BACKGROUND));
Rectangle(hdc, r.left,r.top,r.right,r.bottom );
}
hr=SurfaceSecondary->ReleaseDC(hdc);
this->ClientToScreen(&p);
OffsetRect(&DesRect,p.x,p.y);
hr=SurfacePrimary->Blt(&DesRect,SurfaceSecondary,NULL,
DDBLT_WAIT,
NULL);
if( hr == DDERR_SURFACELOST )
{
::Sleep(100);
SurfacePrimary->Restore();
SurfaceSecondary->Restore();
return;
}
}
其中每隔30mm就有一个定时器消息调用Invalidate通知OnPaint刷新,但就是要闪烁为什么呢?DOC/VIEW就是慢的?高手指点。