我有下面的程序:
procedure wmnchittest(var msg:twmnchittest); message wm_nchittest; 
在程序部分加入以下代码: 
procedure TForm1.wmnchittest(var msg:twmnchittest); 
begin 
 inherited; 
 if (htclient=msg.result) then 
  msg.result:=htcaption; 
end;
我在窗体的任何地方拖东时都可以拖东窗体,
但是有个问题,在窗体上有一个按钮,我不需要在按钮上拖东时也拖东窗体,因为按钮有其他功能。不知怎么解决?

解决方案 »

  1.   

    你一定没有亲自试过这段代码(或者你的其他什么地方错了),你的这段代码就能达到你的目的,
    你代码中TForm1.wmnchittest(var msg:twmnchittest); 只截取form的鼠标拖动事件,不会对你的按钮有什么影响的。
    你试试就知道了
      

  2.   

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ReleaseCapture;
      SendMessage(Handle, WM_SYSCOMMAND, $F012, 0);
    end;
      

  3.   

    同意jacky_shen(jacky),用procedure wmnchittest(var msg:twmnchittest); message wm_nchittest;的话,你用SpeedButton试试,保你大跌眼镜。
    TSpeedButton是从TControl->TGraphicControl继承来的,没经过TWinControl。
      

  4.   

    jacky_shen(jacky) 非常感谢,可以说说他们的原理吗?XiaoDingDangKM(小叮当) ,我用TSpeedButton也不行啊,你可以试试。
      

  5.   

    jacky_shen(jacky) 的确说得对,但是是什么原因,可以说说吗?XiaoDingDangKM(小叮当) 用TSpeedButton也不行呢:(
      

  6.   

    我分析是因为htclient是针对From窗体客户区击键检测的,TButton继承了TWinControl,是单独的窗体,(TGraphicControl-)TSpeedButton没有经过TWinControl是属于图形控件,不是窗口控件,不具备窗口句柄。而Jack_shen的方法是在FormMouseDown中发一个消息,只有Form被鼠标击中才会发此消息。我猜想是这样,不知对不对?