图像闪烁的问题,急!急!!急!!!(分多)

ljzcom 2003-08-23 10:02:28
在一个基于对话框的应用程序中,用CreateWindows()另外创建了一个窗口(window2),
现在在window2中画实时显示的背景图,达到了无闪烁的动画效果。
现在想在背景图上面另外画一些小图标,可这些小图标却老是闪烁显示啊?
大虾们,怎么才能让它们也不闪啊?
UP者有分。 《《 很急,真帮忙解决问题的,可以另开贴给分。》》
...全文
54 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljzcom 2003-08-26
  • 打赏
  • 举报
回复
问题解决了,谢谢大家,散份。。。。checkyvc6(checkyvc6)请另外来拿分
ljzcom 2003-08-24
  • 打赏
  • 举报
回复
哦,我是通过消息来刷新的。ok,我可以用WM_ERASEBKGND来试一试,谢谢!!
putongren 2003-08-24
  • 打赏
  • 举报
回复
大概记得:

简单做法:建立一个 Timer,触发时从 avi 中取得 bitmap 后,放入一个 dc 中,再把另外的小图标写入这个 dc 中,可以同时进行颜色屏蔽,达到部分透明效果,然后将这个 dc 写入 window 的 dc 中。我就是这么实现的,对于小尺寸 avi 效果很好。如果要对付大尺寸,那就要重写 timer 部分了,比较麻烦。

不闪烁的关键是对 window 的 dc 每个周期内只写一次,就是先在内存中写好。
checkyvc6 2003-08-24
  • 打赏
  • 举报
回复
你的背景图数据刷新的机制是什么?是计时器吗?
checkyvc6 2003-08-24
  • 打赏
  • 举报
回复
WM_ERASEBKGND是在刷新时如果要擦除背景时触发。
比如Resize时或者调用Invalidate(...,True)时。
ljzcom 2003-08-24
  • 打赏
  • 举报
回复
checkyvc6(checkyvc6) ,“多做几个memDC,每个小图标分别做一个memdc”,按你说得,我只显
示一个图标也闪烁的啊?我的背景图数据是从*.avi文件中读取的。
还有WM_EREASEBKGROUD在什么情况下会触发它啊?
vcforever 2003-08-24
  • 打赏
  • 举报
回复
给你提个建议:
可以建立两个内存DC,一个用来存放源图片,一个用来完成图片的重画
然后再将重画完的内存DC中的图片,用Bitblt函数拷贝到,显示器DC,这样
你的图片就不回闪烁了!
祝你成功!
duqiang2050 2003-08-24
  • 打赏
  • 举报
回复
对了,忘说了,在上面双缓冲的基础上
还要重载WM_ERASEBKGND消息
BOOL CNanrenView::OnEraseBkgnd(CDC* pDC)
{
return false;
}

我给你一段我的代码,是“是男人就下100层的网络版”中的画图代码:

void CNanrenView::draw()
{
pMemDC->BitBlt(0,0,643,436,bmp0,0,0,SRCCOPY);
for(int i=0;i<6 ;i++)
{
pMemDC->BitBlt(fl[i],400-i*60-hight,96,16,bmp1,32*9,0,SRCCOPY);
}
for(int j=1;j< 20;j++)
{
//if(data[j].flg!=127)
{
pMemDC->BitBlt(data[j].x,data[j].y,32,32,bmp2,32*data[j].flg,32*data[j].sst,SRCAND);
pMemDC->BitBlt(data[j].x,data[j].y,32,32,bmp1,32*data[j].flg,32*data[j].sst,SRCPAINT);
}
}
InvalidateRect(re);
IsLock=false;
return;
}
void CNanrenView::OnDraw(CDC* pDC)
{
if (in==0)
{//第一次调用,用于初始化
CBitmap bitmap,bitmap2,bitmap3,bit;
bitmap.LoadBitmap(IDB_BITMAP1);

pMemDC=new CDC;
bmp0=new CDC;
bmp1=new CDC;
bmp2=new CDC;

pMemDC->CreateCompatibleDC(pDC);
pMemDC->SelectObject(&bitmap);

bit.LoadBitmap(IDB_BITMAP1) ;
bmp0->CreateCompatibleDC(pDC);
bmp0->SelectObject(&bit);


bitmap2.LoadBitmap(IDB_BITMAP2);
bmp1->CreateCompatibleDC(pDC);
bmp1->SelectObject(&bitmap2);

bitmap3.LoadBitmap(IDB_BITMAP3);
bmp2->CreateCompatibleDC(pDC);
bmp2->SelectObject(&bitmap3);

CRect* re=new CRect;
//背景
pMemDC->BitBlt(100,100,32,32,bmp1,32*8,0,SRCCOPY);
in=1;
}
CNanrenDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDC->BitBlt(0,0,634,436,pMemDC,0,0,SRCCOPY);
}

