vrhotimage.pas

来自「作工控的好控件」· PAS 代码 · 共 367 行

PAS
367
字号
{*****************************************************}
{                                                     }
{     Varian Component Workshop                       }
{                                                     }
{     Varian Software NL (c) 1996-2000                }
{     All Rights Reserved                             }
{                                                     }
{*****************************************************}

unit VrHotImage;

{$I VRLIB.INC}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  VrTypes, VrConst, VrClasses, VrControls, VrSysUtils;

type
  TVrHotRect = class(TVrPersistent)
  private
    FColor: TColor;
    FWidth: Integer;
    FVisible: Boolean;
    procedure SetColor(Value: TColor);
    procedure SetWidth(Value: Integer);
    procedure SetVisible(Value: Boolean);
  public
    constructor Create;
    procedure Assign(Source: TPersistent); override;
  published
    property Color: TColor read FColor write SetColor default clYellow;
    property Width: Integer read FWidth write SetWidth default 1;
    property Visible: Boolean read FVisible write SetVisible default True;
  end;

  TVrHotImageDrawStyle = (dsCenter, dsStretch);
  TVrHotImage = class(TVrHyperLinkControl)
  private
    FImageLeave: TBitmap;
    FImageEnter: TBitmap;
    FColorEnter: TColor;
    FColorLeave: TColor;
    FDrawStyle: TVrHotImageDrawStyle;
    FTextAlignment: TVrTextAlignment;
    FHotRect: TVrHotRect;
    FHasMouse: Boolean;
    procedure SetImageLeave(Value: TBitmap);
    procedure SetImageEnter(Value: TBitmap);
    procedure SetColorEnter(Value: TColor);
    procedure SetColorLeave(Value: TColor);
    procedure SetDrawStyle(Value: TVrHotImageDrawStyle);
    procedure SetTextAlignment(Value: TVrTextAlignment);
    procedure SetHotRect(Value: TVrHotRect);
    procedure BitmapChanged(Sender: TObject);
    procedure HotRectChanged(Sender: TObject);
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
    procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
  protected
    procedure MouseEnter; override;
    procedure MouseLeave; override;
    procedure Paint; override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property ImageLeave: TBitmap read FImageLeave write SetImageLeave;
    property ImageEnter: TBitmap read FImageEnter write SetImageEnter;
    property ColorEnter: TColor read FColorEnter write SetColorEnter default clBlue;
    property ColorLeave: TColor read FColorLeave write SetColorLeave default clBlack;
    property DrawStyle: TVrHotImageDrawStyle read FDrawStyle write SetDrawStyle default dsCenter;
    property TextAlignment: TVrTextAlignment read FTextAlignment write SetTextAlignment default vtaBottom;
    property HotRect: TVrHotRect read FHotRect write SetHotRect;
    property Transparent default false;
    property OnMouseEnter;
    property OnMouseLeave;
    property Align;
{$IFDEF VER110}
    property Anchors;
    property BiDiMode;
    property Constraints;
{$ENDIF}
    property Caption;
    property DragCursor;
    property DragMode;
{$IFDEF VER110}
    property DragKind;
{$ENDIF}
    property Enabled;
    property Font;
    property ParentShowHint;
{$IFDEF VER110}
    property ParentBiDiMode;
{$ENDIF}
    property PopupMenu;
    property ShowHint;
    property Visible;
    property OnClick;
{$IFDEF VER130}
    property OnContextPopup;
{$ENDIF}    
    property OnDragDrop;
    property OnDragOver;
{$IFDEF VER110}
    property OnEndDock;
{$ENDIF}
    property OnEndDrag;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
{$IFDEF VER110}
    property OnStartDock;
{$ENDIF}
    property OnStartDrag;
  end;



implementation


{ TVrHotRect }

constructor TVrHotRect.Create;
begin
  inherited Create;
  FColor := clYellow;
  FWidth := 1;
  FVisible := True;
end;

procedure TVrHotRect.SetColor(Value: TColor);
begin
  if FColor <> Value then
  begin
    FColor :=  Value;
    Changed;
  end;
end;

procedure TVrHotRect.SetWidth(Value: Integer);
begin
  if FWidth <> Value then
  begin
    FWidth :=  Value;
    Changed;
  end;
end;

procedure TVrHotRect.SetVisible(Value: Boolean);
begin
  if FVisible <> Value then
  begin
    FVisible := Value;
    Changed;
  end;
end;

procedure TVrHotRect.Assign(Source: TPersistent);
begin
  if Source is TVrHotRect then
  begin
    BeginUpdate;
    try
      Color := TVrHotRect(Source).Color;
      Width := TVrHotRect(Source).Width;
      Visible := TVrHotRect(Source).Visible;
    finally
      EndUpdate;
    end;
    Exit;
  end;
  inherited Assign(Source);
end;

{ TVrHotImage }

