这个礼拜,一直在做一件事情,问题的来源就是在C#的Form程序中,实现显示GIF的功能。或许很多人都说这不简单,用Label或者PictureBox不就行了,呵呵,是的,但这不是需求的功能。我要实现的就是像QQ的文本框能够显示Gif的功能。
是的,很多人又会说,使用QQ的ImageOle.dll就行了,是的,可那毕竟是人家腾讯做的东西,如果将来我要在公司的项目中使用,那不如侵权,所以只能想办法自己实现。
思路有两个:
1 使用OLE方法将GIF动画放到Label中去,然后将Label作为OLE对象插入到RichTextBox中去,当然,这个RichTextBox是经过自己改装的。那么我之所以放弃了这条路,是因为我虽然可以插入,但是,有个前提条件必须是Label必须有一个父窗体,也就是说,必须设置Label的Parent,否则,Label是可以被插入到Rich中,但是,Label中的Gif却只显示第一帧,即没有了动画效果,但是,如果设置了Parent,GIF可以动了,但是,却在父窗体上又显示了同样的Label,这个问题,我想了很久,未果,所以,选择放弃,因为在CodeProject上一位读者也问了同样的问题,但是,作者没有回答。所以,我放弃这种方式。
2 使用WebBrowser。
利用它的好处是可以显示多种图片,而且也可以保存页面信息等。再者,我使用过VC实现了该功能,所以把握更大点。
在实现过程中,遇到了如下的麻烦,我一一解决,我使用的IDE是VS2003。
Q1:如何向项目中嵌入一个Html页面?
A1:在 解决方案资源管理器中,在你所需要的工程上,右键弹出菜单,选择 添加->添加现有项,然后选择你要插入的Html,当OK确定后,选择已经存在在 解决方案资源管理器 中的Html,然后看它的 属性,将 生成操作 一项选择 嵌入的资源即可。
Q2:如何将该嵌入的Html页面读到WebBrowser中去?
A2:这个比较难,我也是在网上找了很久才找到的。我希望能看到这篇文章的人,如果有更好的方法,请给我指点。
首先,将下面的代码保存到 UnsafeNativeMethods.cs 文件中。
/**/
/********************************
* 微软自身的接口声明
* 由于找不到可用的Interface声明
* 只好祭出Reflector,反编译Windows.Forms
* 需要的朋友可以不用辛苦的自己搞了
* ******************************/
using
System;
using
System.IO;
using
System.Runtime.CompilerServices;
using
System.Runtime.InteropServices;
using
System.Security;
using
System.Security.Permissions;
using
System.Text;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
namespace
SimTrade4.ChatRoom
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
[StructLayout(LayoutKind.Sequential)]
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public class STATSTG ...{
[MarshalAs(UnmanagedType.LPWStr)]
public string pwcsName;
public int type;
[MarshalAs(UnmanagedType.I8)]
public long cbSize;
[MarshalAs(UnmanagedType.I8)]
public long mtime;
[MarshalAs(UnmanagedType.I8)]
public long ctime;
[MarshalAs(UnmanagedType.I8)]
public long atime;
[MarshalAs(UnmanagedType.I4)]
public int grfMode;
[MarshalAs(UnmanagedType.I4)]
public int grfLocksSupported;
public int clsid_data1;
[MarshalAs(UnmanagedType.I2)]
public short clsid_data2;
[MarshalAs(UnmanagedType.I2)]
public short clsid_data3;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b0;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b1;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b2;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b3;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b4;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b5;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b6;
[MarshalAs(UnmanagedType.U1)]
public byte clsid_b7;
[MarshalAs(UnmanagedType.I4)]
public int grfStateBits;
[MarshalAs(UnmanagedType.I4)]
public int reserved;
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public STATSTG() ...{
}
}
[SuppressUnmanagedCodeSecurity]
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
internal class UnsafeNativeMethods ...{
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("7FD52380-4E07-101B-AE2D-08002B2EC713")]
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public interface IPersistStreamInit ...{
void GetClassID(out Guid pClassID);
[PreserveSig]
int IsDirty();
void Load([In, MarshalAs(UnmanagedType.Interface)] IStream pstm);
void Save([In, MarshalAs(UnmanagedType.Interface)] IStream pstm, [In, MarshalAs(UnmanagedType.Bool)] bool fClearDirty);
void GetSizeMax([Out, MarshalAs(UnmanagedType.LPArray)] long pcbSize);
void InitNew();
}
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("0000000C-0000-0000-C000-000000000046")]
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public interface IStream ...{
int Read(IntPtr buf, int len);
int Write(IntPtr buf, int len);
[return: MarshalAs(UnmanagedType.I8)]
long Seek([In, MarshalAs(UnmanagedType.I8)] long dlibMove, int dwOrigin);