You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TImage的自定义组件OnMouseDown事件无法触发问题

基于TImage自定义按钮的OnMouseDown事件无法触发问题

我尝试基于TImage创建一个按钮,通过OnMouseDown事件切换两张图片。运行时组件能显示第一张图片,但OnMouseDown事件始终无法触发。我查阅了相关问题但未找到答案,使用Delphi7和Windows11环境。

附上组件代码:

unit ImageBtn;

{$R resources.res resources.rc}

interface

uses WinTypes, WinProcs, Messages, SysUtils, Classes, Controls,
Forms, Graphics, Extctrls, AppEvnts, Buttons;

type

  TImageBtn = class(TImage)
    private
      FCenter : Boolean;
      FDoubleBuffered : Boolean;
      procedure AutoInitialize;
      procedure AutoDestroy;
      procedure SetDoubleBuffered(Value : Boolean);
      procedure WMSize(var Message: TWMSize); message WM_SIZE;

    protected
      procedure Click; override;
      procedure Loaded; override;
      procedure Paint; override;
      procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;

    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;

    published
      property OnClick;
      property OnDblClick;
      property OnDragDrop;
      property OnMouseDown;
      property OnMouseMove;
      property OnMouseUp;
      property Center : Boolean read FCenter write FCenter default True;
      property DoubleBuffered : Boolean read FDoubleBuffered write SetDoubleBuffered default True;
      property Height;
      property Proportional default True;
      property Stretch default True;
      property Width;
end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('dcs', [TImageBtn]);
end;

procedure TImageBtn.AutoInitialize;
begin
  FCenter := True;
  FDoubleBuffered := True;
  Height := 29;
  Proportional := True;
  Stretch := True;
  Width := 82;
  Picture.Bitmap.LoadFromResourceName(HInstance,'BITMAP1');
end;

procedure TImageBtn.AutoDestroy;
begin

end;

procedure TImageBtn.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  MouseDown(Button, Shift, X, Y);
  Picture.CleanupInstance;
  Picture.Bitmap.LoadFromResourceName(HInstance,'BITMAP2');
end;

procedure TImageBtn.SetDoubleBuffered(Value : Boolean);
begin
  FDoubleBuffered := Value;
end;

procedure TImageBtn.Click;
begin

inherited Click;
end;

constructor TImageBtn.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  AutoInitialize;
end;

destructor TImageBtn.Destroy;
begin
  AutoDestroy;
  inherited Destroy;
end;

procedure TImageBtn.Loaded;
begin
  inherited Loaded;
end;

procedure TImageBtn.Paint;
begin
  inherited Paint;
end;

procedure TImageBtn.WMSize(var Message: TWMSize);
var
  W, H: Integer;
begin
  inherited;
  W := Width;
  H := Height;
  if (W <> Width) or (H <> Height) then
  inherited SetBounds(Left, Top, W, H);
  Message.Result := 0;
end;

end.

编辑补充

  • 编辑1:无法为OnMouseDown代码添加断点(无蓝色标记点),附上相关截图。
  • 编辑2:仅部分代码行有蓝色断点标记,这显然与问题相关。
  • 编辑3:感谢各位回复,移除代码中MouseDown(Button, Shift, X, Y);行后问题解决。未使用TBitBtn是因为其边框和对齐方式不符合需求,按钮需要阴影效果。

内容的提问来源于stack exchange,提问作者Learning

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:30:59