一个无标题窗口,上面有一个panel组件,如何实现拖动这个panel组件来移动窗口?以及当panel组件对齐方式为client时,如何实现改变窗体的大小?

解决方案 »

  1.   

    不用API倒是好解决,直接用API,不会,也相信会很麻烦,要拦截系统消息
      

  2.   

    Unit Main;InterfaceUses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;Type
      TForm1 = Class(TForm)
        Procedure OnDragFrm(Var Msg: TMessage); Message WM_NCHitTest;  
     //定义一个消息处理,WM_NCHitTest这个消息是用于移动窗口的事件的  Private
        { Private declarations }
      Public
        { Public declarations }
      End;Var
      Form1: TForm1;Implementation{$R *.dfm}Procedure TForm1.OnDragFrm(Var Msg: TMessage);
    Begin
      Inherited;
      If msg.Result = htClient Then
        msg.Result := htCaption;
    End;End.
      

  3.   

    wm_nchittest的意思是在鼠标移动或者点击时,向鼠标所在窗口发送的消息。  If msg.Result = htClient Then
        msg.Result := htCaption;
    的意思是你点击在客户区相当于点击标题栏。去查SDK改变窗体大小去用wm_size消息
      

  4.   

    几位的方法都是在没有放置client对齐方式的控件时可以解决这种问题,但在放置了clint对齐方式的控件后就不可以实现了。这个我试过了,这也是我指明放一个client对齐方式的panel的原因。
    不知道还有没有其它的方法可以解决。
      

  5.   

    那你有没有使过当panel收到消息的时候能不能把这个消息传递给from
      

  6.   

    在Panel的OnMouseMove事件中加入:
      ReleaseCapture;
      Perform(WM_SYSCOMMAND, $F012, 0);
      

  7.   

    在Panel的OnMouseDown事件中加入:
      ReleaseCapture;
      Perform(WM_SYSCOMMAND, $F012, 0);
      

  8.   

    xzhifei(飞) 老兄的方法我回云试。这好像是改移动的吧!
    如果能更详细一些就更好了。