基于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
相关产品推荐
相关产品推荐

