Jika Anda mengembangkan aplikasi grafis atau multimedia, Anda mungkin bertanya-tanya bagaimana cara memindahkan formulir tanpa menggunakan bilah judulnya. Faktanya, Anda hanya perlu menyeret area klien formulir dengan mouse.
Metode satu
Berikut ini adalah cara paling umum untuk menyelesaikan fungsi di atas: tambahkan pernyataan prosedur berikut di bagian pernyataan PRIvate pada formulir:
prosedur WMNCHitTest(var Msg:TWMNCHitTest);pesan WM_NCHITTEST;
Kemudian tambahkan kode berikut di bagian implementasi:
procedure TForm1{atau nama Formulir yang Anda tetapkan}.WMNCHitTest(var Msg:TWMNCHitTest);
mulai
DefaultHandler(Pesan);
jika Msg.Result = HTCLIENT maka
Pesan Hasil: = HTCAPTION;
akhir;
Metode ini membuat Windows berpikir bahwa bilah judul telah diklik ketika mouse mengklik area klien formulir.
Metode dua
Berikut cara lain untuk memindahkan bentuk normal dengan mouse.
prosedur TForm1.FormMouseMove(Pengirim: TObject; Shift: TShiftState; X, Y: Integer);
mulai
if (ssLeft di Shift) lalu mulai
RilisCapture;
Kirim Pesan(Form1.Handle,WM_SYSCOMMAND,SC_MOVE+1,0);
akhir;
akhir;
Ketidaksempurnaan metode di atas
Mari kita lihat apa yang terjadi jika Anda menghapus centang pada opsi "Tampilkan konten jendela sambil menyeret". Ini adalah pengaturan untuk Windows windows. Anda dapat menemukan properti ini di "Start Menu --> Settings --> Folder Options --> View --> Advanced Settings". Di Windows95, Anda perlu mengubah registri. Jika properti ini disetel ke tidak valid, formulir akan berubah menjadi garis persegi saat diseret. Mungkin Anda menggunakan bentuk yang tidak beraturan, namun tetap memperlihatkan garis tepi.
Saat Anda ingin formulir Anda ditambatkan di tepi layar (misalnya: WinAmp, saat Anda menyeret formulir ke posisi tertentu di bagian atas layar, formulir akan berada di dekat bagian atas layar), jika Anda menggunakan langkah kedua di atas Dengan cara ini, Anda tidak akan dapat menangani posisi formulir sampai tombol mouse dilepaskan, dan Anda tidak akan dapat menangani masalah docking.
Di bawah ini saya akan menggunakan metode sederhana untuk menyelesaikan dua masalah:
Pertama, apa pun pengaturannya, kerangka tidak akan ditampilkan saat menyeret formulir;
Kedua, deteksi posisi dilakukan ketika formulir dipindahkan, dan dipasang di lokasi tertentu jika posisinya sesuai.
Banyak orang mungkin telah memecahkan masalah ini, tapi mungkin kode di bawah ini dapat membantu Anda.
Metode ketiga
Kode berikut dapat disalin langsung ke Delphi, asalkan Anda menyimpan Form1 sebagai uMain.pas dan Form2 sebagai uDock.pas. Event yang digunakan adalah: OnMouseDown, OnMouseMove, OnMouseUp, OnShow (Form1).
Ini adalah metode untuk memindahkan form berdasarkan gerakan mouse, termasuk dua form, uMain dan uDock (Form1 dan Form2). Form2 dibuka melalui Form1 dan dapat dipasang ke bagian bawah Form1. Setelah digandeng, Form2 akan berpindah bersama Form1 hingga Anda menyingkirkan Form2.
Formulir1
satuan uUtama;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog;
jenis
TForm1 = kelas(TForm)
prosedur FormMouseDown(Pengirim:TObject; Tombol:TMouseButton;Shift:TShiftState;X,Y: Integer);
procedure FormMouseMove(Pengirim: TObject; Shift: TShiftState;X,Y: Integer);
procedure FormMouseUp(Pengirim:TObject;Button:TMouseButton;Shift:TShiftState;X,Y: Integer);
prosedur FormShow(Pengirim: TObject);
pribadi
{Deklarasi pribadi}
publik
DocktoForm: Boolean;
{Pernyataan publik}
akhir;
var
Formulir1: TForm1;
CanMove, CanMoveX, CanMoveY: Boolean;
OldX, OldY: Integer;
F1X,F1Y,F2X,F2Y: bilangan bulat;
Area Kerja : TRect;
pelaksanaan
menggunakan uDock;
{$R *.DFM}
procedure TForm1.FormMouseDown(Pengirim: TObject; Tombol: TMouseButton;Shift: TShiftState; X, Y: Integer);
mulai
CanMoveX := benar;
CanMoveY := benar;
Bisa Bergerak := benar;
X Lama := X;
TuaY := Y;
jikaDocktoForm lalu
mulai
F1X := Bentuk1.Kiri;
F1Y := Bentuk1.Atas;
F2X := Bentuk2.Kiri;
F2Y := Bentuk2.Atas;
akhir;
akhir;
prosedur TForm1.FormMouseMove(Pengirim: TObject; Shift: TShiftState; X, Y: Integer);
mulai
jika (CanMove) maka
mulai
jika CanMoveX maka
Bentuk1.Kiri := Bentuk1.Kiri + (X - LamaX);
jika CanMoveY maka
Form1.Top := Form1.Top + (Y - LamaY);
//Bagian ini terkunci ke atas
jika (Form1.Top < WorkArea.Top + 10) dan (Form1.Top > WorkArea.Top-10) maka
mulai
Form1.Top := Area Kerja.Top;
jika (Y-LamaY > 10) atau (Y-LamaY < -10) maka
CanMoveY := benar
kalau tidak
CanMoveY := Salah;
akhir;
//Bagian ini menempel di sisi kiri
jika (Form1.Left < WorkArea.Left+10) dan (Form1.Left > WoskArea.Left-10) maka
mulai
Form1.Kiri := Area Kerja.Kiri;
jika (X-LamaX > 10) atau (X-LamaX < -10) maka
CanMoveX := benar
kalau tidak
CanMoveX := Salah;
akhir;
//Bagian ini terkunci ke sisi kanan
jika (Form1.Left > WorkArea.Right-Form1.Width-10) dan (Form1.Left < WorkArea.Right-Form1.Width+10) maka
mulai
Form1.Left := Area Kerja.Kanan-Form1.Lebar;
jika (X-LamaX > 10) atau (X-LamaX < -10) maka
CanMoveX := benar
kalau tidak
CanMoveX := Salah;
akhir;
//Bagian ini terkait dengan TaskBar
jikaDocktoForm lalu
mulai
jika (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) dan (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10) maka
mulai
Bentuk1.Atas := Area Kerja.Bentuk-Bawah1.Tinggi-Bentuk2.Tinggi;
jika (Y-LamaY > 10) atau (Y-LamaY < -10) maka
CanMoveY := benar
kalau tidak
CanMoveY := Salah;
akhir;
akhir
yang lain dimulai
jika (Form1.Top > WorkArea.Bottom-Form1.Height-10) dan (Form1.Top < WorkArea.Bottom-Form1.Height+10) maka
mulai
Form1.Top := Area Kerja.Bottom-Form1.Height;
jika (Y-LamaY > 10) atau (Y-LamaY < -10) maka
CanMoveY := benar
kalau tidak
CanMoveY := Salah;
akhir;
akhir;
jikaDocktoForm lalu
mulai
Bentuk2.Kiri := Bentuk1.Kiri - (F1X-F2X);// + (X-LamaX);
Bentuk2.Atas := Bentuk1.Atas+Bentuk1.Tinggi;
KELUAR;
akhir;
//Bagian ini mengunci playlist di tengah Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) dan (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Lebar div 2))+10) dan
(Form2.Top > Form1.Top+Form1.Height-10) dan (Form2.Top < Form1.Top+Form1.Height+10) lalu
mulai
Bentuk2.Kiri := Bentuk1.Kiri + ((Bentuk1.Lebar div 2)-(Bentuk2.Lebar div 2));
DocktoForm := Benar;
F1X := Bentuk1.Kiri;
F1Y := Bentuk1.Atas;
F2X := Bentuk2.Kiri;
F2Y := Bentuk2.Atas;
akhir;
akhir;
akhir;
procedure TForm1.FormMouseUp(Pengirim: TObject; Tombol: TMouseButton; Shift: TShiftState; X, Y: Integer);
mulai
Bisa Bergerak := salah;
akhir;
prosedur TForm1.FormShow(Pengirim: TObject);
mulai
//Dapatkan Parameter Area Kerja
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkArea, 0);
Formulir2.Tampilkan;
akhir;
akhir.
Formulir2
satuan uDock;
antarmuka
kegunaan
Windows, Pesan, SysUtils, Kelas, Grafik, Kontrol, Formulir, Dialog;
jenis
TForm2 = kelas(TForm)
procedure FormMouseDown(Pengirim: TObject; Tombol: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Pengirim: TObject; Shift: TShiftState; X,Y: Integer);
procedure FormMouseUp(Pengirim: TObject; Tombol: TMouseButton;Shift: TShiftState; X, Y: Integer);
pribadi
{Deklarasi pribadi}
publik
{Pernyataan publik}
akhir;
var
Formulir2: TForm2;
CanMove, CanMoveX, CanMoveY, DocktoForm: Boolean;
OldX, OldY: Integer;
pelaksanaan
menggunakan uUtama;
{$R *.DFM}
procedure TForm2.FormMouseDown(Pengirim: TObject; Tombol: TMouseButton;Shift: TShiftState; X, Y: Integer);
mulai
CanMoveX := benar;
CanMoveY := benar;
Bisa Bergerak := benar;
X Lama := X;
TuaY := Y;
akhir;
prosedur TForm2.FormMouseMove(Pengirim: TObject; Shift: TShiftState; X, Y: Integer);
mulai
jika (CanMove) maka
mulai
jika CanMoveX maka
Bentuk2.Kiri := Bentuk2.Kiri + (X - LamaX);
jika CanMoveY maka
Form2.Top := Form2.Top + (Y - LamaY);
//Bagian ini terkunci ke atas
jika (Form2.Top < WorkArea.Top + 10) dan (Form2.Top > WorkArea.Top-10) maka
mulai
Form2.Top := Area Kerja.Top;
jika (Y-LamaY > 10) atau (Y-LamaY < -10) maka
CanMoveY := benar
kalau tidak
CanMoveY := Salah;
akhir;
//Bagian ini menempel di sisi kiri
jika (Form2.Left < WorkArea.Left+10) dan (Form2.Left > WorkArea.Left-10) maka
mulai
Form2.Kiri := Area Kerja.Kiri;
jika (X-LamaX > 10) atau (X-LamaX < -10) maka
CanMoveX := benar
kalau tidak
CanMoveX := Salah;
akhir;
//Bagian ini terkunci ke sisi kanan
jika (Form2.Left > WorkArea.Right-Form2.Width-10) dan (Form2.Left < WorkArea.Right-Form2.Width+10) maka
mulai
Form2.Kiri := Area Kerja.Kanan-Form2.Lebar;
jika (X-LamaX > 10) atau (X-LamaX < -10) maka
CanMoveX := benar
kalau tidak
CanMoveX := Salah;
akhir;
//Bagian ini terkait dengan TaskBar
jika (Form2.Top > WorkArea.Bottom-Form2.Height-10) dan (Form2.Top < WorkArea.Bottom-Form2.Height+10) maka
mulai
Form2.Top := Area Kerja.Bottom-Form2.Height;
jika (Y-LamaY > 10) atau (Y-LamaY < -10) maka
CanMoveY := benar
kalau tidak
CanMoveY := Salah;
KELUAR;
akhir;
//Bagian ini terhubung ke Player Bottom
jika (Form2.Top > Form1.Top+Form1.Height-10) dan (Form2.Top < Form1.Top+Form1.Height+10) dan (Form2.Left > Form1.Left-Form2.Width) dan (Form2. Kiri < Form1.Left + Form1.Width) lalu
mulai
Bentuk2.Atas := Bentuk1.Atas+Bentuk1.Tinggi;
jika (Y-OldY > 10) atau (Y-OldY < -10) maka mulailah
CanMoveY := benar;
Form1.DockToForm := Salah;
akhir
yang lain dimulai
CanMoveY := Salah;
Form1.DockToForm := Benar;
akhir;
akhir;
//Bagian ini mengunci playlist di tengah Form1
if (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) dan (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.Lebar div 2))+10) dan
(Form2.Top > Form1.Top+Form1.Height-10) dan (Form2.Top < Form1.Top+Form1.Height+10) lalu
mulai
Bentuk2.Kiri := Bentuk1.Kiri + ((Bentuk1.Lebar div 2)-(Bentuk2.Lebar div 2));
jika (X-LamaX > 10) atau (X-LamaX < -10) atau (Y-LamaY > 10) atau (Y-LamaY < -10) maka
CanMoveX := benar
kalau tidak
CanMoveX := Salah;
akhir;
akhir;
akhir;
procedure TForm2.FormMouseUp(Pengirim: TObject; Tombol: TMouseButton;Shift: TShiftState; X, Y: Integer);
mulai
Bisa Bergerak := salah;
akhir;
akhir.
Saya harap hal di atas bermanfaat bagi mereka yang berjuang dengan konten serupa.