[C#问题]WebBrowser在Form程序中使用的感想。

 

    这个礼拜,一直在做一件事情,问题的来源就是在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;

namespace  SimTrade4.ChatRoom
{
  [StructLayout(LayoutKind.Sequential)]
  
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;
    
public STATSTG() {
    }

  }

  [SuppressUnmanagedCodeSecurity]
  
internal class UnsafeNativeMethods {
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid(
"7FD52380-4E07-101B-AE2D-08002B2EC713")]
      
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")]
      
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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值