DynamicGif 1.2

DynamicGif控件1.201Beta版发布,新增插入图像时指定大小的功能及辅助COM类,简化非VC环境下使用难度。适用于VC、VB、C#等环境。

早想降低一下DynamicGif控件的使用难度 ,正好这两天有时间,就更新了一下。

DynamicGif 1.201 Beta 2007-3-13 更新)

下载办法:

用FlashGet或者右键“另存为”下载下面的这个文件。除去前面的61字节后,用zip扩展名保存。

解压缩zip文件即可得到控件。(GIF:39,572 zip:39,511 DLL:98,304 Bytes )

https://p-blog.youkuaiyun.com/images/p_blog_youkuaiyun.com/kql01/283737/o_upload.gif

新增功能说明:

1、添加两个导出函数:

原来支持两个函数:

STDAPI InsertGifToRicheditA( HWND hWnd, LPCSTR lpszGifFile );

STDAPI InsertGifToRicheditW( HWND hWnd, LPCWSTR lpszGifFile);

现在增加了:

STDAPI InsertGifToRichedit2A( HWND hWnd, LPCSTR lpszGifFile,LONG lWidth,LONG lHeight );

STDAPI InsertGifToRichedit2W( HWND hWnd, LPCWSTR lpszGifFile,LONG lWidth,LONG lHeight );

允许在插入图像时,指定图像在Richedit中的初始大小。如果lWidthlHeight均为0,则按照图像原始大小插入。

 

2、增加了一个辅助的COM类,用在非VC的开发环境中,免去处理RichEdit一些OLE接口的问题。

COM接口定义如下:

[

object,

uuid(C51DA 89C -924D-4AE7-B740-09CC68192E09),

dual,

nonextensible,

helpstring("IDynGifManager 接口"),

pointer_default(unique)

]

interface IDynGifManager : IDispatch

{   

     // 将图像插入到指定的Richedit窗口,并设置初始大小,当widthheight均为0时,表示保持图像原始大小。

   [id(1), helpstring("方法InsertImage")]

HRESULT InsertImage([in] OLE_HANDLE hwnd,[in] BSTR bstrImagePath, [in] LONG ulWidth, [in] LONG ulHeight,[out,retval] IDispatch** hObj);

     //获取对象Richedit窗口hwndDynamicGif对象的信息

     //信息格式为:

     // 每个对象用一行表示,属性间用Tab分割

// 格式如下:

//     位置(0下标开始) Text属性 Width Height ImagePath

// 如果没用DynamicGif存在,则返回空字符串。

     [id(2), helpstring("方法GetObjectsInfo")]

HRESULT GetObjectsInfo([in] OLE_HANDLE hwnd,[out,retval] BSTR* pbstrObjectsInfo);

 

};

 

 使用方法:

1 Form或者对话框中显示一个Gif或其他类型的图像

这种使用方法最简单,将控件放到Form/对话框中,并在初始化的时候,调用LoadFromFile即可。(保留Text属性,用来解析图像和表情符号对应)

2 Richedit中插入图像

VC中的使用方法参考前面的文章,现在重点介绍一下在VB/C#中的用法,至于其他的环境,请自己摸索一下吧。

1)在控件面板中,将DynamicGif控件放入到部件库,会有一个小手出现

2)在相应的函数中,使用下面的语句将控件插入Richedit中:

VB

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim dynMgr As DynamicGifLib.DynGifManagerClass

        Dim objGif As DynamicGifLib.IDynamicGif

        dynMgr = New DynamicGifLib.DynGifManagerClass

        objGif = dynMgr.InsertImage(RichTextBox1.Handle().ToInt32(), "e:/L.gif", 72, 72)

        objGif.LoadFromFile("e:/1.gif")

    End Sub

