试试这个控件,有IMAGE AND LABEL 组成的。
unit ImageLabelSrc;interfaceUses messages,Classes, Controls, stdCtrls, extCtrls, Math, Graphics;//, AutoLabel;Type
    TwjImageLabel=Class(TWinControl)                 //        tpanel
    Private
        PriImage: TImage;
        PriLabel: TLabel;        //FOnClick: TNotifyEvent;
        procedure WMLButtonDblClick(var Msg:TWMLButtonDblClk);message WM_LButtonDblClk;
    Protected
        fClockDblClick:TNotifyEvent;
        Procedure Resize; override;
        //Procedure MouseMove(Shift: TShiftState; X, Y: Integer);override;        Function GetCaption: TCaption;
        Procedure SetCaption(Const Value: TCaption);
        Function GetPicture: TPicture;
        Procedure SetPicture(Value: TPicture);
        procedure ClockDblClick(sender:TObject);
        //Function GetMoveColor: TColor;
        //Procedure SetMoveColor(Value: TColor);
    Public
        Constructor Create(AOwner: TComponent); override;
        Destructor Destroy; override;
    Published
        Property Name;
        Property Font;
        Property Enabled;
        Property TabStop;
        Property TabOrder;
        Property ParentFont;
        Property Hint;
        Property ShowHint;
        Property Color;
        Property Visible;
        Property Caption: TCaption Read GetCaption Write SetCaption;
        Property Picture: TPicture Read GetPicture Write SetPicture;
        //Property MoveColor: TColor Read GetMoveColor Write SetMoveColor;        {Event}
        //Property OnClick: TNotifyEvent Read FOnClick Write FOnClick;
        //property OnClick;
        property OnClockDblClick:TNotifyEvent
        read fClockDblClick write fClockDblClick;
    End;Procedure Register;implementationUses Dialogs;{ TwjImageLabel }
procedure TwjImageLabel.ClockDblClick;
begin
    if Assigned(FClockDblClick) then
        fClockDblClick(self);
end;procedure TwjImageLabel.WMLButtonDblClick(var Msg:TWMLButtonDblClk);
begin
    inherited;
    ClockDblClick(self);
end;constructor TwjImageLabel.Create(AOwner: TComponent);
begin
    inherited;
    TabStop:=True;    PriImage:=TImage.Create(Self);
    PriLabel:=TLabel.Create(Self);
    PriImage.Parent:=Self;
    PriLabel.Parent:=Self;
    PriLabel.Caption:=Name;
    PriLabel.AutoSize:=True;
    PriLabel.Visible:=True;
    //PriLabel.MoveColor:=clRed;    Height:=Max(PriImage.Height, PriLabel.Height);
    Width:=PriImage.Width+PriLabel.Width+2;    PriImage.Left:=0;
    PriImage.Top:=0;
    PriLabel.Left:=PriImage.Width+2;
    PriLabel.Top:=(Height-PriLabel.Height) Div 2;    //PriLabel.OnDblClick:=ClockDblClick(self);
    PriImage.OnDblClick:=ClockDblClick;
    Prilabel.OnDblClick:=ClockDblClick;
end;destructor TwjImageLabel.Destroy;
begin
    PriImage.Free;
    PriLabel.Free;    inherited;
end;function TwjImageLabel.GetCaption: TCaption;
begin
    Result:=PriLabel.Caption;
end;{function TwjImageLabel.GetMoveColor: TColor;
begin
    Result:=PriLabel.MoveColor;
end;
 }
function TwjImageLabel.GetPicture: TPicture;
begin
    Result:=PriImage.Picture;
end;{procedure TwjImageLabel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
    //PriLabel.MouseMove(Shift, X, Y);
end;
 }
procedure TwjImageLabel.Resize;
begin
    inherited;    PriImage.Left:=0;
    PriImage.Top:=0;
    PriImage.Height:=Height;
    PriImage.Width:=PriImage.Height;    PriLabel.Left:=PriImage.Width+2;
    PriLabel.Top:=(Height-PriLabel.Height) Div 2;
end;procedure TwjImageLabel.SetCaption(const Value: TCaption);
begin
    PriLabel.Caption:=Value;
end;{procedure TwjImageLabel.SetMoveColor(Value: TColor);
begin
    PriLabel.MoveColor:=Value;
end;
 }
procedure TwjImageLabel.SetPicture(Value: TPicture);
begin
    PriImage.Picture.Assign(Value);
end;Procedure Register;
Begin
    RegisterComponents('Jerome Controls', [TwjImageLabel]);
End;end.

