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就是慢的?高手指点。
...全文
215 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sboom 2006-04-16
  • 打赏
  • 举报
回复
行了,就是ON_WM_ERASEBKGND的问题。
sboom 2006-04-16
  • 打赏
  • 举报
回复
........要不怎么搞啊?我是看人家的例子这样写的,关键是我的画面还是会闪啊。。。
菜牛 2006-04-16
  • 打赏
  • 举报
回复
DDraw+双缓冲,好怪异的结合啊。
sboom 2006-04-16
  • 打赏
  • 举报
回复
不好意思说错了,不是Invalidate,是doc->UpdateAllViews(NULL);就是下面这个定时器函数刷新的

void CMainFrame::OnTimer(UINT nIDEvent)
{
#define KEYDOWN(name, key) (name[key] & 0x80)

char buffer[256];
HRESULT hr;
hr = KeyBoard->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
if FAILED(hr)
{
if(hr==DIERR_INPUTLOST){
KeyBoard->Acquire();
}
return;
}

CdinDoc *doc=(CdinDoc*)this->GetActiveDocument();
if (KEYDOWN(buffer, DIK_RIGHT)){
doc->r.left+=MovingUnit_;
doc->r.right+=MovingUnit_;
}
else if(KEYDOWN(buffer, DIK_LEFT)){
doc->r.left-=MovingUnit_;
doc->r.right-=MovingUnit_;
}
if (KEYDOWN(buffer, DIK_UP)){
doc->r.top-=MovingUnit_;
doc->r.bottom-=MovingUnit_;
}
else if (KEYDOWN(buffer, DIK_DOWN)){
doc->r.top+=MovingUnit_;
doc->r.bottom+=MovingUnit_;
}
doc->UpdateAllViews(NULL);

CFrameWnd::OnTimer(nIDEvent);
}
DentistryDoctor 2006-04-16
  • 打赏
  • 举报
回复
Invalidate(FALSE)还是Invalidate(TRUE)?

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