none
C# Form Taşıma RRS feed

  • Soru

  • Merhabalar,

             Visual'da kendi Form tasarımımı yapmaktayım, bu nedenle formun FormBorderStyle özelliğini "None" olarak yaptım ve sağına,soluna,altına ve üstüne Panel kontrolü ekledim ve Dock özellikleriyle birlikte Formun çerçeve aşamasını bitirmiş oldum. Daha sonra Control boxlarıda halettim en son taşıma işlemine geldim fakat burada tıkandım. 

          Formun en üstüne Panel controlü eklemiştim ve Dock özelliğinide "TOP" yapmıştım fakat ben bu Panel kontrolü normal FORM larda olduğu gibi tutunca formu taşımak istiyorum. Panel control ile formun taşımasını nasıl yapabilirim ?

    Teşekkürler...


    28 Ocak 2017 Cumartesi 20:14

Yanıtlar

  • using System;
    using System.Drawing;
    using System.Windows.Forms;

    namespace DragBorderlessForm
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            //Aşağıdaki kısmı programa ilave edin:

            private const int HT_CAPTION = 0x2;
            private const int WM_NCLBUTTONDOWN = 0xA1;

            private void panel_MouseDown(object sender, MouseEventArgs e)
            {
                // Panel'e ya da Form'a gelen mouse hareketlerini yakalama (Capture = false).
                (sender as Control).Capture = false;
                // Sanki başlık çubuğu (Caption Bar) üzerinde sol mouse butonu tıklaması
                // başlamış gibi yap: 1) önce sahte mesajı oluştur.
                Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION,

                    IntPtr.Zero); 
                // 2) Sonra sahte mesajı uygulamanın WndProc() metoduna gönder.
                base.WndProc(ref msg);
            }
        }
    }

    Test ettim, çalışıyor, projeyi buradan indirebilirsiniz: Proje

    Form'u borderless yaptım ve iki tane Panel koydum (üste ve alta).  Hem panellerin hem de formun kendisinin MouseDown event'lerini override ettim.  Açıklama yukarda var.  

    Eğer Panel olmayan bölgelerden tutup taşıma özelliği istemiyorsanız, Form'un event handler kısmını iptal edin (örneğin Form1.Designer.cs içinden).

    Sağ ve sol Panel kontrolları eklemeyi size bırakıyorum.  Yapılacak tek şey, bu yeni Panel kontrollarının MouseDown event'lerini atamak olacak (yine en kolayı Designer içinden).

    Not: Diğer iki cevaba göre bu çözüm sadece MouseDown kullanıyor (MouseMove'a gerek yok), ve WinForms tarafından zaten sağlanan WndProc() metodunu override ediyor, böylece interop kullanmaya gerek kalmıyor.

    Resimde form görülüyor; her üç renkli kısımdan tutup taşımak mümkün - üst Panel mavi, alt Panel sarı.  Ortadaki kısım Form'un kendisi.


    • Düzenleyen A.M. Sabuncu 28 Ocak 2017 Cumartesi 22:28
    • Yanıt Olarak İşaretleyen İSMAİL G 29 Ocak 2017 Pazar 08:50
    28 Ocak 2017 Cumartesi 22:17
  • MouseDown,MouseMove eventlarını kullanarak yapabilirsiniz. yalnız iki tane değer olacak. Pencerinizin ekrandaki top ve left değeri ile mousun pencere içindeki x,y koordinatlarını toplamanız gerekiyor.

    pgnchess.com

    dergikapaklari.com

    • Yanıt Olarak İşaretleyen İSMAİL G 29 Ocak 2017 Pazar 08:50
    28 Ocak 2017 Cumartesi 20:42
    • Yanıt Olarak İşaretleyen İSMAİL G 29 Ocak 2017 Pazar 08:50
    28 Ocak 2017 Cumartesi 21:28

Tüm Yanıtlar

  • MouseDown,MouseMove eventlarını kullanarak yapabilirsiniz. yalnız iki tane değer olacak. Pencerinizin ekrandaki top ve left değeri ile mousun pencere içindeki x,y koordinatlarını toplamanız gerekiyor.

    pgnchess.com

    dergikapaklari.com

    • Yanıt Olarak İşaretleyen İSMAİL G 29 Ocak 2017 Pazar 08:50
    28 Ocak 2017 Cumartesi 20:42
    • Yanıt Olarak İşaretleyen İSMAİL G 29 Ocak 2017 Pazar 08:50
    28 Ocak 2017 Cumartesi 21:28
  • using System;
    using System.Drawing;
    using System.Windows.Forms;

    namespace DragBorderlessForm
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            //Aşağıdaki kısmı programa ilave edin:

            private const int HT_CAPTION = 0x2;
            private const int WM_NCLBUTTONDOWN = 0xA1;

            private void panel_MouseDown(object sender, MouseEventArgs e)
            {
                // Panel'e ya da Form'a gelen mouse hareketlerini yakalama (Capture = false).
                (sender as Control).Capture = false;
                // Sanki başlık çubuğu (Caption Bar) üzerinde sol mouse butonu tıklaması
                // başlamış gibi yap: 1) önce sahte mesajı oluştur.
                Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HT_CAPTION,

                    IntPtr.Zero); 
                // 2) Sonra sahte mesajı uygulamanın WndProc() metoduna gönder.
                base.WndProc(ref msg);
            }
        }
    }

    Test ettim, çalışıyor, projeyi buradan indirebilirsiniz: Proje

    Form'u borderless yaptım ve iki tane Panel koydum (üste ve alta).  Hem panellerin hem de formun kendisinin MouseDown event'lerini override ettim.  Açıklama yukarda var.  

    Eğer Panel olmayan bölgelerden tutup taşıma özelliği istemiyorsanız, Form'un event handler kısmını iptal edin (örneğin Form1.Designer.cs içinden).

    Sağ ve sol Panel kontrolları eklemeyi size bırakıyorum.  Yapılacak tek şey, bu yeni Panel kontrollarının MouseDown event'lerini atamak olacak (yine en kolayı Designer içinden).

    Not: Diğer iki cevaba göre bu çözüm sadece MouseDown kullanıyor (MouseMove'a gerek yok), ve WinForms tarafından zaten sağlanan WndProc() metodunu override ediyor, böylece interop kullanmaya gerek kalmıyor.

    Resimde form görülüyor; her üç renkli kısımdan tutup taşımak mümkün - üst Panel mavi, alt Panel sarı.  Ortadaki kısım Form'un kendisi.


    • Düzenleyen A.M. Sabuncu 28 Ocak 2017 Cumartesi 22:28
    • Yanıt Olarak İşaretleyen İSMAİL G 29 Ocak 2017 Pazar 08:50
    28 Ocak 2017 Cumartesi 22:17
  • Sayın Antecurs ; Evet bahsettiğiniz gibi o eventlerle yapıldığını biliyordum hocam saolun. Yanıtınız için çok teşekkür ederim.

    Sayın iceman_bu ; Evet verdiğiniz kodlar ile sorunum çözüldü, Yanıtınız için çok teşekkür ederim.

    Sayın Sabuncu ; Verdiğiniz örnek projeyi indirdim. Gayet detaylı olmuş ellerinize sağlık bazı yerleri çok yardımcı oldu bana. Yanıtınız için çok teşekkür ederim.

    İyi Çalışmalar...

    29 Ocak 2017 Pazar 08:50