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

ljzcom 2003-08-23 10:02:28
在一个基于对话框的应用程序中,用CreateWindows()另外创建了一个窗口(window2),
现在在window2中画实时显示的背景图,达到了无闪烁的动画效果。
现在想在背景图上面另外画一些小图标,可这些小图标却老是闪烁显示啊?
大虾们,怎么才能让它们也不闪啊?
UP者有分。 《《 很急,真帮忙解决问题的,可以另开贴给分。》》
...全文
46 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
【资源说明】 1、基于BP神经网络的自动驾驶模型车,包含收集数据、控制模型生成与在线离线自动运行源码+说明.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 基于BP神经网络的自动驾驶模型车,包含收集数据、控制模型生成与在线离线自动运行源码+说明.zip # TensorRider 自动驾驶车 ![](pics/TensorRider.jpg) TensorRider是一种基于BP神经网络,对驾驶场景具有学习能力的的简易自动驾驶车模型。目前,TensorRider仅能实现基本的车道保持功能,即在学习了操作者的遥控驾驶行为后,根据经验对类似的场景做出自动驾驶行为。 TensorRider使用Google TensorFlow作为算法框架,可以在CPU或支持CUDA的NVIDIA GPU上进行训练。 完成训练后,可以使用一台计算机(Linux,macOS或Windows)作为TensorRider的计算服务器,令实验小车在线运行,也可以通过在TensorRider的Raspberry Pi上连接Intel Movidius Neural Compute Stick(NCS),实现离线运行。 # 硬件需求 * TensorRider自动驾驶车模型,包括Raspberry Pi,摄像头,电机驱动电路等 * 运行Linux,Apple macOS 10.12+或Microsoft Windows 7+的计算机 * 带有模拟摇杆的游戏控制器(手柄) * (非必需)兼容CUDA的NVIDIA GPU,Intel Movidius NCS * 连接质量良好的无线局域网 # 使用方法 TensorRider实现基于学习的自动驾驶分为3个阶段:收集数据,建立模型和自动运行。 ## 1.收集数据 在这一步骤中,车辆模型在人工指引下,边行驶边记录摄像头拍摄的图像,同时记录下拍摄图像时车辆模型的转向角度。当收集了足够多的图像-转向角度数据后,即可以这些数据为依据,训练神经网络。 我们假设你已经在计算机上安装好了```Python3```和```Jupyter Notebook```。首先在计算机端安装依赖的python软件包。 ``` pip3 install pygame ``` *注:我们假设你已掌握使用pip安装软件包的方法,以及在虚拟环境中安装软件包的方法。例如根据你使用的python环境的不同,你可能需要使用conda install或pip install。* 目录```Step_1_Data_Collection```内包含进行数据采集所需的程序。先使用SFTP或NFS等方式,将```copy_to_rpi```目录中的文件传输至实验小车端的Raspberry Pi上。在Raspberry Pi上连接一个使用FAT32文件系统的USB闪存盘,并启动Raspberry Pi。 使用SSH登录Raspberry Pi,建立USB闪存盘的挂载点 ``` sudo mkdir /mnt/pdisk ``` 然后运行 ``` sudo mount -o uid=pi,gid=pi /dev/sda1 /mnt/pdisk/ ``` 挂载USB闪存盘。 *你也可以选择将数据存储在Raspberry Pi的SD卡,甚至内存文件系统中。但是比起使用网络传输采集的大量文件,使用USB闪存盘拷贝是更加快速的方式。如果你希望变更文件的存储位置,可在```rpi.py```的第161--163行中更改。* 挂载完成后运行```rpi.py```。如果实验小车上安装了状态指示灯,在接收到控制数据之前,红色指示灯每3秒闪烁一次。接着,在计算机上,在```transmitter.py```的第9行写入小车的局域网IP地址,然后运行```transmitter.py```。你将看到终端持续打印出读取到的手柄数据。如果与实验小车的连接正常,小车上的指示灯将转为绿色闪烁。 向前轻推控制器的左侧手柄,实验小车开始加速行驶,向后拉左侧手柄可使小车减速。向左、右方向推动右侧手柄,可使实验小车转向。若需要停,可同时按下```L2```+```R2```键,实验小车立即停车。 熟悉实验小车的操控方法后,可在适当的时机按下```START```键,实验小车开始收集行驶数据。再按一次```START```停止收集数据。 *数据收集建议至少持续30min。在收集数据时,需要使用较慢的恒定速度行驶,因为小车的转弯半径与速度相关。可以同时按下`

16,466

社区成员

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

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

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