Как передвинуть курсором форму приложения в Delphi
Есть приложение на Delphi, которое состоит и формы (TForm) и текстового поля на ней (TLabel), такой вопрос, как кликнуть курсором по форме и держать правую кнопку мыши, что бы можно было двигать форму приложения по экрану?
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
const int SC_DRAGMOVE=61458;//0xF012;
((TForm *)Sender)->Perform(WM_SYSCOMMAND,SC_DRAGMOVE,0);
}
это из билдера . под дельфи сам адаптируешь .
Код:
procedure TmainForm.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
SC_DRAGMOVE = 61458;
begin
mainForm.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
Y: Integer);
const
SC_DRAGMOVE = 61458;
begin
mainForm.Perform(WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
Проверял в С++ Builder 2010
И то что автор утверждает что у него не работает не является его криворукостью.
Проверял в Delphi 2010 под Win 7.
Я добился перемещения окна вот таким кривым способом:
Код:
var
Form1: TForm1;
FormPoint: TPOINT;
implementation
{$R *.dfm}
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FormPoint.X := X; // Сохраняем Х координату внутри формы в момент нажатия
FormPoint.Y := Y;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
DescPoint: TPOINT;
begin
GetCursorPos(DescPoint);
if ssRight in Shift then
begin
Form1.Left := DescPoint.X - FormPoint.X - (Width - ClientWidth);
Form1.Top := DescPoint.Y - FormPoint.Y - (Height - ClientHeight);
end;
end;
Form1: TForm1;
FormPoint: TPOINT;
implementation
{$R *.dfm}
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FormPoint.X := X; // Сохраняем Х координату внутри формы в момент нажатия
FormPoint.Y := Y;
end;
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
DescPoint: TPOINT;
begin
GetCursorPos(DescPoint);
if ssRight in Shift then
begin
Form1.Left := DescPoint.X - FormPoint.X - (Width - ClientWidth);
Form1.Top := DescPoint.Y - FormPoint.Y - (Height - ClientHeight);
end;
end;
Если кто знает поделитесь как система перемещает окно когда его цепляешь левой кнопкой за заголовок.
Кстати, тоже интересно, как можно двигать форму левой кнопкой мыши.
Но в любом случае артефактов до х...
Форма оставляет за собой следы, и выше уже писал про быстрое движение.
Когда цепляешь левой кнопкой мыши форма ездит при любой скорости перемещения и не "отваливается" от мышки.
Вроде работает.
Код:
type
private
FDiffX, FDiffY: Integer;
var
Form10: TForm10;
implementation
procedure TForm10.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDiffX := X;
FDiffY := Y;
end;
procedure TForm10.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssRight in Shift then
begin
TForm(Sender).Left := Mouse.CursorPos.X - FDiffX;
TForm(Sender).Top := Mouse.CursorPos.Y - FDiffY;
end;
end;
private
FDiffX, FDiffY: Integer;
var
Form10: TForm10;
implementation
procedure TForm10.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FDiffX := X;
FDiffY := Y;
end;
procedure TForm10.FormMouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
begin
if ssRight in Shift then
begin
TForm(Sender).Left := Mouse.CursorPos.X - FDiffX;
TForm(Sender).Top := Mouse.CursorPos.Y - FDiffY;
end;
end;
Только эфект тот же. И курсор при захвате формы смещается вверх.
PS: QWERYTY, уважаемый
Вычислений меньше, я юзаю Mouse. Ну а вверьх прыгает на толщину бордюра формы. Его можно посчитать. Хотя, если есть нужда двигать форму правой кнопкой, догадываюсь там нет бордюра (BorderStyle = bsNone).
http://forum.vingrad.ru/topic-174737.html
Работает при нажатой левой клавише:
Нашел намек на
Работает при нажатой левой клавише:
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
const
SC_DRAGMOVE = 61458;
begin
ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
Y: Integer);
const
SC_DRAGMOVE = 61458;
begin
ReleaseCapture();
SendMessage(Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
end;
В ТЗ написано чтобы правой двигать...
Осталось понять как заточить под правую кнопку.
PS:
Вот хрень. В чужих процессах запрещал перемещение окон, а тут в своём не могу передвинуть )))
У ТС также написано:
Цитата: sadovoya
Ну разумеется это интересно в контексте понять механизм, и переделать под правую )))
Изначально очевидно планировалось правой.
Нет, я читать не разучился. В ТЗ написано только про правую:
Менять назначения кнопок можно ф-цией SwapMouseButton.