![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать кнопку, которую можно двигать мышью? [D6, XP]
vegarulez © (2006-12-07 12:44:00)Привет всем мастерам!
У меня вопрос, как можно создать кнопку, при нажатии и удерживании мышью, чтоб она двигалась вместе с мышью. При отжатии чтоб принимала то положение в котором сечас находится.
Подскажите.
DVM (2006-12-08 10:24:00) [1]Еще через WM_NCHITTEST можно заставить двигаться.
Elen (2006-12-08 08:54:00) [2]
> Officeman
Например в [3] замени буттон на панель
Officeman (2006-12-08 08:40:00) [3]мм. подскажие пожалуйста. тотже самый вопрос.
только таскать надо TPanel по форме (захватив панель мышью)
заранее спасибо.
Gydvin (2006-12-07 15:27:00) [4]вай дот
Нажимаем контрол )))
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then begin
ReleaseCapture;
SendMessage(Button1.Handle, WM_SYSCOMMAND, 61458, 0);
end;
end;
конечно
Gydvin (2006-12-07 15:25:00) [5]Нажимаем контрол )))
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ssCtrl in Shift then
ReleaseCapture;
SendMessage(Button1.Handle, WM_SYSCOMMAND, 61458, 0);
end;
Loginov Dmitry (2006-12-07 14:41:00) [6]
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
Sc_dragmove = $F012;
begin
ReleaseCapture;
Button1.Perform(WM_SYSCOMMAND, Sc_dragmove, 0);
end;
Только с нажатием на саму кнопку - траблы :)
PZ (2006-12-07 13:36:00) [7]Вот совсем простой пример для перемещения Image. Наверно его можно приспособить для Button
Var
Move : Boolean;
X0, Y0 : Integer;
procedure TDominoFrm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
If Button <> mbLeft then exit;
X0 := X;
Y0 := Y;
Move := True;
end; { TDominoFrm.Image1MouseDown }
procedure TDominoFrm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
{ Одновременное изменение всех координат }
If Move then With (Sender as TControl).Parent do
With (Sender as TControl).Parent do
SetBounds(Left+X-X0, Top+Y-Y0, Width, Height);
end; { TDominoFrm.Image1MouseMove }
procedure TDominoFrm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Move := False;
end; { TDominoFrm.Image1MouseUp }
Elen (2006-12-07 13:20:00) [8]
> А можно маленький примерчик?
Маленький нет.
Есть средне-большой и на скорую руку :
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Button1: TButton;
procedure Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
procedure Label1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure Label1EndDock(Sender, Target: TObject; X, Y: Integer);
procedure Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseLeave(Sender: TObject);
private
{ Private declarations }
public ax,ay:integer;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Label1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
Button1.tag:=0;
end;
procedure TForm1.Label1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
var t:Tpoint;al:integer;
begin
t:=form1.ScreenToClient(Mouse.CursorPos);
caption:=tcomponent(sender).Name+'-'+ inttostr(al)+' '+inttostr(t.x-label1.tag);
Button1.Left:=t.x-Button1.tag;
ax:=x;ay:=y ;
end;
procedure TForm1.Label1EndDock(Sender, Target: TObject; X, Y: Integer);
begin
Button1.tag:=0;
end;
procedure TForm1.Label1EndDrag(Sender, Target: TObject; X, Y: Integer);
begin
Button1.tag:=0;
end;
procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Button1.Tag:=x;
end;
procedure TForm1.Label1MouseLeave(Sender: TObject);
var t:tpoint;
begin
if Button1.Dragging then begin
t.x:=ax;t.Y:=ay;
Mouse.CursorPos:=Button1.ClientToScreen(t);
end;
end;
end.
В нем есть подводные камни.
vegarulez (2006-12-07 13:15:00) [9]А можно маленький примерчик?
Я просто не совсем понимаю как туда координаты передать
procedure DragDrop(Source: TObject; X, Y: Integer);
Там же X,Y передавать нужно... а у мышки X,Y немного другие нежели у кнопки.
Elen (2006-12-07 12:58:00) [10]
> vegarulez
DragDrop!