C#

         private void Form1_Load(object sender, System.EventArgs e)

         {

              DynamicGifLib.DynGifManagerClass dynGif

= new  DynamicGifLib.DynGifManagerClass();

              object obj = dynGif.InsertImage( richTextBox1.Handle.ToInt32(),

                   "e://L.gif",72,72 );

              DynamicGifLib.IDynamicGif objGif = (DynamicGifLib.IDynamicGif)obj;

              objGif.LoadFromFile( "e://1.gif");

              objGif.AboutBox();

              objGif.DisplaySize = 128 * 65536 + 128 '显示图像大小为 128 * 128

             

         }

 

 

说明:

1 添加图像显示大小属性:DisplaySize;用一个long整数来表示,其中LOWORD为图像宽度,HIWORD为高度,即DisplaySize = Height * 65536 + Width

2 Richedit内部中对象信息可以通过GetObjectsInfo函数来获取,如果需要传输时将文字和图像文件分离,需要自己解析对象的信息,并写相关的协议。

 

 

 

### 在C#中插入和显示动态图片(如GIF) 在C#应用程序中,若需插入并播放动态图片(例如GIF动画),常见的做法是使用 `PictureBox` 控件或自定义控件来实现。然而,在某些情况下,标准控件可能无法满足需求,例如 `DataGridView` 显示GIF时仅显示第一帧的问题。要解决此类问题,可以采用以下方法。 #### 使用 `PictureBox` 播放 GIF 动画 `PictureBox` 控件本身支持加载和显示 GIF 图片,并能够自动播放其动画效果。只需设置其 `Image` 属性为 GIF 文件路径即可: ```csharp pictureBox1.Image = Image.FromFile("animation.gif"); ``` 该方式适用于简单的动画展示场景,且无需额外处理多帧逻辑[^1]。 #### 在 `DataGridView` 中显示 GIF 动画 当需要在 `DataGridView` 单元格中显示 GIF 动画时,默认行为仅会渲染第一帧。为实现完整动画效果,需通过自定义绘制单元格内容的方式处理。具体而言,可以在 `CellPainting` 事件中手动绘制每一帧图像,并结合定时器更新画面: ```csharp private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) { if (e.RowIndex >= 0 && e.ColumnIndex == yourGifColumnIndex) { // 获取当前单元格对应的GIF图像 Image gifImage = GetGifImage(e.RowIndex); // 绘制GIF图像 e.Graphics.DrawImage(gifImage, e.CellBounds); e.Handled = true; } } ``` 此外,还需配合 `Timer` 定期调用 `Invalidate` 方法以触发重绘,从而实现动画更新[^1]。 #### 使用 RichEdit 控件插入 GIF 动画 在VB6等旧版本开发环境中,可以通过调用封装的 DLL 函数将 GIF 插入到 `RichEdit` 控件中。虽然 C# 不直接提供类似机制,但可通过互操作服务调用非托管函数完成相同功能。例如,声明外部函数并传入目标控件句柄与 GIF 文件路径: ```csharp [DllImport("DynamicGif.dll", CharSet = CharSet.Auto)] private static extern int InsertGifToRichedit(IntPtr hwnd, string gifFile); // 调用示例 InsertGifToRichedit(richTextBox1.Handle, "animation.gif"); ``` 需要注意的是,这种方式依赖特定 DLL 文件(如 `DynamicGif.dll`)及其注册状态,且应确保系统环境兼容性[^2]。 #### 自定义控件实现高级动画控制 对于更复杂的动画控制需求,建议创建自定义控件并继承 `Control` 类,然后通过 `Graphics.DrawImage` 方法逐帧绘制 GIF 内容。此方法允许开发者对每一帧进行精细处理,例如添加滤镜、叠加文字等特效: ```csharp protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); // 获取当前帧图像 Image currentFrame = GetCurrentAnimationFrame(); // 绘制当前帧 e.Graphics.DrawImage(currentFrame, ClientRectangle); } ``` 同时,可利用 `ImageAnimator` 类管理 GIF 的帧序列播放逻辑: ```csharp Image gif = Image.FromFile("animation.gif"); ImageAnimator.Animate(gif, new EventHandler(OnFrameChanged)); ``` 此类方案适合构建高度定制化的用户界面组件。
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值