图片显示时候时有时无问题,急等指点!! 基于对话框的程序,想在里面加入GIF图片,实现后对话框无论怎么移动都很正常,可是把这个对话框的背景变成BMP图片时,再移动对话框,移动过程中,GIF图片显示就出问题了,有时能出现,有时不能出现,对话框移动慢了就没事,但是反方向的移动就有不行,这是怎么回事?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 恩,显示GIF是用的CPictureEX这个类,然后在onpaint函数里面加入了显示GIF的代码if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIF1),_T("Gif"))) m_GifPic.Draw();此时要是不设置图片背景(下面代码),对话框移动一点问题也没有又在:OnEraseBkgnd()函数里面添加了对话框图片背景的代码:Bitmap bBitmap; bBitmap.LoadBitmap(IDB_BITMAP2); CDC tempDC; tempDC.CreateCompatibleDC(pDC); tempDC.SelectObject(&bBitmap); ///////////////////////////////////////显示对话框背景 CRect rect; GetClientRect(&rect); pDC->BitBlt(0,0,rect.Width(),rect.Height(),&tempDC,11,0,SRCCOPY); bBitmap.DeleteObject(); return 0;然后情况就出现了 呵呵,才看到更新。OnEraseBkgnd()是在onpaint()之前运行的。可能是这个原因造成的。将你的Bitmap代码,和Gif那段放在一起,Gif在其后,调试一下看看有什么效果。其他的再说。 另外你的CPictureEX这个类,我没见过,是否有冲突?考虑一下。一般来说,图像最好公用一个类,或者直接自己写。 还有,刚才没细看,代码有些小问题,是否由此引起一些问题,呵呵,还是怀疑跟那个类冲突或资源泄漏。定义显示设备也应该写在前面的,最好这么写CDC tempDC; Bitmap bBitmap; tempDC.CreateCompatibleDC(pDC); bBitmap.LoadBitmap(IDB_BITMAP2); tempDC.SelectObject(&bBitmap); CRect rect; GetClientRect(&rect); pDC- >BitBlt(0,0,rect.Width(),rect.Height(),&tempDC,11,0,SRCCOPY); bBitmap.DeleteObject();tempDC.DeleteDC(); return 0; 如果还有问题,尝试重载重载OnEraseBkgnd()函数用return TRUE;取代原有的return CWnd::OnEraseBkgnd(pDC);不过这个是用于防止背景图像闪烁的。有点事先下了。 to:fronz非常感谢你的帮助,呵呵,你说的我都做了,情况还是那样,将Bitmap代码,和Gif那段放在一起, Gif在其后,调试后还是那样,只是当图像向右移动和向下移动时没问题,但是资源占用马上会到100%;不过我把显示GIF的代码给放到了OnInitDialog()中,就没那情况了,非常不理解~~~~~,我的目的就是有个变量能够控制哪个GIF图片的显示,好像要是放到OnInitDialog()里就不能这样了 呵呵,回来晚了点。下午还是看的不仔细,还有一处需要修改,Bitmap-〉CBitmap,刚简单调试了一下程序,也找到了那个pictureEX,没仔细看它的其他的功能。没有发现问题,资源调用也很正常,不过我把两个调用都写在OnPaint里了。应该满足你的要求吧。如果你需要源代码,留下邮箱。 谢谢fronz学习一下,不盛感激阿...... to fronz代码我仔细的看了,不解的是里面的那个CT2DlgAutoProxy类是做什么的,我做实验的时候把这个类去掉,运行就开始提示错误,然后关闭了,还有你手动添加了对话框的析构函数有何用意??对话框里面加入要是换个全对话框大的图片,重绘时按钮们会消失正在解决中 呵呵,可能你没看到我给你的消息,我的那个程序是前些天回答另一个问题创建的,autoProxy那些你不用管,也没改析构,我添加了几个变量和函数,你最好重新另建个dlg,将代码添加进取。我又调了一遍,你可以将那个OnPaint里的我添加的那些LoadBMPBgd()和if else放到OnEraseBkgnd里,这样解决了你全对话框位图按钮消失的问题,其他windows程序界面覆盖后也不会消失了,不过还是会在你移动对话框出界的情况下会消失。当然OnEraseBkgnd一定要重载返回值true恩,这么说吧,其实前面我已经提到过,刷新的问题在这种dlg图像编程时,一直都有,能解决么?应该可以,但肯定有牺牲,可能是性能方面或效率方面。MFC的架构下,dlg原并不是用来做显示绘图用的,我们自己硬要它做,需要改动的方面很多。比如你这个,而且偏偏你用了一种封装的绘图类,其中本身就有CDC调用,但又加上了在架构下自己编的CDC代码。很容易引起一些问题或影响效率,最好的代码要有统一和整体性,用别人的类或控件总要有限制有牺牲。另外一个问题就是对windows消息的响应,你移动窗口,或运行其他程序后,很容易将消息机制复杂化。windows会不断有消息过来要求你的绘图界面刷新,BMP背景和GIF在这里地位都是一样的,并不会因为我们想将BMP作固定dlg背景,windows就对它另眼相看,它就真的一动不动了。所以解决这些冲突问题就需要不断尝试,并理解windows的处理机制,更改程序代码或重载MFC架构函数来实现,呵呵,有些繁琐呀。因为我不了解你程序的目标和用途,所以很难替你完成这些,你需要清楚自己的用途,然后尽量使工作简单化。 呵呵,不好意思 ,忙得有点乱了,非常感谢fronz(恨不得把我所有的分送出去),我的目的很简单,就是一个动态的图片,我用投机的方式去实现,把需要动态的部分截出来,意GIF的方式插入进对话框的相应位置,然后把整个图片的需要动态的部分剪切掉,剩下的作为背景来显示,DIF图片就插入到剪切后的位置,这样就能实现整个对话框的动态效果了,好了,送分了,再次谢谢fronz 好像要是送了分就必需揭帖阿对了,那个LoadBMPBgd(),我试的时候不能作为函数调用,在onpaint里面也是这样。只要是用调用的方式,对话框根本就打不开,但是把里面的代码写在里面就可以,不解 在你的***dlg.h的public下添加void LoadBMPBg();就可以在***dlg.cpp中做函数用,用classwizard生成函数也可以,我只是封装了一下,没有太大关系。 to fronz:在.h文件里添加后就是那个情况,不能打开对话框,方便得话,加我qq可以吗46714326 ;这样联系起来会方便些,代码我把我写的和你的详细比较了下,没什么区别,我发给你看看 ^o^! 偶不用QQ的,有点土了也是安全问题,怕毒。程序可以发过来我替你改,上次的地址。我上网时间不太确定,0点前一段经常来,逛逛就走的时候多,呵呵 关于CStatic显示的问题,路过的大牛进来指点下 关于ListCtrl的问题! mfc中的CList类不能嵌套使用吗? 关于“最近开大的文件”的问题 如何创建CDialogBar工具栏??? 怎样发广播找服务器 请问485的问题 再次用我的最大分数向高手请教关于CRichEditView的一个问题 如何将内存中一个结构体的内容复制到内存中另一片相同的结构体中? 非模态对话框向主对话框传值失败 我要在sdk对话框里边发送一个数据到编辑框怎么做 全屏转换到窗口模式问题
if (m_GifPic.Load(MAKEINTRESOURCE(IDR_GIF1),_T("Gif")))
m_GifPic.Draw();此时要是不设置图片背景(下面代码),对话框移动一点问题也没有又在:OnEraseBkgnd()函数里面添加了对话框图片背景的代码:
Bitmap bBitmap;
bBitmap.LoadBitmap(IDB_BITMAP2);
CDC tempDC;
tempDC.CreateCompatibleDC(pDC);
tempDC.SelectObject(&bBitmap); ///////////////////////////////////////显示对话框背景
CRect rect;
GetClientRect(&rect);
pDC->BitBlt(0,0,rect.Width(),rect.Height(),&tempDC,11,0,SRCCOPY);
bBitmap.DeleteObject();
return 0;然后情况就出现了
OnEraseBkgnd()是在onpaint()之前运行的。
可能是这个原因造成的。将你的Bitmap代码,和Gif那段放在一起,
Gif在其后,调试一下看看有什么效果。其他的再说。
一般来说,图像最好公用一个类,或者直接自己写。
定义显示设备也应该写在前面的,最好这么写
CDC tempDC;
Bitmap bBitmap; tempDC.CreateCompatibleDC(pDC);
bBitmap.LoadBitmap(IDB_BITMAP2);
tempDC.SelectObject(&bBitmap);
CRect rect;
GetClientRect(&rect);
pDC- >BitBlt(0,0,rect.Width(),rect.Height(),&tempDC,11,0,SRCCOPY);
bBitmap.DeleteObject();
tempDC.DeleteDC();
return 0; 如果还有问题,尝试重载重载OnEraseBkgnd()函数
用return TRUE;取代原有的return CWnd::OnEraseBkgnd(pDC);不过这个是用于防止背景图像闪烁的。有点事先下了。
非常感谢你的帮助,呵呵,你说的我都做了,情况还是那样,将Bitmap代码,和Gif那段放在一起, Gif在其后,调试后还是那样,只是当图像向右移动和向下移动时没问题,但是资源占用马上会到100%;不过我把显示GIF的代码给放到了OnInitDialog()中,就没那情况了,非常不理解~~~~~,我的目的就是有个变量能够控制哪个GIF图片的显示,好像要是放到OnInitDialog()里就不能这样了
刚简单调试了一下程序,也找到了那个pictureEX,没仔细看它的其他的功能。没有发现问题,资源调用也很正常,不过我把两个调用都写在OnPaint里了。
应该满足你的要求吧。如果你需要源代码,留下邮箱。
其实前面我已经提到过,刷新的问题在这种dlg图像编程时,一直都有,能解决么?应该可以,但肯定有牺牲,可能是性能方面或效率方面。MFC的架构下,dlg原并不是用来做显示绘图用的,我们自己硬要它做,需要改动的方面很多。
比如你这个,而且偏偏你用了一种封装的绘图类,其中本身就有CDC调用,但又加上了在架构下自己编的CDC代码。
很容易引起一些问题或影响效率,最好的代码要有统一和整体性,用别人的类或控件总要有限制有牺牲。另外一个问题就是对windows消息的响应,你移动窗口,或运行其他程序后,很容易将消息机制复杂化。
windows会不断有消息过来要求你的绘图界面刷新,BMP背景和GIF在这里地位都是一样的,
并不会因为我们想将BMP作固定dlg背景,windows就对它另眼相看,它就真的一动不动了。所以解决这些冲突问题就需要不断尝试,并理解windows的处理机制,更改程序代码或重载MFC架构函数来实现,
呵呵,有些繁琐呀。
因为我不了解你程序的目标和用途,所以很难替你完成这些,你需要清楚自己的用途,然后尽量使工作简单化。
也是安全问题,怕毒。程序可以发过来我替你改,上次的地址。我上网时间不太确定,0点前一段经常来,逛逛就走的时候多,
呵呵