2012-06-06 88 views
8

如何移动无边框样式?我试过在网上看,但没有。非常感谢。移动无边框样式

+0

可以是这里:http://delphi.about.com/od/windowsshellapi/a/dragnocaption.htm – philnext

+0

[C++生成器的重复:创建具有边框bsNone TForm的一个是可移动的但是可调整大小和](http://stackoverflow.com/questions/7178030/cbuilder-create-a-tform-with-borderstyle-bsnone-that-is-needed-movable) - 该代码是为C++ Builder,但它仍然是同样的VCL!切换到Delphi应该是微不足道的。 –

回答

16

可以拖动使用任何含有控制,包括自身的形式。

使用以下示例,您可以通过单击其画布并拖动来移动窗体。通过在面板的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; 
+0

谢谢,这段代码更好! –

13

如果您是指通过鼠标拖动窗口,则可以覆盖WM_NCHITTEST消息处理并返回HTCAPTION作为拖动区域。下面将上部30个像素内拖动窗口insance:

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; 
+4

+1这是做这件事的方式 –

+0

@David:最近我对这种方法有点怀疑,因为基本上,你告诉操作系统*整个窗体是窗口的标题*,实际上它可能不是实际的在语义上是真实的。 (好吧,在塞尔特克的代码中,也许前30个像素*实际上是标题,但通常情况下,这可能不是真的。) –

+0

@andreas你有什么具体的理由来拒绝这个吗?有什么缺点?这是标准方法。 –