解决方案 »

  1.   

    为复合组件定义一个新的事件就可以了。

      type TAllClickEvent=procedure (sender:TObject;......) of Object;
    private
       FOneClick:TAllClickEvent;
    publish
       property OneClick :TAllClickEvent read FOneClick write FOneClick;
      

  2.   

    再详细一些,尝试出真知,思路如此,其他自己实践。type TAllClickEvent=procedure (sender:TObject;......) of Object;
    private
      FOneClick:TAllClickEvent;
      procedure OneClicked(Sender:TObject);publish
      property OneClick :TAllClickEvent read FOneClick write FOneClick;
    procedure OneClicked(Sender:TObject);
    begin
         if Assigned (FOneClick) then
         begin
              //..........你要作的事
         end;
    end;
        
      

  3.   

    谢谢回答,我要做的是做一个NOTES风格的界面,其中用到一个控件,里有3个panel组成
    特点是,  OnMouseMove时整个控件向上浮动一下。 离开控件时恢复平常。 内部有一个,关闭按钮,一个普通的象Button的东东.  现在控件间的通讯( 想用SendMessage),不知如何实现
      

  4.   

    CM_MouseEnter和CM_MouseLeave消息呀。请问你想让这三个控件之间如何通讯。
      

  5.   

    这两个消息已经用到我的控件中去了,
         当我Mouse 移动到控件中的一个Panel上时,控件中的另一个Panel也做OnMouse事件,
    就是当移动到一个Panel, 发消息让另外一个也响应    
      

  6.   

    先建立一个响应CM_MouseEnter和CM_MouseLeave消息的控件,从TPanel继承,以产现浮起和恢复功能,再建立你说的这种控件在CMMouseEnter中发CM_MouseEnter消息给这三个子控件。
      

  7.   

    我现在就是要问如何发送消息, help
       
      

  8.   

    如果你的复合控件由这三个面板组成,不知能汉有由到CM_MouseEnter消息.
    procedure TXXXXX.CMMouseEnter(var Message: TMessage);
    begin
      FPanel1.Preform(CM_MouseEnter, 0, 0);
      FPanel2.Perform(CM_MouseEnter, 0, 0);
      FPanel3.Perform(CM_MouseEnter, 0, 0);
    end;
      

  9.   

    unit MyBitBtn2;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons,extctrls;type
      TMyCustomBitBtn = class(TPanel)
      private
        { Private declarations }
        FDown:boolean;
        FBtnLeftCaption:String;
        FBtnLeftWidth:Integer;    //BtnLeftCaption: string;
        FPickListLeft: TWinControl;
        FPickListCancel: TWinControl;
        FOnMouseEnter: TNotifyEvent;
        FOnMouseLeave: TNotifyEvent;
      protected
        { Protected declarations }
        procedure CMMouseEnter(var Message: TMessage); message CM_MouseEnter;
        procedure CMMouseLeave(var Message: TMessage); message CM_MouseLeave;
        procedure MyMouseMove(var Message:TWMMouse); message WM_MOUSEMOVE;
        procedure MyMouseDown(var Message:TWMMouse); message WM_LBUTTONDOWN;
        procedure MyMouseUp(var Message:TWMMouse); message WM_LBUTTONUP;  public
        { Public declarations }
      published
        { Published declarations }
        property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
      //  Property BtnLeftCaption: string  read FBtnLeftCaption write FBtnLeftCaption;  end;  TMyBackBitBtn=Class(TMyCustomBitbtn)
      Private
      protected
        procedure CreateChildren;
       // function GetBtnLeftCaption:String;
        //function GetBtnLeftWidth:Integer;
        //function GetBtnCancelCaption;
        //function GetBtnCancelWidth:Integer;
        procedure SetBtnLeftCaption(Value:String);
        procedure SetBtnLeftWidth(Const Value:Integer);
        //procedure SetBtnCancelCaption(Value:String);
        //procedure SetBtnCancelWidth( Value:Integer);
        procedure CMMouseEnter(var Message: TMessage);override;  Public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      Published
        //Property  BtnLeftCaption: string  read FBtnLeftCaption write FBtnLeftCaption;
        Property  BtnLeftCaption: string read FBtnLeftCaption write SetBtnLeftCaption ;
        Property  BtnLeftWidth: Integer read FBtnLeftWidth write SetBtnLeftWidth default 20;
        //Property  FBtnCancelCaption: string read GetBtnCancelCaption write SetBtnCancelCaption;
        //Property  FBtnCancelWidth: string read GetBtnCancelWidth write SetBtnCancelWidth;
      end;  TMyLeftBitBtn=Class(TMyCustomBitbtn)
      Private
      protected
        procedure CMMouseEnter(var Message: TMessage);override;
      Public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;  TMyCancelBitBtn=Class(TMyCustomBitbtn)
      Private
      protected
      Public
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
      end;
    procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Samples', [tMyCustomBitBtn,TMyBackBitBtn]);
    end;{ TMyBitBtn }procedure TMyCustomBitBtn.CMMouseEnter(var Message: TMessage);
    begin
      if Assigned(FOnMouseEnter) then FOnMouseEnter(self);
    end;procedure TMyCustomBitBtn.CMMouseLeave(var Message: TMessage);
    begin
      FDown:=false;
      Tpanel(self).BevelInner:=BvNone;
      Tpanel(self).BevelOuter:=BvNone;
      if Assigned(FOnMouseLeave) then FOnMouseLeave(self);end;{procedure TMyCustomBitBtn.OnMouseMove(var Key: Char);
    begin
      inherited;
      if FDown then exit;
      Tpanel(self).BevelInner:=bvNone;
      Tpanel(self).BevelOuter:=BvRaised;
    end;
    }
    procedure TMyCustomBitBtn.MyMouseDown(var Message: TWMMouse);
    begin
      inherited;
      //ShowMessage(' start');
      Tpanel(self).BevelInner:=bvLowered;
      Tpanel(self).BevelOuter:=BvNone;
      FDown:=true;
    end;procedure TMyCustomBitBtn.MyMouseMove;
    begin
      inherited;
      //ShowMessage(' start');
      if FDown then exit;
      Tpanel(self).BevelInner:=bvNone;
      Tpanel(self).BevelOuter:=BvRaised;
      Tpanel(self).BorderStyle:=bsSingle;
    end;
    procedure TMyCustomBitBtn.MyMouseUp(var Message: TWMMouse);
    begin
      inherited;
      //ShowMessage(' start');
      //Tpanel(self).BevelInner:=bvNone;
      //Tpanel(self).BevelOuter:=BvRaised;end;constructor TMyCancelBitBtn.Create(AOwner: TComponent);
    begin
      inherited;
      Tpanel(self).BevelInner:=BvNone;
      Tpanel(self).BevelOuter:=BvRaised;end;destructor TMyCancelBitBtn.Destroy;
    begin
      inherited Destroy;
    end;procedure TMyLeftBitBtn.CMMouseEnter(var Message: TMessage);
    //var TmpCancel:tMyCancelBitbtn;
    begin
      inherited;
      //TmpCancel:=self.Parent.FindChildControl(TMyCancelBitbtn);
      SendMessage(self.parent.handle,CM_MouseEnter,0,0);
      //SendMessage(TMyCancelBitbtn,CM_MouseEnter,0,0);
    end;constructor TMyLeftBitBtn.Create(AOwner: TComponent);
    begin
      inherited;
      Tpanel(self).BevelInner:=BvNone;
      Tpanel(self).BevelOuter:=BvRaised;
      TPanel(self).Caption:=FBtnLeftCaption;end;destructor TMyLeftBitBtn.Destroy;
    begin
      inherited Destroy;
    end;constructor TMyBackBitBtn.Create(AOwner: TComponent);
    begin
      inherited;
      CreateChildren;
      Tpanel(self).BevelInner:=BvNone;
      Tpanel(self).BevelOuter:=BvNone;
    end;procedure TMyBackBitBtn.CreateChildren;
    begin
      if not Assigned(FPickListCancel) then begin
        FPickListCancel := TMyCancelBitbtn.Create(Self);
        FPickListCancel.Parent := Self;
        FPickListCancel.Visible := True;
        FPickListCancel.Align:=alRight;
        TPanel(FPickListCancel).BevelInner:=bvNone;
        TPanel(FPickListCancel).BevelOuter:=bvNone;
        TPanel(FPickListCancel).ParentFont := True;
      end;  if not Assigned(FPickListLeft) then begin
        FPickListLeft := TMyLeftBitbtn.Create(Self);
        FPickListLeft.Parent := Self;
        FPickListLeft.Visible := True;
        FPickListLeft.Align:=alClient;    TPanel(FPickListLeft).Caption:=FBtnLeftCaption;
        TPanel(FPickListLeft).BevelInner:=bvNone;
        TPanel(FPickListLeft).BevelOuter:=bvNone;
        TPanel(FPickListLeft).Width:=FBtnLeftWidth;
        //TPanel(FPickListLeft).
      end;
    end;procedure TMyBackBitBtn.SetBtnLeftCaption(Value: String);
    begin
     // if Value='' then BtnLeftCaption:=''
     // else if Value<>FBtnLeftCaption then
       //ShowMessage(Value);
       FBtnLeftCaption:=value;
    end;
    destructor TMyBackBitBtn.Destroy;
    begin
      inherited Destroy;
    end;procedure TMyBackBitBtn.SetBtnLeftWidth(const Value: Integer);
    begin
      FBtnLeftWidth := Value;
    end;procedure TMyBackBitBtn.CMMouseEnter(var Message: TMessage);
    begin
      inherited; // SELF.FlipChildren
     // self.GetChildren(TMyCancelBitbtn,self);
      //SendMessage(
    end;end.