我做了一个控件,要用到一个窗口。
怎样得知窗口那个按钮按下?

解决方案 »

  1.   

    子类?子类可以对所有的按钮进行重绘,捕获按下应该不成问题,看看 XP Menu 的源码
      

  2.   

    从消息接受机制下手。
    但是没有太多的vcl开发exp.看看先
      

  3.   

    看看下面的代码能否满足你的要求:unit TestComponent;interfaceuses
      Controls, StdCtrls, Forms, Dialogs, Windows, Messages, SysUtils, Classes;type
      TTestComponent = class(TComponent)
      private
        { Private declarations }
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
      published
        { Published declarations }
      end;type
      TButtonProc = class(TComponent)
      private
        TestComponent: TTestComponent;
        Button: TButton;
        OldBtnWindowProc: TWndMethod;
        procedure NewBtnWindowProc(var Message: TMessage);
      end;procedure Register;implementationprocedure TButtonProc.NewBtnWindowProc(var Message: TMessage);
    begin
      OldBtnWindowProc(Message);
      if Message.Msg = CN_COMMAND then
        if TWMCommand(Message).NotifyCode = BN_CLICKED then begin
          ShowMessage(Button.Name);
          // TestComponent. ...
        end;
    end;constructor TTestComponent.Create(AOwner: TComponent);
    var
      i: Integer;
      btnProc: TButtonProc;
    begin
      inherited Create(AOwner);
      if AOwner is TForm then
      with TForm(AOwner) do
        for i := 0 to ComponentCount - 1 do
          if Components[i] is TButton then begin
            btnProc := TButtonProc.Create(Self);
            with btnProc do begin
              TestComponent := Self;
              Button := TButton(TForm(AOwner).Components[i]);
              OldBtnWindowProc := Button.WindowProc;
              Button.WindowProc := NewBtnWindowProc;
            end;
          end;
    end;procedure Register;
    begin
      RegisterComponents('Standard', [TTestComponent]);
    end;end.