我想要在控件TChartfx上派生一个新的控件,实现OnMouseDown和OnMouseUp事件,
OnMouselease和OnMouseEnter可以响应,可是OnMouseDown和OnMouseUp却不行,
请高手帮忙看看什么问题,代码如下:
unit chartfx1;interfaceuses
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;implementationprocedure 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.
OnMouselease和OnMouseEnter可以响应,可是OnMouseDown和OnMouseUp却不行,
请高手帮忙看看什么问题,代码如下:
unit chartfx1;interfaceuses
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;implementationprocedure 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.
是在Application.OnIdle的事件中别调用的。
不是标准消息
而
OnMouseDown和OnMouseUp
却是windows消息驱动的。
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封装的事件都没了,当然无效了。