ShockwaveEx.pas
上传用户:raido2005
上传日期:2022-06-22
资源大小:5044k
文件大小:6k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. //*******************************************************//
  2. //                                                       //
  3. //                      DelphiFlash.com                  //
  4. //         Copyright (c) 2004-2007 FeatherySoft, Inc.    //
  5. //                    info@delphiflash.com               //
  6. //                                                       //
  7. //*******************************************************//
  8. //  Description: Extended ShockwaveFlash visual control
  9. //  update: 20 July 2006 by Cga - added ShiftState
  10. //  update: 23 oct 2006
  11. //  Last date update: 2 may 2007 - added LoadMovieFromStream
  12. unit ShockwaveEx;
  13. interface
  14. uses
  15.   Windows, SysUtils, Classes, Controls, OleCtrls, ShockwaveFlashObjects_TLB,
  16.   Messages{$IFNDEF VER130}, Types{$ENDIF}, Forms, ActiveX;
  17. type
  18.   TShockwaveFlashEx = class(TShockwaveFlash)
  19.   private
  20.     FOnMouseDown: TMouseEvent;
  21.     FOnMouseUp: TMouseEvent;
  22.     FOnMouseMove: TMouseMoveEvent;
  23.     FOnClick: TNotifyEvent;
  24.     fLockMouseClick: boolean;
  25.     WasDown: boolean;
  26.     FOleObject: IOleObject;
  27.   protected
  28.     procedure WndProc(var Message:TMessage); override;
  29.     procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  30.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  31.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  32.     procedure Click; override;
  33.     procedure InitControlInterface(const Obj: IUnknown); override;
  34.   public
  35.     Procedure CreateWnd; override;
  36.     procedure LoadMovieFromStream(Src: TStream);
  37.   published
  38.     property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
  39.     property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
  40.     property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
  41.     property OnClick: TNotifyEvent read FOnClick write FOnClick;
  42.     property LockMouseClick: boolean read fLockMouseClick write fLockMouseClick default false;
  43.   end;
  44. procedure Register;
  45. implementation
  46. Uses
  47.   ZLib;
  48. Procedure TShockwaveFlashEx.CreateWnd;
  49. begin
  50.   inherited;
  51. end;
  52. procedure TShockwaveFlashEx.InitControlInterface(const Obj: IUnknown);
  53. begin
  54.   FOleObject := Obj as IOleObject;
  55. end;
  56. procedure TShockwaveFlashEx.LoadMovieFromStream(Src: TStream);
  57.  var
  58.    unCompress: TStream;
  59.    Mem, Mem2: TMemoryStream;
  60.    SRCSize: longint;
  61.    PersistStream: IPersistStreamInit;
  62.    SAdapt: TStreamAdapter;
  63.    ISize: int64;
  64.    B: byte;
  65.    ASign: array [0..2] of char;
  66.    isCompress: boolean;
  67.    ZStream: TDeCompressionStream;
  68. begin
  69.   // prepare src movie
  70.   Src.Read(ASign, 3);
  71.   isCompress := ASign = 'CWS';
  72.   if isCompress then
  73.     begin
  74.       unCompress := TMemoryStream.Create;
  75.       ASign := 'FWS';
  76.       unCompress.Write(ASign, 3);
  77.       unCompress.CopyFrom(Src, 1); // version
  78.       SRC.Read(SRCSize, 4);
  79.       unCompress.Write(SRCSize, 4);
  80.       ZStream := TDeCompressionStream.Create(Src);
  81.       try
  82.         unCompress.CopyFrom(ZStream, SRCSize - 8);
  83.       finally
  84.         ZStream.free;
  85.       end;
  86.       unCompress.Position := 0;
  87.     end else
  88.     begin
  89.       Src.Position := Src.Position - 3;
  90.       SRCSize := Src.Size - Src.Position;
  91.       unCompress := Src;
  92.     end;
  93.   // store "template"
  94.   EmbedMovie := false;
  95.   FOleObject.QueryInterface(IPersistStreamInit, PersistStream);
  96.   PersistStream.GetSizeMax(ISize);
  97.   Mem := TMemoryStream.Create;
  98.   Mem.SetSize(ISize);
  99.   SAdapt := TStreamAdapter.Create(Mem);
  100.   PersistStream.Save(SAdapt, true);
  101.   SAdapt.Free;
  102.   // insetr movie to "template"
  103.   Mem.Position := 1;
  104.   Mem2 := TMemoryStream.Create;
  105.   B := $66; // magic flag: "f" - embed swf; "g" - without swf;
  106.   Mem2.Write(B, 1);
  107.   Mem2.CopyFrom(Mem, 3);
  108.   Mem2.Write(SRCSize, 4);
  109.   Mem2.CopyFrom(unCompress, SRCSize);
  110.   Mem2.CopyFrom(Mem, Mem.Size - Mem.Position);
  111.   // load activeX data
  112.   Mem2.Position := 0;
  113.   SAdapt := TStreamAdapter.Create(Mem2);
  114.   PersistStream.Load(SAdapt);
  115.   SAdapt.Free;
  116.   // free all
  117.   Mem2.Free;
  118.   Mem.Free;
  119.   PersistStream := nil;
  120.   if isCompress then unCompress.Free;
  121. end;
  122. procedure TShockwaveFlashEx.WndProc(var Message: TMessage);
  123. Var x,y: integer;
  124.     xy: TPoint;
  125.     ShiftState: TShiftState;//cga
  126. begin
  127.   if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then//cga
  128.     if not (csDesigning in ComponentState) then begin
  129.       ShiftState:=KeysToShiftState(TWMMouse(Message).Keys);//cga
  130.       x:=TSmallPoint(Message.LParam).x;
  131.       y:=TSmallPoint(Message.LParam).y;
  132.       case Message.Msg of
  133.         CM_MOUSELEAVE: WasDown:=false;
  134.         WM_LBUTTONDOWN:
  135.         begin
  136.           MouseDown(mbLeft,ShiftState,x,y);
  137.           WasDown:=true;
  138.         end;
  139.         WM_RBUTTONDOWN: WasDown:=true;
  140.         WM_RBUTTONUP:
  141.         if (PopupMenu<>nil) and (WasDown) then begin
  142.           WasDown:=false;
  143.           xy.X:=x;
  144.           xy.Y:=y;
  145.           xy:=ClientToScreen(xy);
  146.           PopupMenu.Popup(xy.X,xy.Y);
  147.         end;
  148.         WM_LBUTTONUP:
  149.         begin
  150.           MouseUp(mbLeft,ShiftState,x,y);
  151.           WasDown:=false;
  152.         end;
  153.         WM_MOUSEMOVE: MouseMove(ShiftState,x,y);
  154.       end;
  155.       //
  156.       if (((Message.Msg=WM_RBUTTONDOWN) or (Message.Msg=WM_RBUTTONDOWN)) and (not Menu)) or
  157.          (((Message.Msg=WM_RBUTTONUP) or (Message.Msg=WM_LBUTTONUP) or (Message.Msg=WM_LBUTTONDOWN)
  158.           or (Message.Msg=WM_LBUTTONDBLCLK))
  159.           and fLockMouseClick)
  160.       then
  161.         Message.Result := 0
  162.       else
  163.         inherited WndProc(Message);
  164.       Exit;
  165.     end;
  166.   inherited WndProc(Message);
  167. end;
  168. procedure TShockwaveFlashEx.MouseDown(Button: TMouseButton; Shift:
  169. TShiftState; X, Y: Integer);
  170. begin
  171.   if Assigned(FOnMouseDown) then
  172.     begin
  173.       FOnMouseDown(Self, Button, Shift, X, Y);
  174.     end;
  175. end;
  176. procedure TShockwaveFlashEx.MouseUp(Button: TMouseButton; Shift:
  177. TShiftState; X, Y: Integer);
  178. begin
  179.   if Assigned(FOnMouseUp) then
  180.     begin
  181.       FOnMouseUp(Self, Button, Shift, X, Y);
  182.     end;
  183.   if WasDown Then Click;
  184. end;
  185. procedure TShockwaveFlashEx.MouseMove(Shift: TShiftState; X, Y: Integer);
  186. begin
  187.   if Assigned(FOnMouseMove) then FOnMouseMove(Self, Shift, X, Y);
  188. end;
  189. procedure TShockwaveFlashEx.Click;
  190. begin
  191.   if Assigned(FOnClick) then FOnClick(Self);
  192. end;
  193. procedure Register;
  194. begin
  195.   RegisterComponents('Flash', [TShockwaveFlashEx]);
  196. end;
  197. initialization
  198.   RegisterClass(TShockwaveFlashEx);
  199. finalization
  200.   UnRegisterClass(TShockwaveFlashEx);
  201. end.