Если вы разрабатываете графические или мультимедийные приложения, вам может быть интересно, как переместить форму, не используя строку заголовка. По сути, вам нужно всего лишь перетащить мышкой клиентскую область формы.
Способ первый
Ниже приведен наиболее распространенный способ выполнения вышеуказанной функции: добавьте следующий оператор процедуры в раздел инструкции PRivate формы:
процедура WMNCHitTest (var Msg: TWMNCHitTest); сообщение WM_NCHITTEST;
Затем добавьте следующий код в раздел реализации:
процедура TForm1{или заданное вами имя формы}.WMNCHitTest(var Msg:TWMNCHitTest);
начинать
DefaultHandler(Сообщение);
если Msg.Result = HTCLIENT, то
Msg.Result:= HTCAPTION;
конец;
Этот метод заставляет Windows думать, что был сделан щелчок по строке заголовка, когда мышкой щелкают по клиентской области формы.
Способ второй
Вот еще один способ перемещения обычной формы с помощью мыши.
процедура TForm1.FormMouseMove(Отправитель: TObject; Shift: TShiftState; X, Y: Integer);
начинать
если (ssLeft в Shift), то начнем
РелизКаптуре;
SendMessage(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
конец;
конец;
Недостатки вышеперечисленных методов
Давайте посмотрим, что произойдет, если отключить опцию «Показывать содержимое окна при перетаскивании». Это настройка для окон Windows. Это свойство можно найти в «Меню «Пуск» -> «Настройки» -> «Параметры папки» -> «Вид» -> «Дополнительные настройки». В Windows95 вам необходимо изменить реестр. Если для этого свойства установлено значение «недопустимое», при перетаскивании форма изменится на квадратный контур. Возможно, вы используете неправильную форму, но контуры все равно видны.
Если вы хотите, чтобы ваша форма была закреплена на краю экрана (например: WinAmp, когда вы перетаскиваете форму в определенное положение в верхней части экрана, форма будет расположена близко к верхней части экрана), если вы используете второй шаг, описанный выше. Таким образом, вы не сможете обрабатывать положение формы, пока не будет отпущена кнопка мыши, и вы не сможете решать проблемы со стыковкой.
Ниже я буду использовать простые методы для решения двух задач:
Во-первых, независимо от настроек, контур не будет отображаться при перетаскивании формы;
Во-вторых, определение положения выполняется при перемещении формы и закрепляется в определенном месте, когда это положение является подходящим.
Многие люди, возможно, решили эти проблемы, но, возможно, приведенный ниже код поможет вам.
Способ третий
Следующий код можно скопировать непосредственно в Delphi при условии, что вы сохраните Form1 как uMain.pas, а Form2 — как uDock.pas. Используемые события: OnMouseDown, OnMouseMove, OnMouseUp, OnShow (Form1).
Это метод перемещения формы на основе движения мыши, включая две формы: uMain и uDock (Form1 и Form2). Форма2 открывается через Форму1 и может быть прикреплена к нижней части Формы1. После закрепления Form2 будет перемещаться вместе с Form1, пока вы не уберете Form2 с дороги.
Форма1
блок uMain;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги;
тип
ТФорм1 = класс (ТФорма)
процедура FormMouseDown(Sender:TObject; Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
процедура FormMouseMove (Отправитель: TObject; Shift: TShiftState; X, Y: Integer);
процедура FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
процедура FormShow (Отправитель: TObject);
частный
{Частные заявления}
общественный
DocktoForm: логическое значение;
{Публичные заявления}
конец;
вар
Форма1: ТФорм1;
CanMove, CanMoveX, CanMoveY: логическое значение;
OldX, OldY: целое число;
F1X,F1Y,F2X,F2Y: целое число;
Рабочая область: TRect;
выполнение
использует uDock;
{$R *.DFM}
процедура TForm1.FormMouseDown(Отправитель: TObject; Кнопка: TMouseButton;Shift: TShiftState; X, Y: Integer);
начинать
CanMoveX := правда;
CanMoveY := правда;
CanMove := правда;
СтарыйX := X;
СтарыйY := Y;
еслиDocktoForm тогда
начинать
F1X := Форма1.Влево;
F1Y := Форма1.Верх;
F2X := Форма2.Влево;
F2Y := Форма2.Верх;
конец;
конец;
процедура TForm1.FormMouseMove(Отправитель: TObject; Shift: TShiftState; X, Y: Integer);
начинать
если (CanMove), то
начинать
если CanMoveX, то
Форма1.Влево := Форма1.Влево + (X - OldX);
если CanMoveY, то
Форма1.Верх := Форма1.Верх + (Y - OldY);
//Этот раздел фиксируется вверху
если (Form1.Top < WorkArea.Top + 10) и (Form1.Top > WorkArea.Top-10), то
начинать
Форма1.Верх := РабочаяОбласть.Верх;
если (Y-OldY > 10) или (Y-OldY < -10), то
CanMoveY := true
еще
CanMoveY := Ложь;
конец;
//Этот раздел фиксируется слева
если (Form1.Left < WorkArea.Left+10) и (Form1.Left > WoskArea.Left-10), то
начинать
Форма1.Влево := РабочаяОбласть.Влево;
если (X-OldX > 10) или (X-OldX < -10), то
CanMoveX := правда
еще
CanMoveX := Ложь;
конец;
//Этот раздел фиксируется с правой стороны
если (Form1.Left > WorkArea.Right-Form1.Width-10) и (Form1.Left < WorkArea.Right-Form1.Width+10), то
начинать
Форма1.Влево := РабочаяОбласть.Вправо-Форма1.Ширина;
если (X-OldX > 10) или (X-OldX < -10), то
CanMoveX := правда
еще
CanMoveX := Ложь;
конец;
//Этот раздел фиксируется на панели задач
еслиDocktoForm тогда
начинать
если (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) и (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10), то
начинать
Форма1.Верх := РабочаяОбласть.Низ-Форма1.Высота-Форма2.Высота;
если (Y-OldY > 10) или (Y-OldY < -10), то
CanMoveY := true
еще
CanMoveY := Ложь;
конец;
конец
еще начать
если (Form1.Top > WorkArea.Bottom-Form1.Height-10) и (Form1.Top < WorkArea.Bottom-Form1.Height+10), то
начинать
Форма1.Верх:= РабочаяОбласть.Низ-Форма1.Высота;
если (Y-OldY > 10) или (Y-OldY < -10), то
CanMoveY := true
еще
CanMoveY := Ложь;
конец;
конец;
еслиDocktoForm тогда
начинать
Форма2.Влево := Форма1.Влево - (F1X-F2X);// + (X-OldX);
Форма2.Верх := Форма1.Верх+Форма1.Высота;
Выход;
конец;
//Этот раздел фиксирует список воспроизведения в центре Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) и (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) и
(Form2.Top > Form1.Top+Form1.Height-10) и (Form2.Top < Form1.Top+Form1.Height+10), затем
начинать
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
ДоктоФорм := Истина;
F1X := Форма1.Влево;
F1Y := Форма1.Верх;
F2X := Форма2.Влево;
F2Y := Форма2.Верх;
конец;
конец;
конец;
процедура TForm1.FormMouseUp(Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: Integer);
начинать
CanMove := ложь;
конец;
процедура TForm1.FormShow(Отправитель: TObject);
начинать
//Получить параметры рабочей области
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
Форма2.Показать;
конец;
конец.
Форма2
блок uDock;
интерфейс
использует
Windows, сообщения, SysUtils, классы, графика, элементы управления, формы, диалоги;
тип
TForm2 = класс (TForm)
процедура FormMouseDown (Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: Integer);
процедура FormMouseMove (Отправитель: TObject; Shift: TShiftState; X, Y: Integer);
процедура FormMouseUp (Отправитель: TObject; Кнопка: TMouseButton; Shift: TShiftState; X, Y: Integer);
частный
{Частные заявления}
общественный
{Публичные заявления}
конец;
вар
Форма2: ТФорм2;
CanMove, CanMoveX, CanMoveY, DocktoForm: логическое значение;
OldX, OldY: целое число;
выполнение
использует uMain;
{$R *.DFM}
процедура TForm2.FormMouseDown(Отправитель: TObject; Кнопка: TMouseButton;Shift: TShiftState; X, Y: Integer);
начинать
CanMoveX := правда;
CanMoveY := правда;
CanMove := правда;
СтарыйX := X;
СтарыйY := Y;
конец;
процедура TForm2.FormMouseMove(Отправитель: TObject; Shift: TShiftState; X, Y: Integer);
начинать
если (CanMove), то
начинать
если CanMoveX, то
Форма2.Влево := Форма2.Влево + (X - OldX);
если CanMoveY, то
Форма2.Верх := Форма2.Верх + (Y - OldY);
//Этот раздел фиксируется вверху
если (Form2.Top < WorkArea.Top + 10) и (Form2.Top > WorkArea.Top-10), то
начинать
Форма2.Верх := РабочаяОбласть.Верх;
если (Y-OldY > 10) или (Y-OldY < -10), то
CanMoveY := true
еще
CanMoveY := Ложь;
конец;
//Этот раздел фиксируется слева
если (Form2.Left < WorkArea.Left+10) и (Form2.Left > WorkArea.Left-10), то
начинать
Форма2.Влево := РабочаяОбласть.Влево;
если (X-OldX > 10) или (X-OldX < -10), то
CanMoveX := правда
еще
CanMoveX := Ложь;
конец;
//Этот раздел фиксируется с правой стороны
если (Form2.Left > WorkArea.Right-Form2.Width-10) и (Form2.Left < WorkArea.Right-Form2.Width+10), то
начинать
Форма2.Влево := РабочаяОбласть.Вправо-Форма2.Ширина;
если (X-OldX > 10) или (X-OldX < -10), то
CanMoveX := правда
еще
CanMoveX := Ложь;
конец;
//Этот раздел фиксируется на панели задач
если (Form2.Top > WorkArea.Bottom-Form2.Height-10) и (Form2.Top < WorkArea.Bottom-Form2.Height+10), то
начинать
Форма2.Верх:= РабочаяОбласть.Низ-Форма2.Высота;
если (Y-OldY > 10) или (Y-OldY < -10), то
CanMoveY := true
еще
CanMoveY := Ложь;
Выход;
конец;
//Этот раздел фиксируется в нижней части проигрывателя
if (Form2.Top > Form1.Top+Form1.Height-10) и (Form2.Top < Form1.Top+Form1.Height+10) и (Form2.Left > Form1.Left-Form2.Width) и (Form2. Влево < Форма1.Влево + Форма1.Ширина), затем
начинать
Форма2.Верх := Форма1.Верх+Форма1.Высота;
если (Y-OldY > 10) или (Y-OldY < -10), то начать
CanMoveY := правда;
Form1.DockToForm := Ложь;
конец
еще начать
CanMoveY := Ложь;
Form1.DockToForm := Истина;
конец;
конец;
//Этот раздел фиксирует список воспроизведения в центре Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) и (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Width div 2))+10) и
(Форма2.Верх > Форма1.Верх+Форма1.Высота-10) и (Форма2.Верх < Форма1.Верх+Форма1.Высота+10), затем
начинать
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
если (X-OldX > 10) или (X-OldX < -10) или (Y-OldY > 10) или (Y-OldY < -10), то
CanMoveX := правда
еще
CanMoveX := Ложь;
конец;
конец;
конец;
процедура TForm2.FormMouseUp(Отправитель: TObject; Кнопка: TMouseButton;Shift: TShiftState; X, Y: Integer);
начинать
CanMove := ложь;
конец;
конец.
Я надеюсь, что вышеизложенное будет полезно тем, кто борется с подобным контентом.