在WinProc 中响应
on_Command

解决方案 »

  1.   

    不对,是WM_Command
    WM_COMMAND  
    wNotifyCode = HIWORD(wParam); // notification code 
    wID = LOWORD(wParam);         // item, control, or accelerator identifier 
    hwndCtl = (HWND) lParam;      // handle of control 
      

  2.   

    能给出具体代码吗?我是在一个动态生成的窗口中动态生成的一个Button。
      

  3.   

    Button.OnClick := MyProc;  //MyProc为自定义过程
      

  4.   

    如果只是动态生成一个标准Button的话就可以这样,
    procedure BTN_Proc(Sender:TObject);
    begin
      ....//单击事件
    end;.....
    var
      btn : TButton;
    begin
      btn := TButton.Create(Self);
      btn.parent := self;
      btn.OnClick := BTN_Proc;
    end;
      

  5.   

    在窗口的 click 事件中:
       如果:鼠标在按钮区域内 则:
          处理你自己需要的事情!
       结束如果;
    结束窗口 click 事件;
      

  6.   

    我按照liang_z(千山一刀之忍者神龟)的方法,可是编译时说:
    语句btn.OnClick:=BTN_Proc出现一下错误:
    Incompatible types: 'method pointer and regular procedure'
    这是为什么?
      

  7.   

    如果只是动态生成一个标准Button的话就可以这样,
    procedure BTN_Proc(Sender:TObject);
    begin
      ....//单击事件
    end;.....
    var
      btn : TButton;
    begin
      btn := TButton.Create(Self);
      btn.parent := self;
      btn.OnClick := BTN_Proc;  //////  btn.OnClick := BTN_Proc(nil);试一试
    end; 
      

  8.   

    不行, btn.OnClick是TNotifyEvent类型,BTN_Proc是procedure过程,两个不能等。
      

  9.   

    拦截WM_LBUTTONDOWN消息
    判断鼠标坐标
    是否在你的Button内
    然后作相应处理
      

  10.   

    TNotifyEvent的定义:TNotifyEvent = procedure(Sender: TObject) of object;
    TNotifyEvent类型的变量就是一个方法指针你的控件如果完全是自己画的,需要响应消息,并且要从TWinControl继承
      

  11.   

    dancemaple(枫之舞) ,能给我一个正确的例子吗?
      

  12.   

    我以前照着Delphi 4 Unleashed这本书写过例子,不过现在找不到了。我再找找看
      

  13.   

      TFMain = class(TForm)
        ....
      private
        { Private declarations }
        myBTN: TButton;
        procedure myClick(Sender: TObject);
      public
        ...
      end;var
      FMain: TFMain;
    implementationprocedure TFMain.myClick(Sender: TObject);
    begin
      showmessage('OK');
    end;procedure TFMain.FormCreate(Sender: TObject);
    begin
      myBTN := TButton.Create(self);
      myBTN.Parent := self;
      myBTN.OnClick := myClick;
    end;procedure TFMain.FormDestroy(Sender: TObject);
    begin
      if Assigned(myBTN) then
        myBTN.Free;
    end;
      

  14.   

    找不到,大概说一下吧。那个例子是从TPanel继承,写了一个TMousePanel,用Panel来模仿TButton,当鼠标按下时,拦截WM_LMOUSEDOWN消息,鼠标左键弹起时,拦截WM_LMOUSEUP事件。(以下代码可能不全,请自己补全。如果想在鼠标点击时做别的处理,请自己增加功能)
    unit Unit1;interfacetype
      TMousePanel = class(TPanel)
      private  protected
        procedure wmMouseDown(var Msg: TWMMouse); message WM_LMOUSEDOWN;
        procedure wmMouseUp(var Msg: TWMMouse); message WM_LMOUSEUP;
      public
        constructor Create(AOwner: TComponent); override;
      end;
    ...implementation...{ TMousePanel }constructor TMousePanel.Create(AOwner: TComponent);
    begin
      inherited;
      BevelInner := bvRaised;
    end;procedure TMousePanel.wmMouseDown(var Msg: TWMMouse);
    begin
      // 用来模拟Button被按下时的外观变化
      BevelInner := bvLowered;
      SetCapture(Handle);
    end;procedure TMousePanel.wmMouseUp(var Msg: TWMMouse);
    var
      AOnClick: TNotifyEvent;
    begin
      BevelInner := bvRaised;
      ReleaseCapture;
      AOnClick := OnClick;
      if Assigned(AOnClick) then
        OnClick(Self);
    end;
      

  15.   

    用 TPanel 继承??
    为什么不用 TPaintBox? 小的多了