Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перемещение формы правой кнопкой (Delphi) не за заголовок

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

cheaterBY

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  X1,Y1 : integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  X1:=X;
  Y1:=Y;
end;
 
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (Shift=[ssLeft]) or (Shift=[ssRight]) then
  begin
    Form1.Left := Form1.Left + X - X1;
    Form1.Top := Form1.Top + Y - Y1;
  end;
end;
 
end.
 
 
При перемещении левой кнопкой - всё нормально, а при перемещении правой при резких движения мышь опережает форму. Хотелось бы узнать как это можно нормально реализовать.  

Всего записей: 30 | Зарегистр. 18-08-2006 | Отправлено: 10:34 01-09-2006
dyr farot

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
http://www.izone.kiev.ua/articles/delphi/16/289.htm
(последняя часть)

Всего записей: 697 | Зарегистр. 03-08-2004 | Отправлено: 12:09 01-09-2006
cheaterBY

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
  inherited; // вызов унаследованного обработчика
  if M.Result = htClient then // Мышь сидит на окне? Если да
  M.Result := htCaption; // - то пусть Windows думает, что мышь на caption bar
end;
 
вот что я нашёл когда перешёл по указанной ссылке, но в этом примере показано как сделать перетаскивание ЛЕВОЙ клавишей мыши, а мне нужно ПРАВОЙ

Всего записей: 30 | Зарегистр. 18-08-2006 | Отправлено: 13:38 01-09-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cheaterBY
Только что проверил код, отлично работает как при правой кнопке, так и при левой. Все двигается аналогично, дергал мышью очень сильно. Возможно у тебя на форме есть какие то контролы, тогда да, правая кнопка может не корректно обрабатываться.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:13 04-09-2006
cheaterBY

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я сам уже допёр, вот как я это реализовал
 
Создал вот такие переменные:
 
dwXPos, dwYPos: Integer;
  bCanMoveWindow : boolean;
 
вот такую функцию:
 
procedure MoveWindow(dwWindowHandle: DWORD);stdcall;
var p: TPoint;
begin
  while bCanMoveWindow do
  begin
     GetCursorPos(p);
     SetWindowPos(dwWindowHandle, 0, p.X-dwXPos, p.Y-dwYPos, 0,0, SWP_NOSIZE+SWP_NOZORDER);
  end;
end;
 
в OnMouseDown вот ето
 
if Button = mbRight then
  begin
    bCanMoveWindow := True;
    dwXpos:=X;
    dwYPos:=Y;
    CloseHandle(CreateThread(nil, 0, @MoveWindow, Pointer(Handle), 0, dwThreadId));
  end;
 
а в OnMouseUp вот ето
 
  bCanMoveWindow := false;
 
и всё работает как в лучших домах парижа.
 
Добавлено:
З.Ы.
 
то ShIvADeSt
Да и кстати на счёт первого примера
вот исходник, и обясни мне чего он не работает с правой клавишей мыши?
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
  private
 
    { Private declarations }
  public
    { Public declarations }
      procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHITTEST;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then
  M.Result := htCaption;
end;
 
end.

Всего записей: 30 | Зарегистр. 18-08-2006 | Отправлено: 15:17 04-09-2006 | Исправлено: cheaterBY, 15:25 04-09-2006
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
cheaterBY

Цитата:
вот исходник, и обясни мне чего он не работает с правой клавишей мыши?

Потому что данная мессага летит только по нажатию левой кнопки мыши, если надо правую то обрабатывать надо другие события, в любом случае - это бредовое решение, после него перестают обрабатываться нажатия на всякие спидбаттоны и другие контролы, которые являются наследниками рисованных контролов.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:53 05-09-2006
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Перемещение формы правой кнопкой (Delphi) не за заголовок


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru