首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

GDI绘图闪烁有关问题,有难度哦

2012-05-05 
GDI绘图闪烁问题,有难度哦。请看附件代码,很简单,没几行。(代码下载 http://download.csdn.net/detail/tsys2

GDI绘图闪烁问题,有难度哦。
请看附件代码,很简单,没几行。(代码下载 http://download.csdn.net/detail/tsys2000/4075643 )

现象是红色方块在移动的时候会出现类似电视受到信号干扰时的类似闪烁。
谁能告诉我这种闪烁有办法消除吗?要是不能请告诉我原因,谢谢。

PS:我用多种方法实现都有这个现象。有GDI的,GDI+的,带辅助绘图线程的等等。

主要过程
int CMovePage::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;

for(int i = 0 ; i < 2000; i++)
{
CItem it;
it.m_rcItem.left = i*80 +i*20;
it.m_rcItem.top = 20;
it.m_rcItem.right = it.m_rcItem.left + 80;
it.m_rcItem.bottom = it.m_rcItem.top + 80;
m_vecItem.push_back(it);

m_nLength = it.m_rcItem.right + 20;
}

CRect rc;
GetClientRect(&rc);

m_rcCurrent = rc;

return 0;
}

void CMovePage::OnPaint()
{
CPaintDC dc(this); // device context for painting

CRect rc;
GetClientRect(&rc);

if(m_pictureDoubleBuffer == NULL)
{
m_pictureDoubleBuffer = new CMemDC(&dc,rc);
}

CBrush b1(RGB(0,0,0));
CBrush b2(RGB(255,0,0));
m_pictureDoubleBuffer->FillRect(&rc,&b1 );

for(int i = 0 ; i < (int) m_vecItem.size() ; i++)
{
CItem& it = m_vecItem[i];
CRect rc = it.m_rcItem;

if(!( rc & m_rcCurrent ).IsRectEmpty())
{
int w = rc.Width();
rc.left = rc.left - m_rcCurrent.left;
rc.right = rc.left + w;
m_pictureDoubleBuffer->FillRect(&CRect(rc.left,rc.top,rc.right,rc.bottom),&b2 );
m_pictureDoubleBuffer->FillRect(&CRect(rc.left,rc.top + 100,rc.right,rc.bottom + 100),&b2 );
m_pictureDoubleBuffer->FillRect(&CRect(rc.left,rc.top + 200,rc.right,rc.bottom + 200),&b2 );
}
}

BitBlt( dc.GetSafeHdc() , 0,0,rc.Width(),rc.Height() , m_pictureDoubleBuffer->GetSafeHdc() , 0,0 , SRCCOPY ) ;
}

void CMovePage::Move()
{
CRect rc = m_rcCurrent;
rc.OffsetRect(10,0);
if(rc.right > m_nLength)
{
rc.MoveToX(0);
}
m_rcCurrent = rc;
this->Invalidate();
}

[解决办法]
this->Invalidate();
肯定会闪烁啊,用局部重绘InvalidateRect();

[解决办法]
只重绘红色方块呗
[解决办法]
调用了OnEraseBkgnd 绘制背景 再多的缓冲也不好使
[解决办法]
看代码,
1)没用双缓冲。
2)没设OnEraseBkgnd为TRUE。

这样当然会有闪烁了。
[解决办法]

探讨

1 CMemDC 不是双缓冲嘛
2 OnEraseBkgnd为TRUE这个作用微乎其微,包括OnCtlColor内返回NULL

[解决办法]
抱歉,看到了,老眼昏花啊,可能是别的问题。没时间看。其他大侠请继续。
[解决办法]
OnErasebkgnd()
{
return TRUE;
}
[解决办法]
探讨

用direct编程试试,可能刷新太快太频繁了吧

热点排行