我要实现一个像瑞星助手那样的动画窗口(会动的动物的异型窗体)。
思路是在一个窗口上放个GIF动画,然后将背景色透明即可。
GIF动画可以从网上下载到控件。
现在的问题就是怎么让窗口透明。我在网上找到了两种方法:
1.函数SetLayeredWindowAttributes,这个函数的效果就是我想要的,但是这个函数只在Wind2000下有效,连XP都不行,其他系统就更完完。
2.使用CRgn类联合,但是我的GIF动画是不停的变动的,CRgn区域是固定的,如果一直变换,很难控制。请教各位,还有别的方法么?

解决方案 »

  1.   

    //=======================================
      SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
     GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
     HINSTANCE hInst = LoadLibrary("User32.DLL"); //显式加载DLL
     if(hInst)
     {           
      typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);         
      MYFUNC fun = NULL;    
      fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");//取得SetLayeredWindowAttributes函数指针
      if(fun)fun(this->GetSafeHwnd(),0,100,2);    
      FreeLibrary(hInst);
     }
    //=========================================
      

  2.   

    谁告诉你XP不行的?User32.DLL里已经包含了
      

  3.   

    你的问题我也遇到过,你可以用最新的SDK,也就是MFC4.2以上的版本,这样不管是什么系统都可以直接调用这个SetLayeredWindowAttributes函数,我以前的一个实训项目就是用的MFC7.0但是到最后XP系统可以用,到了win2000系统就不行了.所以我觉得还是不要用楼上的在Windows核心模块里查找调用函数的办法,直接用最新SDK,里面就有这个函数了,调用起来也比这方便.检验你的SDK里是否有这个函数的方法是在随便一个MFC工程的代码文件里输入SetLayeredWindowAttributes这个函数然后在其上点右键选"转到定义".如果提示未定义符号"SetLayeredWindowAttributes"那就是你的SDK里没有这个函数,否则就可以随意调用并与系统无关了~
      

  4.   

    获得函数地址,调用之,API也是用动态库提供的啊,只要你的系统是2000以上的即可,下个新SDK不是自找麻烦吗?
      

  5.   

    瑞星助手是MS Agent做的吧,Office中的也是, 不是直接用窗体。
      

  6.   

    在窗体第一次显示时或显示位置有移动时,先用GetCurrentBitmap来得到父窗体中的位图
    由你的窗体的位置来计算它所在位图的区域,用这一部分埴充背景再显示其它的图形
    优化:
    如果不要求精度的话,可以从启动到结束只使用一幅位图