MMFill.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:13k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 22.02.98 - 01:26:39 $                                        =}
  24. {========================================================================}
  25. unit MMFill;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     Windows,
  30.     SysUtils,
  31.     Classes,
  32.     Controls,
  33.     Graphics,
  34.     Messages,
  35.     Forms,
  36.     MMObj,
  37.     MMPanel,
  38.     MMUtils,
  39.     MMBmpLst,
  40.     MMHook,
  41.     MMObsrv;
  42. type
  43.     {-- TMMFormFill -----------------------------------------------------------}
  44.     TMMFormFill = class(TMMWndProcComponent)
  45.     private
  46.        FOldOnPaint     : TNotifyEvent;
  47.        FBitmapIndex    : integer;
  48.        FBitmaps        : TMMBitmapList;
  49.        FObserver       : TMMObserver;
  50.        procedure UpdateForm;
  51. {$IFNDEF BUILD_ACTIVEX}
  52.        procedure PaintForm(Sender: TOBject);
  53. {$ENDIF}
  54.        procedure SetBitmaps(aValue: TMMBitmapList);
  55.        procedure BitmapsNotify(Sender, Data: TObject);
  56.        procedure SetBitmapIndex(aValue: integer);
  57.     protected
  58.        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  59.        procedure HookWndProc(var Message: TMessage); override;
  60. {$IFDEF BUILD_ACTIVEX}
  61.        procedure HookOwner; override;
  62. {$ENDIF}
  63.     public
  64.        constructor Create(aOwner: TComponent); override;
  65.        destructor Destroy; override;
  66.     published
  67.        property BitmapList: TMMBitmapList read FBitmaps write SetBitmaps;
  68.        property BitmapIndex: Integer read FBitmapIndex write SetBitmapIndex default -1;
  69.     end;
  70.     TMMFillPanel = procedure(Sender: TObject; Canvas: TCanvas; R: TRect) of object;
  71.     {-- TMMPanelFill ----------------------------------------------------------}
  72.     TMMPanelFill = class(TMMPanel)
  73.     private
  74.        FBitmapIndex    : integer;
  75.        FBitmapBackIndex: integer;
  76.        FBitmaps        : TMMBitmapList;
  77.        FObserver       : TMMObserver;
  78.        FOnFillPanel    : TMMFillPanel;
  79.        procedure SetBitmaps(aValue: TMMBitmapList);
  80.        procedure BitmapsNotify(Sender, Data: TObject);
  81.        procedure SetBitmapIndex(aValue: integer);
  82.        procedure SetBitmapBackIndex(aValue: integer);
  83.        procedure FillPanel(Sender: TObject; Canvas: TCanvas; aRect: TRect);
  84.        procedure SetFillBevel(aValue: Boolean);
  85.        function  GetFillBevel: Boolean;
  86.        function  GetBitmap: TBitmap;
  87.     protected
  88.        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  89.        procedure Paint; override;
  90.    public
  91.        constructor Create(aOwner: TComponent); override;
  92.        destructor Destroy; override;
  93.        function BitmapValid: Boolean;
  94.        property Bitmap: TBitmap read GetBitmap;
  95.     published
  96.        property OnFillPanel: TMMFillPanel read FOnFillPanel write FOnFillPanel;
  97.        property BitmapList: TMMBitmapList read FBitmaps write SetBitmaps;
  98.        property BitmapIndex: Integer read FBitmapIndex write SetBitmapIndex default -1;
  99.        property BitmapBackIndex: Integer read FBitmapBackIndex write SetBitmapBackIndex default -1;
  100.        property FillBevel: Boolean read GetFillBevel write SetFillBevel default True;
  101.     end;
  102. implementation
  103. {== TMMFormFill ===============================================================}
  104. constructor TMMFormFill.Create(aOwner: TComponent);
  105. begin
  106.    inherited Create(aOwner);
  107.    FBitmapIndex := -1;
  108.    FBitmaps     := nil;
  109.    FObserver    := TMMObserver.Create;
  110.    FObserver.OnNotify := BitmapsNotify;
  111.    HookOwner;
  112. {$IFNDEF BUILD_ACTIVEX}
  113.    if (OwnerForm <> nil) and not (csDesigning in ComponentState) then
  114.    begin
  115.       FOldOnPaint := OwnerForm.OnPaint;
  116.       OwnerForm.OnPaint := PaintForm;
  117.    end;
  118. {$ENDIF}
  119. end;
  120. {-- TMMFormFill ---------------------------------------------------------------}
  121. destructor TMMFormFill.Destroy;
  122. begin
  123.    UnHookOwner;
  124.    BitmapList := nil;
  125. {$IFNDEF BUILD_ACTIVEX}
  126.    if (OwnerForm <> nil) and not (csDesigning in ComponentState) then
  127.    begin
  128.       OwnerForm.OnPaint := FOldOnPaint;
  129.    end;
  130. {$ENDIF}
  131.    FObserver.Free;
  132.    inherited Destroy;
  133. end;
  134. {-- TMMFormFill ---------------------------------------------------------------}
  135. procedure TMMFormFill.BitmapsNotify(Sender, Data: TObject);
  136. begin
  137.    if (Data = FBitmaps) then UpdateForm;
  138. end;
  139. {-- TMMFormFill ---------------------------------------------------------------}
  140. procedure TMMFormFill.SetBitmaps(aValue: TMMBitmapList);
  141. begin
  142.   { bug fix for AX Controls }
  143.   if integer(aValue) = integer(Self) then exit;
  144.   if (FBitmaps <> nil) then FBitmaps.RemoveObserver(FObserver);
  145.   FBitmaps := aValue;
  146.   if (FBitmaps <> nil) then FBitmaps.AddObserver(FObserver);
  147.   UpdateForm;
  148. end;
  149. {-- TMMFormFill ---------------------------------------------------------------}
  150. procedure TMMFormFill.SetBitmapIndex(aValue: integer);
  151. begin
  152.    if (FBitmapIndex <> aValue) then
  153.    begin
  154.       FBitmapIndex := Max(aValue, -1);
  155.       UpdateForm;
  156.    end;
  157. end;
  158. {-- TMMFormFill ---------------------------------------------------------------}
  159. procedure TMMFormFill.Notification(AComponent: TComponent; Operation: TOperation);
  160. begin
  161.    inherited Notification(AComponent, Operation);
  162.    if (Operation = opRemove) and (aComponent = BitmapList) then BitmapList := nil;
  163. end;
  164. {-- TMMFormStyler -------------------------------------------------------------}
  165. procedure TMMFormFill.HookWndProc(var Message: TMessage);
  166. {$IFDEF BUILD_ACTIVEX}
  167. var
  168.   PS: TPaintStruct;
  169.   B: TBitmap;
  170.   R: TRect;
  171. begin
  172.   if not (csDesigning in ComponentState) then
  173.     if Assigned(FBitmaps) and (FBitmapIndex >= 0) and (FBitmaps.Count > FBitmapIndex) then
  174.     begin
  175.       B :=FBitmaps[FBitmapIndex];
  176.       case Message.Msg of
  177.         WM_ERASEBKGND:
  178.           begin
  179.             Message.Result := 1;
  180.             exit;
  181.           end;
  182.         WM_PAINT:
  183.           begin
  184.             BeginPaint(HookWnd, PS);
  185.             R := PS.rcPaint;
  186.             if R.Left <> 0 then Dec(R.Left, R.Left mod B.Width);
  187.             if R.Top <> 0 then Dec(R.Top, R.Top mod B.Height);
  188.             TileBlt(PS.hdc, B.Handle, R, SRCCOPY);
  189.             EndPaint(HookWnd, PS);
  190.             Message.Result := 0;
  191.             exit;
  192.           end;
  193.       end
  194.     end;
  195.   inherited;
  196. {$ELSE}
  197. begin
  198.   if Message.Msg = WM_ERASEBKGND then
  199.      Message.Result := 1 else inherited;
  200. {$ENDIF}
  201. end;
  202. {-- TMMFormFill ---------------------------------------------------------------}
  203. procedure TMMFormFill.UpdateForm;
  204. begin
  205. {$IFNDEF BUILD_ACTIVEX}
  206.    if (OwnerForm <> nil) then OwnerForm.Invalidate;
  207. {$ELSE}
  208.    InvalidateRect(HookWnd, nil, False);
  209. {$ENDIF}
  210. end;
  211. {$IFDEF BUILD_ACTIVEX}
  212. {-- TMMFormFill ---------------------------------------------------------------}
  213. procedure TMMFormFill.HookOwner;
  214. var
  215.   WasHooked: Boolean;
  216. begin
  217.   WasHooked := FormOK;
  218.   inherited;
  219.   if not WasHooked and FormOK then
  220.     UpdateForm;
  221. end;
  222. {$ENDIF}
  223. {$IFNDEF BUILD_ACTIVEX}
  224. {-- TMMFormFill ---------------------------------------------------------------}
  225. procedure TMMFormFill.PaintForm(Sender: TObject);
  226. begin
  227.    with TForm(Sender) do
  228.    if assigned(FBitmaps) and (FBitmapIndex >= 0) and (FBitmaps.Count > FBitmapIndex) then
  229.    begin
  230.       TileBlt(Canvas.Handle, FBitmaps[FBitmapIndex].Handle, ClientRect,SRCCOPY);
  231.    end
  232.    else
  233.    begin
  234.       Canvas.Brush.Color := Color;
  235.       Canvas.FillRect(ClientRect);
  236.    end;
  237. end;
  238. {$ENDIF}
  239. {== TMMPanelFill ==============================================================}
  240. constructor TMMPanelFill.Create(aOwner: TComponent);
  241. begin
  242.    inherited Create(aOwner);
  243.    FillBevel          := True;
  244.    FBitmapIndex       := -1;
  245.    FBitmapBackIndex   := -1;
  246.    FBitmaps           := nil;
  247.    FObserver          := TMMObserver.Create;
  248.    FObserver.OnNotify := BitmapsNotify;
  249.    OnFill             := FillPanel;
  250. end;
  251. {-- TMMPanelFill --------------------------------------------------------------}
  252. destructor TMMPanelFill.Destroy;
  253. begin
  254.    OnFill := nil;
  255.    BitmapList := nil;
  256.    FObserver.Free;
  257.    inherited Destroy;
  258. end;
  259. {-- TMMPanelFill --------------------------------------------------------------}
  260. procedure TMMPanelFill.Notification(AComponent: TComponent; Operation: TOperation);
  261. begin
  262.    inherited Notification(AComponent, Operation);
  263.    if (Operation = opRemove) and (aComponent = BitmapList) then BitmapList := nil;
  264. end;
  265. {-- TMMPanelFill --------------------------------------------------------------}
  266. procedure TMMPanelFill.SetFillBevel(aValue: Boolean);
  267. begin
  268.    inherited FillBevel := not aValue;
  269. end;
  270. {-- TMMPanelFill --------------------------------------------------------------}
  271. function TMMPanelFill.GetFillBevel: Boolean;
  272. begin
  273.    Result := not inherited FillBevel;
  274. end;
  275. {-- TMMPanelFill --------------------------------------------------------------}
  276. procedure TMMPanelFill.SetBitmaps(aValue: TMMBitmapList);
  277. begin
  278.    { bug fix for AX Controls }
  279.    if integer(aValue) = integer(Self) then exit;
  280.    if (FBitmaps <> nil) then FBitmaps.RemoveObserver(FObserver);
  281.    FBitmaps := aValue;
  282.    if (FBitmaps <> nil) then FBitmaps.AddObserver(FObserver);
  283.    Refresh;
  284. end;
  285. {-- TMMPanelFill --------------------------------------------------------------}
  286. procedure TMMPanelFill.SetBitmapIndex(aValue: integer);
  287. begin
  288.    if (FBitmapIndex <> aValue) then
  289.    begin
  290.       FBitmapIndex := Max(aValue,-1);
  291.       Refresh;
  292.    end;
  293. end;
  294. {-- TMMPanelFill --------------------------------------------------------------}
  295. procedure TMMPanelFill.SetBitmapBackIndex(aValue: integer);
  296. begin
  297.    if (FBitmapBackIndex <> aValue) then
  298.    begin
  299.       FBitmapBackIndex := Max(aValue,-1);
  300.       Invalidate;
  301.    end;
  302. end;
  303. {-- TMMPanelFill --------------------------------------------------------------}
  304. procedure TMMPanelFill.BitmapsNotify(Sender: TObject; Data: TObject);
  305. begin
  306.    Refresh;
  307. end;
  308. {-- TMMPanelFill --------------------------------------------------------------}
  309. function TMMPanelFill.BitmapValid: Boolean;
  310. begin
  311.    Result := (FBitmaps <> nil) and (FBitmapIndex >= 0) and (FBitmapIndex <  FBitmaps.Count);
  312. end;
  313. {-- TMMPanelFill --------------------------------------------------------------}
  314. function TMMPanelFill.GetBitmap: TBitmap;
  315. begin
  316.    if BitmapValid then
  317.       Result := FBitmaps[BitmapIndex]
  318.    else
  319.       Result := nil;
  320. end;
  321. {-- TMMPanelFill --------------------------------------------------------------}
  322. procedure TMMPanelFill.Paint;
  323. begin
  324.    if assigned(FOnFillPanel) then
  325.    begin
  326.       FOnFillPanel(Self,Canvas,ClientRect);
  327.    end
  328.    else
  329.    begin
  330.       with Canvas do
  331.       begin
  332.          if BitmapValid then
  333.          begin
  334.             {$IFDEF DELPHI3}
  335.             Bitmap.Canvas.Lock;
  336.             {$ENDIF}
  337.             try
  338.                TileBlt(Handle, Bitmap.Handle, ClientRect, SRCCOPY);
  339.             finally
  340.                {$IFDEF DELPHI3}
  341.                Bitmap.Canvas.UnLock;
  342.                {$ENDIF}
  343.             end;
  344.          end
  345.          else
  346.          begin
  347.             Brush.Color := Color;
  348.             Brush.Style := bsSolid;
  349.             FillRect(ClientRect);
  350.          end;
  351.       end;
  352.    end;
  353.    inherited;
  354. end;
  355. {-- TMMPanelFill --------------------------------------------------------------}
  356. procedure TMMPanelFill.FillPanel(Sender: TObject; Canvas: TCanvas; aRect: TRect);
  357. begin
  358.    { only a dummy so the panel doesn't paint the client area }
  359. end;
  360. end.