MMFill.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:13k
- {========================================================================}
- {= (c) 1995-98 SwiftSoft Ronald Dittrich =}
- {========================================================================}
- {= All Rights Reserved =}
- {========================================================================}
- {= D 01099 Dresden = Tel.: +0351-8012255 =}
- {= Loewenstr.7a = info@swiftsoft.de =}
- {========================================================================}
- {= Actual versions on http://www.swiftsoft.de/mmtools.html =}
- {========================================================================}
- {= This code is for reference purposes only and may not be copied or =}
- {= distributed in any format electronic or otherwise except one copy =}
- {= for backup purposes. =}
- {= =}
- {= No Delphi Component Kit or Component individually or in a collection=}
- {= subclassed or otherwise from the code in this unit, or associated =}
- {= .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed =}
- {= without express permission from SwiftSoft. =}
- {= =}
- {= For more licence informations please refer to the associated =}
- {= HelpFile. =}
- {========================================================================}
- {= $Date: 22.02.98 - 01:26:39 $ =}
- {========================================================================}
- unit MMFill;
- {$I COMPILER.INC}
- interface
- uses
- Windows,
- SysUtils,
- Classes,
- Controls,
- Graphics,
- Messages,
- Forms,
- MMObj,
- MMPanel,
- MMUtils,
- MMBmpLst,
- MMHook,
- MMObsrv;
- type
- {-- TMMFormFill -----------------------------------------------------------}
- TMMFormFill = class(TMMWndProcComponent)
- private
- FOldOnPaint : TNotifyEvent;
- FBitmapIndex : integer;
- FBitmaps : TMMBitmapList;
- FObserver : TMMObserver;
- procedure UpdateForm;
- {$IFNDEF BUILD_ACTIVEX}
- procedure PaintForm(Sender: TOBject);
- {$ENDIF}
- procedure SetBitmaps(aValue: TMMBitmapList);
- procedure BitmapsNotify(Sender, Data: TObject);
- procedure SetBitmapIndex(aValue: integer);
- protected
- procedure Notification(AComponent: TComponent; Operation: TOperation); override;
- procedure HookWndProc(var Message: TMessage); override;
- {$IFDEF BUILD_ACTIVEX}
- procedure HookOwner; override;
- {$ENDIF}
- public
- constructor Create(aOwner: TComponent); override;
- destructor Destroy; override;
- published
- property BitmapList: TMMBitmapList read FBitmaps write SetBitmaps;
- property BitmapIndex: Integer read FBitmapIndex write SetBitmapIndex default -1;
- end;
- TMMFillPanel = procedure(Sender: TObject; Canvas: TCanvas; R: TRect) of object;
- {-- TMMPanelFill ----------------------------------------------------------}
- TMMPanelFill = class(TMMPanel)
- private
- FBitmapIndex : integer;
- FBitmapBackIndex: integer;
- FBitmaps : TMMBitmapList;
- FObserver : TMMObserver;
- FOnFillPanel : TMMFillPanel;
- procedure SetBitmaps(aValue: TMMBitmapList);
- procedure BitmapsNotify(Sender, Data: TObject);
- procedure SetBitmapIndex(aValue: integer);
- procedure SetBitmapBackIndex(aValue: integer);
- procedure FillPanel(Sender: TObject; Canvas: TCanvas; aRect: TRect);
- procedure SetFillBevel(aValue: Boolean);
- function GetFillBevel: Boolean;
- function GetBitmap: TBitmap;
- protected
- procedure Notification(AComponent: TComponent; Operation: TOperation); override;
- procedure Paint; override;
- public
- constructor Create(aOwner: TComponent); override;
- destructor Destroy; override;
- function BitmapValid: Boolean;
- property Bitmap: TBitmap read GetBitmap;
- published
- property OnFillPanel: TMMFillPanel read FOnFillPanel write FOnFillPanel;
- property BitmapList: TMMBitmapList read FBitmaps write SetBitmaps;
- property BitmapIndex: Integer read FBitmapIndex write SetBitmapIndex default -1;
- property BitmapBackIndex: Integer read FBitmapBackIndex write SetBitmapBackIndex default -1;
- property FillBevel: Boolean read GetFillBevel write SetFillBevel default True;
- end;
- implementation
- {== TMMFormFill ===============================================================}
- constructor TMMFormFill.Create(aOwner: TComponent);
- begin
- inherited Create(aOwner);
- FBitmapIndex := -1;
- FBitmaps := nil;
- FObserver := TMMObserver.Create;
- FObserver.OnNotify := BitmapsNotify;
- HookOwner;
- {$IFNDEF BUILD_ACTIVEX}
- if (OwnerForm <> nil) and not (csDesigning in ComponentState) then
- begin
- FOldOnPaint := OwnerForm.OnPaint;
- OwnerForm.OnPaint := PaintForm;
- end;
- {$ENDIF}
- end;
- {-- TMMFormFill ---------------------------------------------------------------}
- destructor TMMFormFill.Destroy;
- begin
- UnHookOwner;
- BitmapList := nil;
- {$IFNDEF BUILD_ACTIVEX}
- if (OwnerForm <> nil) and not (csDesigning in ComponentState) then
- begin
- OwnerForm.OnPaint := FOldOnPaint;
- end;
- {$ENDIF}
- FObserver.Free;
- inherited Destroy;
- end;
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.BitmapsNotify(Sender, Data: TObject);
- begin
- if (Data = FBitmaps) then UpdateForm;
- end;
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.SetBitmaps(aValue: TMMBitmapList);
- begin
- { bug fix for AX Controls }
- if integer(aValue) = integer(Self) then exit;
- if (FBitmaps <> nil) then FBitmaps.RemoveObserver(FObserver);
- FBitmaps := aValue;
- if (FBitmaps <> nil) then FBitmaps.AddObserver(FObserver);
- UpdateForm;
- end;
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.SetBitmapIndex(aValue: integer);
- begin
- if (FBitmapIndex <> aValue) then
- begin
- FBitmapIndex := Max(aValue, -1);
- UpdateForm;
- end;
- end;
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.Notification(AComponent: TComponent; Operation: TOperation);
- begin
- inherited Notification(AComponent, Operation);
- if (Operation = opRemove) and (aComponent = BitmapList) then BitmapList := nil;
- end;
- {-- TMMFormStyler -------------------------------------------------------------}
- procedure TMMFormFill.HookWndProc(var Message: TMessage);
- {$IFDEF BUILD_ACTIVEX}
- var
- PS: TPaintStruct;
- B: TBitmap;
- R: TRect;
- begin
- if not (csDesigning in ComponentState) then
- if Assigned(FBitmaps) and (FBitmapIndex >= 0) and (FBitmaps.Count > FBitmapIndex) then
- begin
- B :=FBitmaps[FBitmapIndex];
- case Message.Msg of
- WM_ERASEBKGND:
- begin
- Message.Result := 1;
- exit;
- end;
- WM_PAINT:
- begin
- BeginPaint(HookWnd, PS);
- R := PS.rcPaint;
- if R.Left <> 0 then Dec(R.Left, R.Left mod B.Width);
- if R.Top <> 0 then Dec(R.Top, R.Top mod B.Height);
- TileBlt(PS.hdc, B.Handle, R, SRCCOPY);
- EndPaint(HookWnd, PS);
- Message.Result := 0;
- exit;
- end;
- end
- end;
- inherited;
- {$ELSE}
- begin
- if Message.Msg = WM_ERASEBKGND then
- Message.Result := 1 else inherited;
- {$ENDIF}
- end;
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.UpdateForm;
- begin
- {$IFNDEF BUILD_ACTIVEX}
- if (OwnerForm <> nil) then OwnerForm.Invalidate;
- {$ELSE}
- InvalidateRect(HookWnd, nil, False);
- {$ENDIF}
- end;
- {$IFDEF BUILD_ACTIVEX}
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.HookOwner;
- var
- WasHooked: Boolean;
- begin
- WasHooked := FormOK;
- inherited;
- if not WasHooked and FormOK then
- UpdateForm;
- end;
- {$ENDIF}
- {$IFNDEF BUILD_ACTIVEX}
- {-- TMMFormFill ---------------------------------------------------------------}
- procedure TMMFormFill.PaintForm(Sender: TObject);
- begin
- with TForm(Sender) do
- if assigned(FBitmaps) and (FBitmapIndex >= 0) and (FBitmaps.Count > FBitmapIndex) then
- begin
- TileBlt(Canvas.Handle, FBitmaps[FBitmapIndex].Handle, ClientRect,SRCCOPY);
- end
- else
- begin
- Canvas.Brush.Color := Color;
- Canvas.FillRect(ClientRect);
- end;
- end;
- {$ENDIF}
- {== TMMPanelFill ==============================================================}
- constructor TMMPanelFill.Create(aOwner: TComponent);
- begin
- inherited Create(aOwner);
- FillBevel := True;
- FBitmapIndex := -1;
- FBitmapBackIndex := -1;
- FBitmaps := nil;
- FObserver := TMMObserver.Create;
- FObserver.OnNotify := BitmapsNotify;
- OnFill := FillPanel;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- destructor TMMPanelFill.Destroy;
- begin
- OnFill := nil;
- BitmapList := nil;
- FObserver.Free;
- inherited Destroy;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.Notification(AComponent: TComponent; Operation: TOperation);
- begin
- inherited Notification(AComponent, Operation);
- if (Operation = opRemove) and (aComponent = BitmapList) then BitmapList := nil;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.SetFillBevel(aValue: Boolean);
- begin
- inherited FillBevel := not aValue;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- function TMMPanelFill.GetFillBevel: Boolean;
- begin
- Result := not inherited FillBevel;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.SetBitmaps(aValue: TMMBitmapList);
- begin
- { bug fix for AX Controls }
- if integer(aValue) = integer(Self) then exit;
- if (FBitmaps <> nil) then FBitmaps.RemoveObserver(FObserver);
- FBitmaps := aValue;
- if (FBitmaps <> nil) then FBitmaps.AddObserver(FObserver);
- Refresh;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.SetBitmapIndex(aValue: integer);
- begin
- if (FBitmapIndex <> aValue) then
- begin
- FBitmapIndex := Max(aValue,-1);
- Refresh;
- end;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.SetBitmapBackIndex(aValue: integer);
- begin
- if (FBitmapBackIndex <> aValue) then
- begin
- FBitmapBackIndex := Max(aValue,-1);
- Invalidate;
- end;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.BitmapsNotify(Sender: TObject; Data: TObject);
- begin
- Refresh;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- function TMMPanelFill.BitmapValid: Boolean;
- begin
- Result := (FBitmaps <> nil) and (FBitmapIndex >= 0) and (FBitmapIndex < FBitmaps.Count);
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- function TMMPanelFill.GetBitmap: TBitmap;
- begin
- if BitmapValid then
- Result := FBitmaps[BitmapIndex]
- else
- Result := nil;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.Paint;
- begin
- if assigned(FOnFillPanel) then
- begin
- FOnFillPanel(Self,Canvas,ClientRect);
- end
- else
- begin
- with Canvas do
- begin
- if BitmapValid then
- begin
- {$IFDEF DELPHI3}
- Bitmap.Canvas.Lock;
- {$ENDIF}
- try
- TileBlt(Handle, Bitmap.Handle, ClientRect, SRCCOPY);
- finally
- {$IFDEF DELPHI3}
- Bitmap.Canvas.UnLock;
- {$ENDIF}
- end;
- end
- else
- begin
- Brush.Color := Color;
- Brush.Style := bsSolid;
- FillRect(ClientRect);
- end;
- end;
- end;
- inherited;
- end;
- {-- TMMPanelFill --------------------------------------------------------------}
- procedure TMMPanelFill.FillPanel(Sender: TObject; Canvas: TCanvas; aRect: TRect);
- begin
- { only a dummy so the panel doesn't paint the client area }
- end;
- end.