一个对image的扩展控件

主要的功能:
1.可以移动。
2.鼠标移入移出和按下时能显示对应的图片。
3.按下时可以有位置改变的效果。
4.可以设置是否响应双击事件。
5.可设置组按下抬起 GroupIndex


修改日志:
2005-10-04
  解决鼠标点击过快时图片位置错误
  添加鼠标双击时是否触发双击事件(如果不触发则触发2次单击事件)
2005-11-28
  增加组功能,使某组内只有一个图片为被按下的状态 Down=True
2005-12-14
  修改在设计环境中也响应鼠标按下消息的错误


//********************************
//最后修改日期 2005-12-14        *
//********************************

unit MyEXImage;
interface

uses
  Messages, SysUtils, Classes, Graphics, Controls,
  ExtCtrls;
type

  TMyEXImage = class(TImage)
  private
    FOnMove:TNotifyEvent;

    FGroupIndex:integer;

    MouseIn,
    FCanDBClick,
    FCanMove,
    FButtonEffect,
    MDown,FDown:boolean;

    OldTop,OldLeft,OldMouseX,OldMouseY:integer;

    FDisableImage,FEnterImage,FLeaveImage,FClickImage:TPicture;
    FOnMouseEnter:TNotifyEvent;
    FOnMouselevel:TNotifyEvent;

    procedure WndProc(var Message: TMessage); override;

    procedure CMMouseEnter(var msg:TMessage);message CM_MOUSEENTER;
    procedure CMMouseLeave(var msg:TMessage);message CM_MOUSELEAVE;

    procedure SetDisableImage(const Value: TPicture);
    procedure SetEnterImage(const Value: TPicture);
    procedure SetLeaveImage(const Value: TPicture);
    procedure SetClickImage(const Value: TPicture);
    procedure SetCanMove(value:boolean);
    procedure SetCanDBClick(value:boolean);
    procedure SetButtonEffect(value:boolean);
    procedure SetDown(VALUE:boolean);
  protected
    { Protected declarations }
    procedure SetEnabled(Value: Boolean); override;
  public
    Data:TObject;
    Constructor Create(AOwner:TComponent);override;
    Destructor Destroy;override;
  published
    property Down:boolean read FDown write SetDown;
    property GroupIndex:integer read FGroupIndex write FGroupIndex;
    property ButtonEffect:boolean read FButtonEffect write SetButtonEffect;
    property CanDBClick:boolean read FCanDBClick write SetCanDBClick;
    property CanMove:boolean read FCanMove write SetCanMove;
    property OnMove:TNotifyEvent read FOnMove write FOnMove;
    property DisableImage:TPicture read FDisableImage write SetDisableImage;
    property EnterImage:TPicture read FEnterImage write SetEnterImage;
    property LeaveImage:TPicture read FLeaveImage write SetLeaveImage;
    property ClickImage:TPicture read FClickImage write SetClickImage;
    property OnMouseEnter:TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
    property OnMouselevel:TNotifyEvent read FOnMouselevel write FOnMouselevel;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Additional', [TMyEXImage]);
end;

{ MyEXImage }

procedure TMyEXImage.SetDown(VALUE:boolean);
var
  i:integer;
  Control:Tcontrol;
begin
if FGroupIndex>0 then
  begin
  FDown:=value;
  if value then
    begin
    if (parent<>nil) then
      for i:=0 to parent.ControlCount-1 do
        begin
        Control:=parent.Controls[i];
        if (Control is TMyEXImage) and (Control<>self) then
          if TMyEXImage(Control).GroupIndex=FGroupIndex then
            TMyEXImage(Control).Down:=false;
        end;
    end
  else
    if FLeaveImage.Graphic<>nil then Picture.Assign(FLeaveImage);
  end;
end;

procedure TMyEXImage.SetCanDBClick(value:boolean);
begin
FCanDBClick:=value;
end;

procedure TMyEXImage.SetCanMove(value:boolean);
begin
if FButtonEffect then
  FCanMove:=false
else
  FCanMove:=value;
end;

procedure TMyEXImage.SetButtonEffect(value:boolean);
begin
if value then
  FCanMove:=false;
