不可能吧?
消息是通过句丙传播的,除非你设置的句丙是form1或者application
它向下扩散到其他构件了

解决方案 »

  1.   

    unit MyPanel;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      ExtCtrls,grids;type
      TMyPanel = class(TPanel)
      private
        { Private declarations }
        FDown:boolean;
        FPaintStyle:Integer;
        FKind:Integer;
        FOnMouseEnter: TNotifyEvent;
        FOnMouseLeave: TNotifyEvent;
        OldWndProcPnl: TWndMethod;
        FOnPaint: TNotifyEvent;
        procedure SetDown(Value:boolean);
        procedure SetPaintStyle(Value:Integer);
        procedure SetKind(value:Integer);
      protected
        { Protected declarations }
        procedure CMMouseEnter(var Message: TMessage); message CM_MouseEnter;
        procedure CMMouseLeave(var Message: TMessage); message CM_MouseLeave;
        procedure Paint;override;
      public
        { Public declarations }
        procedure DrawBright(ACanvas:TCanvas;Arect:trect);
        procedure DrawGray(ACanvas:TCanvas;Arect:trect);
        procedure DrawCenterBright(ACanvas:TCanvas;Arect:trect);
        procedure DrawCenterGray(ACanvas:TCanvas;Arect:trect);
        procedure DrawCancel(ACanvas:TCanvas;Arect:trect);
        procedure DrawClear(ACanvas:TCanvas;Arect:trect);
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
       published
        { Published declarations }
        property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
        property Onpaint:TNotifyEvent read FOnPaint write FOnpaint;
        Property IsDown:boolean read FDown write SetDown;
        property PaintStyle:Integer read FPaintStyle write SetPaintStyle;
        property Kind:Integer read FKind write SetKind;
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [TMyPanel]);
    end;{ TMyPanel }
    procedure TMyPanel.CMMouseEnter(var Message: TMessage);
    begin
     if Assigned(FOnMouseEnter) then FOnMouseEnter(self);
    end;procedure TMyPanel.CMMouseLeave(var Message: TMessage);
    begin
     if Assigned(FOnMouseLeave) then FOnMouseLeave(self);
    end;procedure TMyPanel.SetDown(Value: boolean);
    begin
      if FDown<>Value then
      FDown:=Value;
    end;procedure TMyPanel.SetKind(value: Integer);
    begin
      if FKind<>Value then FKind:=Value;
    end;procedure TMyPanel.Paint;
    begin
      inherited Paint;
      case self.FPaintStyle of
       0:  DrawClear(TDrawGrid(self).canvas,self.ClientRect);//空白 ;
       1:  DrawBright(TDrawGrid(self).canvas,self.ClientRect);
       2:  DrawGray(TDrawGrid(self).canvas,self.ClientRect);
       3:  DrawCenterBright(TDrawGrid(self).canvas,self.ClientRect);
       4:  DrawCenterGray(TDrawGrid(self).canvas,self.ClientRect);
       5:  DrawCancel(TDrawGrid(self).canvas,self.ClientRect);
      else
           DrawClear(TDrawGrid(self).canvas,self.ClientRect);//空白
      end;end;procedure TMyPanel.SetPaintStyle(Value: Integer);
    begin
      if FPaintStyle<>Value then
      FPaintStyle:=Value;
    end;
    //--------------
    procedure TMyPanel.DrawBright(ACanvas:TCanvas;Arect:trect);
    procedure TMyPanel.DrawGray(ACanvas: TCanvas; Arect: trect);
    procedure TMyPanel.DrawCenterBright(ACanvas: TCanvas; Arect: trect);
    procedure TMyPanel.DrawCenterGray(ACanvas: TCanvas; Arect: trect);
    procedure TMyPanel.DrawCancel(ACanvas: TCanvas; Arect: trect);
    procedure TMyPanel.DrawClear(ACanvas: TCanvas; Arect: trect);
    //-------------------------------------------------------------------
    constructor TMyPanel.Create(AOwner: TComponent);
    begin
      inherited;
      PaintStyle:=0;
    end;destructor TMyPanel.Destroy;
    begin
      inherited;
    end;end.
      

  2.   

    代码就是这么点,我现在是下面一个panel, 上面两个panel, 动态创建, 就是会出问题