基于对话框的程序,想在里面加入GIF图片,实现后对话框无论怎么移动都很正常,可是把这个对话框的背景变成BMP图片时,再移动对话框,移动过程中,GIF图片显示就出问题了,有时能出现,有时不能出现,对话框移动慢了就没事,但是反方向的移动就有不行,这是怎么回事??

解决方案 »

  1.   

    恩,显示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;然后情况就出现了
      

  2.   

    呵呵,才看到更新。
    OnEraseBkgnd()是在onpaint()之前运行的。
    可能是这个原因造成的。将你的Bitmap代码,和Gif那段放在一起,
    Gif在其后,调试一下看看有什么效果。其他的再说。
      

  3.   

    另外你的CPictureEX这个类,我没见过,是否有冲突?考虑一下。
    一般来说,图像最好公用一个类,或者直接自己写。
      

  4.   

    还有,刚才没细看,代码有些小问题,是否由此引起一些问题,呵呵,还是怀疑跟那个类冲突或资源泄漏。
    定义显示设备也应该写在前面的,最好这么写
    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);不过这个是用于防止背景图像闪烁的。有点事先下了。
      

  5.   

    to:fronz
    非常感谢你的帮助,呵呵,你说的我都做了,情况还是那样,将Bitmap代码,和Gif那段放在一起, Gif在其后,调试后还是那样,只是当图像向右移动和向下移动时没问题,但是资源占用马上会到100%;不过我把显示GIF的代码给放到了OnInitDialog()中,就没那情况了,非常不理解~~~~~,我的目的就是有个变量能够控制哪个GIF图片的显示,好像要是放到OnInitDialog()里就不能这样了
      

  6.   

    呵呵,回来晚了点。下午还是看的不仔细,还有一处需要修改,Bitmap-〉CBitmap,
    刚简单调试了一下程序,也找到了那个pictureEX,没仔细看它的其他的功能。没有发现问题,资源调用也很正常,不过我把两个调用都写在OnPaint里了。
    应该满足你的要求吧。如果你需要源代码,留下邮箱。
      

  7.   

    谢谢fronz学习一下,不盛感激阿......
      

  8.   

    to fronz代码我仔细的看了,不解的是里面的那个CT2DlgAutoProxy类是做什么的,我做实验的时候把这个类去掉,运行就开始提示错误,然后关闭了,还有你手动添加了对话框的析构函数有何用意??对话框里面加入要是换个全对话框大的图片,重绘时按钮们会消失正在解决中
      

  9.   

    呵呵,可能你没看到我给你的消息,我的那个程序是前些天回答另一个问题创建的,autoProxy那些你不用管,也没改析构,我添加了几个变量和函数,你最好重新另建个dlg,将代码添加进取。我又调了一遍,你可以将那个OnPaint里的我添加的那些LoadBMPBgd()和if else放到OnEraseBkgnd里,这样解决了你全对话框位图按钮消失的问题,其他windows程序界面覆盖后也不会消失了,不过还是会在你移动对话框出界的情况下会消失。当然OnEraseBkgnd一定要重载返回值true恩,这么说吧,
    其实前面我已经提到过,刷新的问题在这种dlg图像编程时,一直都有,能解决么?应该可以,但肯定有牺牲,可能是性能方面或效率方面。MFC的架构下,dlg原并不是用来做显示绘图用的,我们自己硬要它做,需要改动的方面很多。
    比如你这个,而且偏偏你用了一种封装的绘图类,其中本身就有CDC调用,但又加上了在架构下自己编的CDC代码。
    很容易引起一些问题或影响效率,最好的代码要有统一和整体性,用别人的类或控件总要有限制有牺牲。另外一个问题就是对windows消息的响应,你移动窗口,或运行其他程序后,很容易将消息机制复杂化。
    windows会不断有消息过来要求你的绘图界面刷新,BMP背景和GIF在这里地位都是一样的,
    并不会因为我们想将BMP作固定dlg背景,windows就对它另眼相看,它就真的一动不动了。所以解决这些冲突问题就需要不断尝试,并理解windows的处理机制,更改程序代码或重载MFC架构函数来实现,
    呵呵,有些繁琐呀。
    因为我不了解你程序的目标和用途,所以很难替你完成这些,你需要清楚自己的用途,然后尽量使工作简单化。
      

  10.   

    呵呵,不好意思 ,忙得有点乱了,非常感谢fronz(恨不得把我所有的分送出去),我的目的很简单,就是一个动态的图片,我用投机的方式去实现,把需要动态的部分截出来,意GIF的方式插入进对话框的相应位置,然后把整个图片的需要动态的部分剪切掉,剩下的作为背景来显示,DIF图片就插入到剪切后的位置,这样就能实现整个对话框的动态效果了,好了,送分了,再次谢谢fronz
      

  11.   

    好像要是送了分就必需揭帖阿对了,那个LoadBMPBgd(),我试的时候不能作为函数调用,在onpaint里面也是这样。只要是用调用的方式,对话框根本就打不开,但是把里面的代码写在里面就可以,不解
      

  12.   

    在你的***dlg.h的public下添加void LoadBMPBg();就可以在***dlg.cpp中做函数用,用classwizard生成函数也可以,我只是封装了一下,没有太大关系。
      

  13.   

    to fronz:在.h文件里添加后就是那个情况,不能打开对话框,方便得话,加我qq可以吗46714326 ;这样联系起来会方便些,代码我把我写的和你的详细比较了下,没什么区别,我发给你看看
      

  14.   

    ^o^!   偶不用QQ的,有点土了
    也是安全问题,怕毒。程序可以发过来我替你改,上次的地址。我上网时间不太确定,0点前一段经常来,逛逛就走的时候多,
    呵呵