BOOL CNanrenView::OnEraseBkgnd(CDC* pDC)
{
return false;
}

这样就完成了,我在需要重画的时候调用draw()函数,它就改变了pMemDC,同事激发了OnDraw,不需要我控制重画的时候OnDraw就自动重画了。代码绝对可用
ljzcom 2003-08-24
  • 打赏
  • 举报
回复
谢谢大家的帮忙,明天我上班按大家的方法调试通过马上散分。

vcforever(霓裳羽衣),可否说得明白一些啊?可以的话写个简单得例子吧,
我是否要对背景图或每个图标都分别用两个内存DC啊?

checkyvc6 2003-08-23
  • 打赏
  • 举报
回复
对了,在对话框的背景设置代码最好写在WM_EREASEBKGROUD消息处理里面
checkyvc6 2003-08-23
  • 打赏
  • 举报
回复
不知道你实时显示的背景图是怎么做的,能说一下吗?
建议:
多做几个memDC,每个小图标分别做一个memdc
例如:
memdcIcon1.SelectObject(hIcon1);
memdcIcon2.SelecctObject(hIcon2);
memdcBk.SelectObject(hBitmap);//hbitmap背景图
Bitblt(memdcBk,.....memdcIcon1);
Bitblt(memdcBk,.....memdcIcon2);
然后
Bitblt(hdc,...memdcBk);

ljzcom 2003-08-23
  • 打赏
  • 举报
回复
我用过两个memDC,可是不行啊。另说明一下,我的背景图是实时变换的图像
ljzcom 2003-08-23
  • 打赏
  • 举报
回复
duqiang2050(杜杜), 你的程序是如何使用双缓冲功能的啊?
duqiang2050 2003-08-23
  • 打赏
  • 举报
回复
用双缓冲进行刷新

void CMyEdit::OnPaint()
{
//在View中显示整个界面背景位图(覆盖其中的编辑框),编辑框取出其外框区域内的背景位图。
CPaintDC dc(this); // device context for painting
CRect re;
GetClientRect(&re);//得到Edit控件的外框,即背景区域

if(bFirst){
//第一次刷新,取得编辑框下的背景位图(不是载入的位图资源),
memDC->CreateCompatibleDC(&dc);
bFirst=FALSE;
//关键就是我不会保存该背景位图(在没写入文字前的背景),下次刷新前怎样载入它?
bitmap.CreateCompatibleBitmap(&dc,re.Width(),re.Height());
oldBmp=memDC->SelectObject(&bitmap); //选入取得的背景位图。
memDC->BitBlt(0,0,re.Width(),re.Height(),&dc,0,0,SRCCOPY);//载进缓存上下文。
bitmap.DeleteObject();
}
else {

//这里如何载入保存的背景位图?

}

LOGFONT lf;
GetFont()->GetLogFont(&lf);
memDC->SetBkMode(1);
memDC->SelectObject(GetFont());

for() //显示文字的循环。
{
......
memDC->TextOut(0, i*nLineH, p);
}

dc.BitBlt(0,0,re.Width(),re.Height(),memDC,0,0,SRCCOPY);
memDC->SelectObject(oldBmp);
}
yonk 2003-08-23
  • 打赏
  • 举报
回复
用背景色重画不行?或者直接内存copy
lanfanghelanfanghe 2003-08-23
  • 打赏
  • 举报
回复
UP

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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