网上有个很流行的Flash Save源码,相信很多人见过,可能因为代码很早就发布了,的确很简陋,有些情况下不能正常工作,事件的关联,在DocumnetComplete,或者在NavigateComplete2中实例化并与事件关联。
delphi代码
- TObjectProcedure = procedure(var oDoc: IHTMLDocument2) of object;
- TEventObject = class(TInterfacedObject, IDispatch)
- private
- FOnEvent: TObjectProcedure;
- FoDoc: IHTMLDocument2;
- protected
- function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
- function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
- function GetIDsOfNames(const IID: TGUID; Names: Pointer; NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
- function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
- public
- constructor Create(const OnEvent: TObjectProcedure; var oDoc: IHTMLDocument2);
- property OnEvent: TObjectProcedure read FOnEvent write FOnEvent;
- end;
- htmlDoc.onmouseover := (TEventObject.Create(Document_OnMouseOver, htmlDoc) as IDispatch);
- htmlDoc.onmouseout := (TEventObject.Create(Document_OnMouseOut, htmlDoc) as IDispatch);
- 2、事件发生后,取得坐标上,可以使用srcelement的属性,但对于iframe中的事件无效。为此,改用事件eventobject来取得坐标位置。取得为屏幕坐标,再转换为工作区坐标。ScreenToClient需要一个HWND,我们采用最上层IE为容器,在setsite时,将IE 的HWND记录下来。
- 事件发生的每次坐标都不一样,但是事件上IHTMLEventObj.offsetY属性,表示偏移量,与事件的screenX相减后,即可得到控件的左上角坐标。
- pt.X:=vEvt.screenX-vEvt.offsetX; //offsetX是相对于事件下面那个空间左上角的偏移量,所以减去他可以得到控件的原点(左上角)
- pt.Y:=vEvt.screenY-vEvt.offsetY;
- 3、解决flash影片的相对路径问题
- src:= (vEle as IHTMLElement).getAttribute('movie',0);
- src:='<A HREF='''+ src + '''></A>';通过建立超级连接,让系统自动为我们解决相对路么的问题。
- obj:=vdoc.createElement(src);
- src:= obj.getAttribute('href',0);
- 4.Flash有两个可能的tagName,object和embed
- 5.新建form后在启用alexa工具条的浏览器上使用有严重问题,关闭浏览器会弹出红色的错误提示,表明严重错误,解决方法是在隐藏窗口时重新设置SetParent(hwmd,0);
1 条评论
刷新网页后,onmouseover onmouseout 事件就失效了。