如何增加控件的OnMouseDown和OnMouseUp事件

不停歇的步伐 2007-11-15 09:22:04
我想要在控件TChartfx上派生一个新的控件,实现OnMouseDown和OnMouseUp事件,
OnMouselease和OnMouseEnter可以响应,可是OnMouseDown和OnMouseUp却不行,
请高手帮忙看看什么问题,代码如下:
unit chartfx1;

interface

uses
SysUtils, Classes, Controls, OleCtrls, Chartfx3, messages, forms;

type
tchartfx1 = class(TChartfx)
private
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
FControlState: TControlState;
FOnMouseDown: TMouseEvent;
FOnMouseMove: TMouseMoveEvent;
FOnMouseUp: TMouseEvent;

procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); dynamic;
procedure CMMouseLeave(var Message: TWMMouse); message CM_MOUSELEAVE;
procedure CMMouseEnter(var Message: TWMMouse); message CM_MOUSEENTER;
{ Private declarations }
procedure MouseEnter; virtual;
procedure MouseLeave; virtual;
procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
procedure WMNCLButtonDown(var Message: TWMNCLButtonDown); message WM_NCLBUTTONDOWN;
procedure WMRButtonDown(var Message: TWMRButtonDown); message WM_RBUTTONDOWN;
procedure WMMButtonDown(var Message: TWMMButtonDown); message WM_MBUTTONDOWN;
procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
protected
{ Protected declarations }
public
{ Public declarations }
published
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;

{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Samples', [tchartfx1]);
end;

{ tchartfx1 }

procedure tchartfx1.CMMouseEnter(var Message: TWMMouse);
begin
inherited;
MouseEnter;

end;

procedure tchartfx1.CMMouseLeave(var Message: TWMMouse);
begin
inherited;
MouseLeave;
end;

procedure tchartfx1.DoMouseDown(var Message: TWMMouse;
Button: TMouseButton; Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);

end;

procedure tchartfx1.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;

procedure tchartfx1.MouseEnter;
begin
if Assigned(FOnMouseEnter) then FOnMouseEnter(self);
end;

procedure tchartfx1.MouseLeave;
begin
if Assigned(FOnMouseLeave) then FOnMouseLeave(self);
end;

procedure tchartfx1.WMLButtonDown(var Message: TWMLButtonDown);
begin
SendCancelMode(Self);
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := True;
if csClickEvents in ControlStyle then Include(FControlState, csClicked);
DoMouseDown(Message, mbLeft, []);

end;

procedure tchartfx1.WMMButtonDown(var Message: TWMMButtonDown);
begin
inherited;
DoMouseDown(Message, mbMiddle, []);
end;

procedure tchartfx1.WMNCLButtonDown(var Message: TWMNCLButtonDown);
begin
SendCancelMode(Self);
inherited;
end;

procedure tchartfx1.WMRButtonDown(var Message: TWMRButtonDown);
begin
inherited;
DoMouseDown(Message, mbRight, []);

end;

end.
...全文
488 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
不停歇的步伐 2007-11-23
  • 打赏
  • 举报
回复
这个TChartfx是Delphi自带的,有哪位高手能帮帮忙试试
aifire 2007-11-21
  • 打赏
  • 举报
回复
太长了。....
jwpl190 2007-11-21
  • 打赏
  • 举报
回复
OnMouselease和OnMouseEnter
是在Application.OnIdle的事件中别调用的。
不是标准消息

OnMouseDown和OnMouseUp
却是windows消息驱动的。
不停歇的步伐 2007-11-21
  • 打赏
  • 举报
回复
难道这个问题没有人知道吗?
sy_100000 2007-11-21
  • 打赏
  • 举报
回复
procedure tchartfx1.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;

改成
procedure tchartfx1.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited;
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);
end;
MouseDown是VCL拦截鼠标相关的消息并封装成鼠标事件,以事件驱动应用。少了inherited,VCL封装的事件都没了,当然无效了。

5,939

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