【问题标题】:Move form without border style移动无边框样式的表单
【发布时间】:2012-06-06 19:45:30
【问题描述】:

如何移动无边框表单?我尝试在互联网上寻找,但没有。非常感谢。

【问题讨论】:

标签: windows forms delphi borderless


【解决方案1】:

您可以使用任何包含的控件来拖动表单,包括它自己。

使用以下示例,您可以通过单击其画布并拖动来移动表单。您可以通过将相同的代码放入面板的 MouseDown 事件中来对表单上的面板执行相同的操作,这样您就可以创建自己的伪标题栏。

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
const
  SC_DRAGMOVE = $F012;
begin
  if Button = mbLeft then
  begin
    ReleaseCapture;
    Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
  end;
end;

【讨论】:

    【解决方案2】:

    如果您的意思是用鼠标拖动窗口,您可以覆盖WM_NCHITTEST 消息处理并为拖动区域返回HTCAPTION。下面将拖动窗口在上 30 像素内,例如:

    type
      TForm1 = class(TForm)
      private
      protected
        procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
      end;
    
    ..
    
    procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest);
    var
      Pt: TPoint;
    begin
      Pt := ScreenToClient(SmallPointToPoint(Message.Pos));
      if Pt.Y < 30 then
        Message.Result := HTCAPTION
      else
        inherited;
    end;
    

    【讨论】:

    • @David:最近,我对这种方法有点怀疑,因为基本上,您是在告诉操作系统 整个表单是窗口的标题,这可能实际上在语义上并不正确。 (嗯,在 Sertac 的代码中,也许前 30 个像素实际上是标题,但通常情况下,这可能不是真的。)
    • @andreas 你有什么具体的理由拒绝这个吗?有什么缺点?这是标准方法。
    • @David:不,我想不出具体的缺点。
    • 另一种方法是实现一个 OnMouseDown 处理程序,您可以在其中设置移动状态并存储鼠标向下位置,一个 OnMouseMove 处理程序用于移动表单,以及一个 OnMouseUp 处理程序,您可以在其中清除移动状态.这不是很多工作。例如,它的好处是让您在开始移动之前自己决定鼠标应该移动多少像素。这有时可能是可取的。
    • @Craig - 首先调用inherited,仅当它是“HTCLIENT”时才修改结果。或者修改您的干预区域以排除按钮。
    猜你喜欢
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多