constructor TVrHotImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csOpaque] - [csDoubleClicks];
  Width := 85;
  Height := 85;
  Color := clBlack;
  Font.Name := 'Arial';
  Font.Style := Font.Style + [fsBold];
  Font.Color := clWhite;
  Transparent := false;
  FColorEnter := clBlue;
  FColorLeave := clBlack;
  FDrawStyle := dsCenter;
  FTextAlignment := vtaBottom;
  FImageLeave := TBitmap.Create;
  FImageLeave.OnChange := BitmapChanged;
  FImageEnter := TBitmap.Create;
  FImageEnter.OnChange := BitmapChanged;
  FHotRect := TVrHotRect.Create;
  FHotRect.OnChange := HotRectChanged;
end;

destructor TVrHotImage.Destroy;
begin
  FHotRect.Free;
  FImageLeave.Free;
  FImageEnter.Free;
  inherited Destroy;
end;

procedure TVrHotImage.BitmapChanged(Sender: TObject);
begin
  UpdateControlCanvas;
end;

procedure TVrHotImage.HotRectChanged(Sender: TObject);
begin
  UpdateControlCanvas;
end;

procedure TVrHotImage.SetImageLeave(Value: TBitmap);
begin
  FImageLeave.Assign(Value);
end;

procedure TVrHotImage.SetImageEnter(Value: TBitmap);
begin
  FImageEnter.Assign(Value);
end;

procedure TVrHotImage.SetHotRect(Value: TVrHotRect);
begin
  FHotRect.Assign(Value);
end;

procedure TVrHotImage.SetDrawStyle(Value: TVrHotImageDrawStyle);
begin
  if FDrawStyle <> Value then
  begin
    FDrawStyle := Value;
    UpdateControlCanvas;
  end;
end;

procedure TVrHotImage.SetTextAlignment(Value: TVrTextAlignment);
begin
  if FTextAlignment <> Value then
  begin
    FTextAlignment := Value;
    UpdateControlCanvas;
  end;
end;

procedure TVrHotImage.SetColorEnter(Value: TColor);
begin
  if FColorEnter <> Value then
  begin
    FColorEnter := Value;
    UpdateControlCanvas;
  end;
end;

procedure TVrHotImage.SetColorLeave(Value: TColor);
begin
  if FColorLeave <> Value then
  begin
    FColorLeave := Value;
    UpdateControlCanvas;
  end;
end;

procedure TVrHotImage.Paint;
var
  P: TPoint;
  MidX, MidY: Integer;
  Image: TBitmap;
  TxtRect, ImageRect: TRect;
  TransparentColor: TColor;
begin
  if Transparent then ClearBitmapCanvas;

  with BitmapCanvas do
  begin
    if FHasMouse and Enabled then
    begin
      Image := ImageEnter;
      Brush.Color := FColorEnter;
      TransparentColor := FColorEnter;
    end
    else
    begin
      Image := ImageLeave;
      Brush.Color := FColorLeave;
      TransparentColor := FColorLeave;
    end;
    if not Transparent then
    begin
      FillRect(ClientRect);
      Brush.Style := bsSolid;
    end else Brush.Style := bsClear;

    if not Image.Empty then
    begin
      P := Point(Image.Width, Image.Height);
      if DrawStyle = dsCenter then
      begin
        MidX := (ClientWidth - P.X) div 2;
        MidY := (ClientHeight - P.Y) div 2;
        ImageRect := Bounds(MidX, MidY, P.X, P.Y)
      end else ImageRect := ClientRect;

      if Transparent then
        BrushCopy(ImageRect, Image, Bounds(0, 0, P.X, P.Y), TransparentColor)
        else StretchDraw(ImageRect, Image);
    end;

    TxtRect := ClientRect;
    if (HotRect.Visible) then
    begin
      InflateRect(TxtRect, -HotRect.Width - 2, -HotRect.Width - 2);
      if FHasMouse then
      begin
        ImageRect := ClientRect;
        DrawFrame3D(Self.BitmapCanvas, ImageRect,
          HotRect.Color, HotRect.Color, HotRect.Width);
      end;
    end;

    Brush.Style := bsClear;
    Font.Assign(Self.Font);
    DrawText(BitmapCanvas.Handle, PChar(Caption), -1, TxtRect,
      DT_SINGLELINE + VrTextAlign[TextAlignment]);
  end;

  ShowDesignFrame(BitmapCanvas);

  inherited Paint;
end;

procedure TVrHotImage.MouseEnter;
begin
  FHasMouse := True;
  UpdateControlCanvas;
  inherited;
end;

procedure TVrHotImage.MouseLeave;
begin
  FHasMouse := false;
  UpdateControlCanvas;
  inherited;
end;

procedure TVrHotImage.CMTextChanged(var Message: TMessage);
begin
  inherited;
  UpdateControlCanvas;
end;

procedure TVrHotImage.CMFontChanged(var Message: TMessage);
begin
  inherited;
  UpdateControlCanvas;
end;


end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?