Apakah ada cara untuk membuat formulir yang tidak memiliki batas (FormBorderStyle disetel ke "none") dapat dipindahkan saat mouse diklik di formulir seperti jika ada batas?
109
Ini artikel tentang CodeProject Rincian teknik. Pada dasarnya intinya adalah:
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern bool ReleaseCapture();
private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
Ini pada dasarnya melakukan hal yang sama persis dengan mengambil bilah judul jendela, dari sudut pandang pengelola jendela.
Form1_MouseDown
tidak ditetapkan keMouseDown
acara sebenarnyaForm1
.this.MouseDown += ...
keMain()
fungsi untuk formulirJangan membuat segalanya lebih sulit dari yang mereka butuhkan. Saya telah menemukan begitu banyak potongan kode yang memungkinkan Anda menyeret formulir (atau Kontrol lain). Dan banyak dari mereka memiliki kekurangan / efek sampingnya sendiri. Terutama yang saat mereka mengelabui Windows dengan berpikir bahwa Kontrol pada formulir adalah bentuk sebenarnya.
Karena itu, inilah cuplikan saya. Saya menggunakannya sepanjang waktu. Saya juga ingin mencatat bahwa Anda tidak boleh menggunakan this.Invalidate (); seperti yang suka dilakukan orang lain karena dalam beberapa kasus menyebabkan formulir berkedip. Dan dalam beberapa kasus, hal ini juga terjadi. Menggunakan this.Update, saya tidak mengalami masalah berkedip:
sumber
Cara lain yang lebih sederhana untuk melakukan hal yang sama.
sumber
gunakan MouseDown, MouseMove dan MouseUp. Anda dapat mengatur bendera variabel untuk itu. Saya punya sampel, tapi menurut saya Anda perlu merevisi.
Saya mengkodekan tindakan mouse ke panel. Setelah Anda mengklik panel, formulir Anda akan ikut bergerak.
sumber
WPF saja
tidak memiliki kode yang tepat untuk ditangani, tetapi dalam proyek baru-baru ini saya pikir saya menggunakan acara MouseDown dan sederhananya ini:
Metode Window.DragMove (MSDN)
sumber
Ref. tautan video
Ini telah diuji dan mudah dimengerti.
sumber
WM_NCHITTEST
menyamar.Tidak ada properti yang dapat Anda balik untuk mewujudkannya secara ajaib. Lihatlah kejadian untuk formulir dan itu menjadi cukup sepele untuk menerapkan ini dengan menetapkan
this.Top
danthis.Left
. Secara khusus, Anda ingin melihatMouseDown
,MouseUp
danMouseMove
.sumber
ini bisa menyelesaikan masalahmu ....
sumber
https://social.msdn.microsoft.com/Forums/vstudio/en-US/d803d869-68e6-46ff-9ff1-fabf78d6393c/how-to-make-a-borderless-form-in-c?forum=csharpgeneral
Sedikit kode dari tautan di atas melakukan trik dalam kasus saya :)
sumber
Cara terbaik yang pernah saya temukan (dimodifikasi tentu saja)
Untuk menerapkan seret ke kontrol cukup masukkan ini setelah InitializeComponent ()
sumber
Itu berhasil untuk Aku.
sumber
Untuk .NET Framework 4,
Anda bisa menggunakan
this.DragMove()
untukMouseDown
acara komponen (mainLayout dalam contoh ini) yang Anda gunakan untuk menyeret.sumber
Cara termudah adalah:
Pertama buat label bernama label1. Buka acara label1> acara mouse> Label1_Mouse Pindah dan tulis ini:
sumber
Saya mencoba membuat bentuk jendela tanpa batas yang dapat dipindahkan yang berisi kontrol Host Elemen WPF dan kontrol Pengguna WPF.
Saya berakhir dengan panel tumpukan yang disebut StackPanel di kontrol pengguna WPF saya yang sepertinya hal logis untuk dicoba klik untuk bergerak. Mencoba kode junmats berhasil saat saya menggerakkan mouse perlahan, tetapi jika saya menggerakkan mouse lebih cepat, mouse akan keluar dari formulir dan formulir akan macet di suatu tempat di tengah gerakan.
Ini memperbaiki jawabannya untuk situasi saya menggunakan CaptureMouse dan ReleaseCaptureMouse dan sekarang mouse tidak bergerak dari formulir saat memindahkannya bahkan jika saya memindahkannya dengan cepat.
sumber
Karena beberapa jawaban tidak memungkinkan kontrol anak dapat diseret, saya telah membuat kelas pembantu kecil. Ini harus melewati formulir tingkat atas. Dapat dibuat lebih umum jika diinginkan.
sumber
Selain itu, jika Anda perlu DoubleClick dan membuat Formulir Anda lebih besar / lebih kecil, Anda dapat menggunakan Jawaban pertama, buat variabel int global, tambahkan 1 setiap kali pengguna mengklik komponen yang Anda gunakan untuk menyeret. Jika
variable == 2
kemudian buat formulir Anda lebih besar / lebih kecil. Juga gunakan timer untuk setiap setengah detik atau satu detik untuk membuatvariable = 0
;sumber
Menambahkan
MouseLeftButtonDown
event handler ke MainWindow berhasil untuk saya.Dalam fungsi acara yang dibuat secara otomatis, tambahkan kode di bawah ini:
sumber
Saya memperluas solusi dari jay_t55 dengan satu metode lagi
ToolStrip1_MouseLeave
yang menangani kejadian mouse bergerak cepat dan meninggalkan wilayah.sumber
Saya mencoba yang berikut dan presto changeo, jendela transparan saya tidak lagi membeku di tempatnya tetapi dapat dipindahkan !! (buang semua solusi kompleks lainnya di atas ...)
sumber
Formulir1 ():
new Moveable(control1, control2, control3);
Kelas:
sumber
sumber