我想在一个图片框上显示一个ani动画光标,比如显示某个操作正在进行……一番查询,实现动画光标的途径如下:
在容器(图片框)内CreateWindowEx一个Static,然后SendMessage StatichWnd, STM_SETIMAGE, IMAGE_CURSOR
这样既可实现动画光标。现存在两个问题:1、这个图片框上已经绘制过图形,也就是说,这个图片框不是纯色的,而是一个绘制出来的背景图。
按照这个思路实现的效果,动画光标区域并不是透明的(这其实也可以理解,毕竟是一个覆盖在图片框上的一个窗口),而是容器(图片框)的背景色。目前经过的尝试有:CreateWindowEx之后对创建的Static处理,如增加WS_EX_LAYERED扩展风格,再滤色,无效。请教各路高人,是否有合适的解决方案?
2、用上述方法实现的动画光标的效果,其动画“播放速度”差不多只有正常的一半左右(可用SetCursor来做对比),非常诡异。(测试环境,WIN7 X64)目前最迫切的是第一个问题。若将每一帧拆分开来,循环绘制,那将会非常消耗CPU,得不偿失。

解决方案 »

  1.   

    '           《VB前线》http://vbbattlefront.163.net
    '************************************************************
    '*                   VB  系列功能演示程序                   *
    '*                                                          *
    '*     如果您发现此程序有任何不妥之处或存在需要改进的地方, *
    '* 望告诉我本人,本人将非常感激您,并一定回信致谢!         *
    '*                                                          *
    '*                 by 池星泽(Xing) my Email:[email protected]  *
    '************************************************************
    '*程序编号∶018
    '*功    能∶如何在VB中使用.ani 动画光标文件
    '*日    期∶3/24/1999
    '************************************************************
    Option Explicit
    Private Const GCL_HCURSOR& = (-12)
    Private Declare Function SetClassLong& Lib "user32" Alias "SetClassLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long)
    Private Declare Function LoadCursorFromFile& Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String)Private NewCursor1 As Long
    Private OldCursor1 As Long
    Private NewCursor2 As Long
    Private OldCursor2 As LongPrivate Sub Form_Load()
        NewCursor1 = LoadCursorFromFile(App.Path & "\大自然等待.ani")
        OldCursor1 = SetClassLong(Me.hWnd, GCL_HCURSOR, NewCursor1)
        
        NewCursor2 = LoadCursorFromFile(App.Path & "\危险动物忙碌.ani")
        OldCursor2 = SetClassLong(Picture1.hWnd, GCL_HCURSOR, NewCursor2)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       SetClassLong Me.hWnd, GCL_HCURSOR, OldCursor1
       SetClassLong Picture1.hWnd, GCL_HCURSOR, OldCursor2
    End Sub
      

  2.   

    可否换一个思路?使用GIF图片?
      

  3.   

    我也想过,也测试过,效果不好。原因:gif都被压缩过,色彩失真
      

  4.   

    要效果好,我倒是推荐PNG图片,多做几副图片,使用Timer连续切换,形成动态显示,效果还是不错的。
      

  5.   

    理论上来说也不是不可以,不用PNG用ICO也可以(更容易),但是要这个效果一直持续下去的话,就要一直不停的绘制, 比较消耗CPU的。就拿IE7/8来说,如果打开10个页面,每个标签都在这样绘制的话,估计电脑资源耗尽了。类似的资料比较少,郁闷……
      

  6.   


    我看就用flash来做比较好
      

  7.   

    用flash来做同样面临背景透明的问题。如果参照背景而设计一个FLASH,那么当背景改变后又不行了……9楼,把精力放在这上面有什么不对的吗?
      

  8.   

    1、ie8肯定不是vb6写的2、另外做透明背景的控件也是相当容易了,ie8那个加载图像我看更简单,也就是多个图片轮番播放的过程或轮番画点的过程3、可能难度存在于那个圈中间掏空位置的透明,但貌似不怕麻烦也能搞定其实我觉得lz的问题不在于如何实现这个功能,而在于实现这个功能后对线程处理的过程
    因为vb是单线程的,你即便完美放入这样一个控件,多半在加载的时候,这个控件根本无法响应这个播放事件
    因为ie8也好,360也好都是多线程的,人家肯定是单独一个线程在播放这个动画。vb6搞这个貌似这么多年了,还没有好的方法。
      

  9.   

    可以考虑使用avi文件来做过程动画,类似windows的文件拷贝对话框上的动画。
      

  10.   

    给你参考一段我的GDI处理过程...
    if(IsDrawScene==TRUE)
    IsDrawScene = FALSE;
    MouseDHCount++;
    if(MouseDHCount>=3)
    MouseDHCount=0; BitBlt(MouseScene.hDC,0,0,MouseScene.Width,MouseScene.Height,GDIScene.hDC,MousePosX-4,MousePosY-21,SRCCOPY);
    MouseScene.SaveScene();
    GDIScene.AlphaBlend((long)MouseScene.Width,(long)MouseScene.Height,
    (long)MouseScene.ColorBitSize,
    MouseScene.Bytes,
    0,0,
    (long)MouseDH[0].Width,(long)MouseDH[0].Height,
    (long)MouseDH[0].ColorBitSize,
    MouseDH[0].Bytes,
    MouseDH[MouseDHCount+1].Bytes);
    MouseScene.UpdateBytes(); BitBlt(DrawScene.hDC,0,0,DrawScene.Width,DrawScene.Height,GDIScene.hDC,0,0,SRCCOPY);
    BitBlt(DrawScene.hDC,MousePosX-4,MousePosY-21,MouseScene.Width,MouseScene.Height,MouseScene.hDC,0,0,SRCCOPY);
    if(testString.lengthB>0)
    TextOut(DrawScene.hDC,0,0,*testString,testString.lengthB);

    BitBlt(RefreshHDC,0,0,1024,768,DrawScene.hDC,0,0,SRCCOPY);
    ...
      

  11.   

    无论多少个标签页,同时显示的都是同一帧,所以数量不是问题。参考下面的例子:
    http://www.vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Animated_Cursors_in_VB/article.asp