gif 文件在DLL中的窗体的显示问题 ,已经解决,有新的情况,不知哪位老大能帮忙解决下?(100)

  • 主题发起人 主题发起人 hying95
  • 开始时间 开始时间
H

hying95

Unregistered / Unconfirmed
GUEST, unregistred user!
现在DLL中的窗体能够正常显示GIF动画了,代码如下:unit UChildForm;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls,GIFImage, StdCtrls;type TDLLChildForm = class(TForm) img1: TImage; btn1: TSpeedButton; pnl4: TPanel; btn2: TSpeedButton; Edit1: TEdit; btn3: TSpeedButton; procedure btn1Click(Sender: TObject); procedure btn2Click(Sender: TObject); procedure btn3Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var DLLChildForm: TDLLChildForm; TmpGif: TGIFImage; img: TImage; stop: Boolean=false; N: Integer=0;procedure InitDLL(AHandle: Thandle); stdcall;procedure FreeDLL; stdcall;function ShowFrmMN(AHandle:THandle):BOOL;stdcall;implementation{$R *.dfm}{$R GifRc.RES}procedure FreeDLL; stdcall;begin if DLLChildForm= nil then begin Exit; end; DLLChildForm.Release; PostMessage(Application.Handle, WM_QUIT, 0, 0); DLLChildForm := nil;end;function ShowFrmMN(AHandle:THandle):BOOL;stdcall;begin Application.Initialize; Application.Handle:=AHandle; DLLChildForm:=TDLLChildForm.Create(Application); try DLLChildForm.ShowModal; Application.Run; Result:=False; Finally DLLChildForm.Free; end;end;procedure InitDLL(AHandle: Thandle); stdcall;begin Application.Initialize; Application.ShowMainForm := False; Application.CreateForm(TDLLChildForm, DLLChildForm); DLLChildForm.Tag := Application.Handle; Application.Handle := AHandle; Application.Run; Application.Handle := DLLChildForm.Tag;end;procedure TDLLChildForm.btn1Click(Sender: TObject);var TMPGif: TGIFImage; I: Integer;begin TMPGif:=TGIFImage.Create; TmpGif.LoadFromFile('d:/head3.gif'); img1.Height:=TMPGif.Height; img1.Width:=TMPGif.Width; img1.Picture.Assign(TMPGif); stop:=False;//**********************************{注释*号间这段循环动画会动,加了后就不动,但如果不在DLL中加了循环动画也会动不知道为什么?有没有哪位富翁能搞定这个} for i:=0 to 20000000 do begin Application.ProcessMessages; if stop then begin Break; end; n:=i+n; Edit1.Text :=IntToStr(n); end;//********************************************** TMPGif.Free;end;DLL工程:library ppp;uses SysUtils, Classes, UChildForm in 'UChildForm.pas' {DLLChildForm}, GIFImage in '../GifImage.pas';{$R *.res}exports ShowFrmMN, InitDLL, FreeDLL;beginend.调用var Form1: TForm1; procedure InitDLL(AHandle: Thandle); stdcall; external 'ppp.dll'; procedure DestoryDLL; stdcall; external 'ppp.dll'; function ShowFrmMN(AHandle:THandle):BOOL;stdcall; external 'ppp.dll';implementation{$R *.dfm}procedure TForm1.btn1Click(Sender: TObject);begin ShowFrmMN(Application.Handle); InitDLL(0);end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);begin DestoryDLLend;
 
奇怪的方法。。。如果你只是单纯的要把文件放在动态库里的话,做成资源啊。。何必搞这么麻烦呢?
 
是在资源文件中,为了好问,才改了一下
 
这个是 在dll中的窗体没有消息循环 ,是比较麻烦的 要看 GifImage 比较麻烦的
 
还有一点问题,
 
你到底是是想调用 Dll中的 Gif 资源 还是想调用Dll中带显示Gif窗体?如果想调用Dll中的gif资源,可以先将Gif资源转为流。然后再从流中装载即可!
 
procedure TDLLChildForm.btn1Click(Sender: TObject);var TMPGif: TGIFImage; RC: TResourceStream;begin TMPGif:=TGIFImage.Create; rc:=TResourceStream.Create(Hinstance,'BGT','GIF'); TMPGif.LoadFromStream(RC); img1.Height:=TMPGif.Height; img1.Width:=TMPGif.Width; img1.Picture.Assign(TMPGif);//*************************//*************************** RC.Free; TMPGif.Free; end;我有一个小程序,在执行一项计算时要等待5分钟左右,在这段时间显示一个GIF动画,这段程序在窗体没有问题,但是如果把这个窗体放到DLL中时,动画不动,搞了好久,现在不进行任何操作DLL中的窗体上动画会动了.上面是用资源中的GIF文件也把它放在DLL中的窗体上也可以可以显示,但是在*号之间加上一个循环它就不动了(注:这等于是在程序执行某项任务)我想要的是,在执行一项需要等待的任务时GIF动画也动.
 
把循环放到线程中就可以了
 
接受答案了.
 
后退
顶部