当鼠标停留在某个按钮或者组件上时,该按钮或组件有自己的鼠标事件代码,此时点击鼠标右键,我不想执行该按钮或组件的鼠标按键代码,而是希望执行其他代码,如何实现啊。好像老是会被按钮捕捉到,难道用钩子?太麻烦了吧。

解决方案 »

  1.   

    比如:有一个panel,上面放了几个button,每个butoon有自己的鼠标Onmousedown事件,不过Onmousedown只实现其中左键事件。我希望,在panel范围内,不管鼠标停留在哪个组件上方,当点击右键的时候都可以执行某个过程或者函数。
      

  2.   

    在OnMouseDown事件中procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      if Button=mbRight then
        ShowMessage('你按了鼠标右键');
    end;
      

  3.   

    楼上大哥,你的这个我知道,关键是,当鼠标停留在button1时,我不想执行button的代码啊。我想执行panel的代码啊。如果panel上有好多button,一个个写右键代码,那还不得累死。
      

  4.   

    procedure TForm1.WndProc(var Message: TMessage);
    begin
      //WM_RBUTTONDOWN = $0204;
      inherited WndProc(Message);
      with Message do
        if (Msg = WM_RBUTTONDOWN ) then
        begin
        showmessage('你点击了右键--------------');
        end;end;我用如上代码,结果,只要鼠标是在原本有鼠标事件的地方点击右键,就会触发两次消息(比如有个BUTTON有鼠标的mousedown事件,不过该button是判断鼠标的双击),在窗体上用右键没有问题。怎么回事。我不是只判断button的双击嘛,而且是左键双击,为什么会触发消息的右键呢?
      

  5.   

    还有就是有两个PANEL,我在其中一个PANEL1的ONEXIT写代码PANEL1.hide,表示失去焦点的时候,隐藏自己,可我点击PANEL2,该PANEL2无法获取焦点?可是PANEL有SETFOCUS的功能啊。为什么点击它无法获取焦点呢?
      

  6.   

    1. 如果你不希望原来事件执行, 那么就截WM_LBUTTONDOWN或WM_RBUTTONDOWN消息直接进入你自己的处理过程,处理完后不要调用inherited。
    2. 设置Panel.TabStop:=true,点击Panel就能获得焦点了
      

  7.   

    to 楼上大哥:设置TabStop属性后,点击并不能获取焦点啊
      

  8.   

    还要在panel里面写代码嘛。TabStop应该是用键盘Tab的时候获取焦点吧。