unit CustomDrawControl;

interface

uses
  Classes, Controls, Messages, Windows, Graphics;

type
  TCustomDrawControl = class(TCustomControl)
  private
    FOnPaint: TNotifyEvent;
    FOnLeave: TNotifyEvent;

    procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
    procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
    procedure WMKillFocus(var Message: TWMKillFocus); message WM_KILLFOCUS;
    procedure WMGetDlgCode(var Message: TMessage); message WM_GETDLGCODE;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  protected

  public
    procedure Paint; override;

    property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
    property Canvas;

    property OnDblClick;
    property OnKeyDown;
//    property OnKeyPress;
    property OnKeyUp;
    property OnMouseDown;
    property OnMouseMove;
    property OnMouseUp;
    property OnMouseWheel;
//    property OnMouseWheelDown;
//    property OnMouseWheelUp;
    property OnEnter;
    property OnExit;
    property OnMouseLeave: TNotifyEvent read FOnLeave write FOnLeave;
  end;

implementation

procedure TCustomDrawControl.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
  Message.Result := 1;
end;

procedure TCustomDrawControl.WMSetFocus(var Message: TWMSetFocus);
begin
  Invalidate;
end;

procedure TCustomDrawControl.WMKillFocus(var Message: TWMKillFocus);
begin
  if assigned(OnExit) then OnExit(self);
  Invalidate;
end;

procedure TCustomDrawControl.WMGetDlgCode(var Message: TMessage);
begin
  inherited;
  Message.Result :=  Message.Result or DLGC_WANTARROWS;
end;

procedure TCustomDrawControl.CMMouseLeave(var Message: TMessage); 
begin
  if Assigned(FOnLeave) then FOnLeave(Self);
end;

procedure TCustomDrawControl.Paint;
begin
  if Assigned(FOnPaint) then FOnPaint(Self);
end;

end.