最近一个多月忙着分析XMPP协议和libJingle库,基本告一个段落,抽空把DynamicGif的更新版本发上来,顺便介绍如何在.Net下使用。
主要的更新:
- 更新了一个bug:以前使用的Thunk代码在有些CPU上有些问题,考虑到以后可能将这个控件移植到Windows Mobile上,所以修改了Thunk机制,目前支持绝大部分CPU。必要时可以不用Thunk。
- 添加了一个新的类,主要用在Richedit模式下,尽可能的将CPU的占用率降到最低。不建议使用该类,因为后续可能有较大的改动(要删除部分功能,而不是添加),可能会导致兼容性问题。
- 添加了一个新的功能来实现类似MSN的"动漫传情“的功能。
函数的原型如下:
[id(3), helpstring("方法ShowFlash")]
HRESULT ShowFlash([in]OLE_HANDLE hParent,[in] BSTR bstrFlash, [in] ULONG ulTimeOut, [out,retval] OLE_HANDLE* hWnd);
其中:
hParent: 父窗口句柄
bstrFlash:待显示的本地Flash文件全路径
ulTimeout: 最长显示时间,-1表示无限长的时间,否则是最长显示时间,ulTimeout 毫秒。
hWnd: 显示Flash的窗口句柄,成功返回窗口句柄
说明:
成功返回S_OK,失败返回E_FAIL。主要功能是透明的显示一个Flash。这里需要说明的是:这样的Flash在设计时需要设定,在执行结束时,发出一个“quit”命令,通知容器准备退出。对于设计不符合这种标准的,这里简单的给出一个解决方案,即设定最长播放时间,到时自动退出。
使用方法:(C#)
DynamicGifLib.DynGifManagerClass mgr = new DynamicGifLib.DynGifManagerClass();
Int hwnd = mgr.ShowFlash((int)this.Handle, "z://flash_5.swf", 1000);
// 可以在父窗口的WM_MOVE 消息中添加代码,来保证flash始终显示在父窗口之上
// 注意,一定要判断窗口句柄是否有效,因为窗口会自动销毁
// 注意,不要删除hwnd,会自动销毁
if( ::IsWindow( m_hwndFlashShow ) )
{
::SetWindowPos(m_hwndFlashShow,HWND_TOP,x,y,0,0,SWP_NOSIZE|SWP_NOZORDER );
}
// 在WM_SIZE中处理类上述代码
目前作为beta版,可能会有不少bug,欢迎指出,谢谢!