FButtonEffect:=value;
end;

procedure TMyEXImage.CMMouseEnter(var msg: TMessage);
begin
  if Assigned(FOnMouseEnter) then FOnMouseEnter(Self);
  if Enabled and (not FDown) and (FEnterImage.Graphic<>nil) then Picture.Assign(FEnterImage);
  MouseIn:=true;
end;

procedure TMyEXImage.CMMouseLeave(var msg: TMessage);
begin
  if Assigned(FOnMouselevel) then FOnMouselevel(Self);
  if Enabled and (not FDown) and (FLeaveImage.Graphic<>nil) then Picture.Assign(FLeaveImage);
  MouseIn:=false;
end;

constructor TMyEXImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  if parent<>nil then parent.DoubleBuffered:=true;
  MDown:=false;
  FDown:=false;
  FButtonEffect:=false;
  FCanMove:=false;
  FEnterImage:=TPicture.Create;
  FLeaveImage:=TPicture.Create;
  FClickImage:=TPicture.Create;
  FDisableImage:=Tpicture.Create;
end;

destructor TMyEXImage.Destroy;
begin
  FDisableImage.Free;
  FEnterImage.Free;
  FLeaveImage.Free;
  FClickImage.Free;
  inherited Destroy ;
end;

procedure TMyEXImage.SetEnabled(Value: Boolean);
var
  k:boolean;
begin
  k:=GetEnabled<>value;
  inherited SetEnabled(Value);
  if k then
    if not Value then
      begin
      if FDisableImage.Graphic<>nil then Picture.Assign(FDisableImage);
      end
    else
      if FLeaveImage.Graphic<>nil then Picture.Assign(FLeaveImage);
end;

procedure TMyEXImage.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_MOVE:
      if Assigned(FOnMove) then FOnMove(self);
    WM_LBUTTONDOWN:
      begin
      if FButtonEffect then
        if not MDown then
          SetBounds(left+1,top+1,width,height);
      MDown:=true;
      if FCanMove then
        begin
        OldMouseX:=mouse.CursorPos.X;
        OldMouseY:=mouse.CursorPos.Y;
        OldLeft:=left;
        OldTop:=top;
        end;
      inherited;
      if MouseIn and (FClickImage.Graphic<>nil) then Picture.Assign(FClickImage);
      end;
    WM_LBUTTONUP:
      begin
      SetDown(not FDown);
      if FButtonEffect then
        if MDown and (not FDown) then
          SetBounds(left-1,top-1,width,height);
      MDown:=false;
      inherited;
      if not FDown then
        if MouseIn then
          begin
          if FEnterImage.Graphic<>nil then Picture.Assign(FEnterImage);
          end
        else
          begin
          if FLeaveImage.Graphic<>nil then Picture.Assign(FLeaveImage);
          end;
      end;
    WM_MOUSEMOVE:
      begin
      inherited;
      if FCanMove and FDown then
        SetBounds(OldLeft-OldMouseX+mouse.CursorPos.X,
                  OldTop-OldMouseY+mouse.CursorPos.Y,
                  width,height);
      end;
    WM_LBUTTONDBLCLK:
      begin
      if not FCanDBClick then
        Perform(WM_LBUTTONDOWN,Message.WParam,Message.LParam)
      else
        inherited;
      end;
  else
    inherited WndProc(Message);
  end;
end;

procedure TMyEXImage.SetDisableImage(const Value: TPicture);
begin
  FDisableImage.Assign(Value);
  if not Enabled and (FDisableImage.Graphic<>nil) then Picture.Assign(FDisableImage);
end;

procedure TMyEXImage.SetEnterImage(const Value: TPicture);
begin
  FEnterImage.Assign(Value);
end;

procedure TMyEXImage.SetLeaveImage(const Value: TPicture);
begin
  FLeaveImage.Assign(Value);
  if Enabled and (FLeaveImage.Graphic<>nil) then Picture.Assign(FLeaveImage);
end;

procedure TMyEXImage.SetClickImage(const Value: TPicture);
begin
  FClickImage.Assign(Value);
end;

end.  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值