如何在窗口上拖动一个label

解决方案 »

  1.   

    嘻嘻,请不要使用tlabel类,因为它没有handle,知道意思了吧,呵呵,你对它不能使用消息,你地明白??换一个控件吧,一样的效果,不一样的功能,呵呵。procedure TForm1.StaticText1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
    ReleaseCapture;
        form1.StaticText1.Perform(WM_SYSCOMMAND, $F012, 0);
    end;用statictext控件,,
    请结吧。祝:身体健康,分数和答案同样重要:)
      

  2.   

    嘻嘻,请不要使用tlabel类,因为它没有handle,知道意思了吧,呵呵,你对它不能使用消息,你地明白??换一个控件吧,一样的效果,不一样的功能,呵呵。procedure TForm1.StaticText1MouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
    ReleaseCapture;
        form1.StaticText1.Perform(WM_SYSCOMMAND, $F012, 0);
    end;用statictext控件,,
    请结吧。祝:身体健康,分数和答案同样重要:)
      

  3.   

    举例如下:创建一个 Panel,再创建一个Label,通过编程使控件 Lable 可以在 Panel 中被拖放到任意位置。以下是具体实现过程:
      1.首先做一下准备工作,运行Delphi3.0,进入集成开发环境,在 File 菜单中选择New Application 。
      2.在Form1中创建对象 Panel1,并在 Panel1 中创建另一对象 Label1。
      3.选中Label1,修改其下列属性的值: 
    属性 值
    Caption : 标签移动测试!
    Cursor : crHandPoint
    DragCursor : crDrag
    DragMode : dmAutomatic
      4.在程序的开头部分声明全局变量 x_panel,y_panel,x_label,y_label
      其中,x_panel,y_panel :鼠标在Panel1上的坐标。
      x_label,y_label :鼠标在label1上的坐标。
      注:这里分别获取在Panel1和Label1上的坐标是为了更精确地计算出Label1实际的移动距离。
      5.在Panel1的OnDragOver 和OnMouseMove 事件中添加如下代码:
      x_panel:=X;
      y_panel:=Y;
      注:该操作是获得 mouse 在Panel1上的坐标。
      6.在Label1的OnMouseMove 事件中添加如下代码:
      x_Labell:=X;
      y_Label1:=Y;
      注:该操作是获得 mouse 在Label1上的坐标。 
      7.在Label1的OnEndDrag 事件中添加如下代码:
      label1.left :=x_panel-x_label;
      label1.top :=y_panel-y_label; 
      说明:两者相减是为了求得 label1 实际的移动距离。 
      8.创建一个对象 Button1 ,并在其 OnClick 事件中添加如下代码:
      close; 用以关闭应用程序。
      好了,现在运行程序,测试一下结果。
      以下是程序源代码,在Delphi3.0、Windows95/98中测试通过。
    unit test_move;
    interface
    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls;
    type
    TForm1 = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
    State: TDragState; var Accept: Boolean);
    procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
    procedure Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
    private
    { Private declarations }
    public
    { Public declarations }
    x_panel,y_panel,x_label,y_label:integer;
    end;
    var
    Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    close;
    end;
    procedure FTorm1.Panel1MouseMove
    (Sender: TObject; Shift: TShiftState; 
    X,Y: Integer);
    begin
    x_panel:=X;
    y_panel:=Y;
    end;
    procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
    State: TDragState; var Accept: Boolean);
    begin
    x_panel:=X;
    y_panel:=Y;
    end;
    procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState;
    X,Y: Integer);
    begin
    x_label:=X;
    y_label:=Y;
    end;
    procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
    begin
    label1.left :=x_panel-x_label; 
    label1.top:=y_panel-y_label; 
    end;
    end.
      

  4.   

    var
      xpos,yPos : integer;
    procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      xPos := x;
      yPos := y;
    end;procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      if ssLeft in shift then
      begin
      Label1.Top := Label1.Top +y-ypos;
      Label1.Left := Label1.Left +x-xpos;
      end;
    end;
      

  5.   

    不用HANDLE也可以吧?
    先定义3个全局变量:
    ifdrag:boolean=false;
    mx,my:integer;procedure tform1.lable1onmousedown(...);
    begin
    mx:=x;my:=y;
    ifdrag:=true;
    end;procedure tform1.lable1onmousemove(...);
    begin
    if ifdrag then
    begin
    lable1.left:=lable1.left+(x-mx);
    lable1.top:=lable1.top+(y-my);
    end;
    end;procedure tform1.lable1onmouseup(...);
    begin
    ifdrag:=false;
    end;