我想要在控件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.

解决方案 »

  1.   

    OnMouselease和OnMouseEnter
    是在Application.OnIdle的事件中别调用的。
    不是标准消息

    OnMouseDown和OnMouseUp 
    却是windows消息驱动的。
      

  2.   

    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封装的事件都没了,当然无效了。
      

  3.   

    这个TChartfx是Delphi自带的,有哪位高手能帮帮忙试试