我想在一个图片框上显示一个ani动画光标,比如显示某个操作正在进行……一番查询,实现动画光标的途径如下:
在容器(图片框)内CreateWindowEx一个Static,然后SendMessage StatichWnd, STM_SETIMAGE, IMAGE_CURSOR
这样既可实现动画光标。现存在两个问题:1、这个图片框上已经绘制过图形,也就是说,这个图片框不是纯色的,而是一个绘制出来的背景图。
按照这个思路实现的效果,动画光标区域并不是透明的(这其实也可以理解,毕竟是一个覆盖在图片框上的一个窗口),而是容器(图片框)的背景色。目前经过的尝试有:CreateWindowEx之后对创建的Static处理,如增加WS_EX_LAYERED扩展风格,再滤色,无效。请教各路高人,是否有合适的解决方案?
2、用上述方法实现的动画光标的效果,其动画“播放速度”差不多只有正常的一半左右(可用SetCursor来做对比),非常诡异。(测试环境,WIN7 X64)目前最迫切的是第一个问题。若将每一帧拆分开来,循环绘制,那将会非常消耗CPU,得不偿失。
在容器(图片框)内CreateWindowEx一个Static,然后SendMessage StatichWnd, STM_SETIMAGE, IMAGE_CURSOR
这样既可实现动画光标。现存在两个问题:1、这个图片框上已经绘制过图形,也就是说,这个图片框不是纯色的,而是一个绘制出来的背景图。
按照这个思路实现的效果,动画光标区域并不是透明的(这其实也可以理解,毕竟是一个覆盖在图片框上的一个窗口),而是容器(图片框)的背景色。目前经过的尝试有:CreateWindowEx之后对创建的Static处理,如增加WS_EX_LAYERED扩展风格,再滤色,无效。请教各路高人,是否有合适的解决方案?
2、用上述方法实现的动画光标的效果,其动画“播放速度”差不多只有正常的一半左右(可用SetCursor来做对比),非常诡异。(测试环境,WIN7 X64)目前最迫切的是第一个问题。若将每一帧拆分开来,循环绘制,那将会非常消耗CPU,得不偿失。
解决方案 »
- 水晶报表运行中显示"报表创建 API"许可证 "没有,如果找到这个许可证,是水晶报表9中文版
- 用vb做的控件用vb自带的打包工具打成CAB包,但是无法下载,直接用OCX就可以,原因是什么?
- 大家好,帮帮忙!!谢谢!也各关于打包的问题
- 求助: CRC CCITT 计算方法
- 紧急求救,在线等,在vb中对oracle操作时,怎样提交commit语句?
- 大家经常去的vb的论坛,除csdn:
- vb调用控制面板的拨号连接可以吗?
- 老大,如何提取文本文件中指定行的数据?(我急,多谢!)
- 跪求日程管理源代码!!!
- 自已定制菜单的问题?
- jhone99 请进
- 送分100分:请详细讲解一下QueryUnload、Unload、Terminate三者的用法和区别
'************************************************************
'* 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
我看就用flash来做比较好
因为vb是单线程的,你即便完美放入这样一个控件,多半在加载的时候,这个控件根本无法响应这个播放事件
因为ie8也好,360也好都是多线程的,人家肯定是单独一个线程在播放这个动画。vb6搞这个貌似这么多年了,还没有好的方法。
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);
...
http://www.vbaccelerator.com/home/VB/Code/Libraries/Graphics_and_GDI/Animated_Cursors_in_VB/article.asp