Öncelikli olarak bu Yazılım ve bu kategorinin altındaki C# kategorisini uzun zaman önce açmıştım fakat yazmak için uygun zamanı bulamamıştım. Bundan sonra bu kategoriye çok sayıda örnek uygulama içeren yazılar yazacağım.
Giriş
Bu uygulamamda size benim gerçekten çok beğendiğim ve internette çok az örneğine rastladığım bir uygulamayı yapacağım. Windows Form Application (WFA)-ların tasarım ekranlarında Toolbox’tan istediğimiz nesneyi sürükle-bırak tekniği ile formumuza yerleştirebilir ve yerini istediğimiz gibi değiştirebiliriz, yapmamız gereken sadece o nesneyi mouse’un sol tuşuna basılı tutup sağa-solo ve yukarı-aşağıya götürmek. Peki Form çalıştığı(Debug) anda uygulamamızdaki butonu nasıl hareket ettirebiliriz mouse ile? İşte bu yazımda bunu yapacağız.
Hatırlatma ve Dikkat Edilmesi Gerekenler
Başlıktada belirttiğim gibi C# dili ile .net 4.0 versiyonunda Visual Studio 2010 Ultimate programında yazıyorum.
Mantık Yürütme
Kodlamaya geçmeden önce biraz üzerinde düşünmemiz gerekiyor nasıl yapabiliriz hangi yoldan gidebiliriz diye. Eğer Mouse’un sol tuşuna tıklandığıda(MouseDown) başlayıp, tıklanma bittikten sonra(MouseUp) işlemin bitip bu aradaki zamanda(MouseMove) taşıma işlemi gerçekleşeceğini düşünüyorsak işlem tamamdır sadece bize kodu yazmak kalıyor.
Kodlama
Öncelikli olarak File > New Project ten aşağıdaki gibi seçim yapıp Suruklenip-Birakilabilen_Buton adında yeni bir Windows Form Application oluşturuyoruz.
Windows Form Uygulamalarında ben daima Form’un FormBorderStyle özelliğini “none” yapıyorum. Bunun yapmamdaki amaç; Formun üst kısımında yer alan form adının yazdığı bölüm bir alan kaplıyor ve siz bir location tayin edecekseniz/bulacaksanız/belirleyecekseniz ya da Drawing ile bir nesne ekleyeceseniz başınız ağrıyabilir. Yaklaşık 28px o alan, sağ ve soldaki gölgeli alanlarda 6şar px civarında. Bunlar ile uğraşmak istemiyorsanız tavsiye ediyorum. Bu işlemi yaptığımızda aşağıdaki gibi bir görünüm elde ediyoruz.
Butonun “MouseUp, MouseDown, MouseMove” Eventlarına yazacağız kodlarımızı. Bunun için “Properties” penceresinden aşağıdaki gibi şimşek şeklindeki ikona tıklıyoruz.
![]() |
![]() |
MouseDown, MouseMove, MouseUp Eventlarının yanındaki alanlara çift tıkladığımızda kodlarımızı yazmaya başlayabiliriz.
Yukarıda söylemiştim tekrar hatırlatmak gerekirse, MouseDown anında işlemimiz başlayacak ve MouseUp ta son bulacak ve MouseMove eventında çalışacak.
Aşağıda ekran görüntünüsün yerine kodları adım adım anlatmayı tercih ettim. Zaten meraklı bir yazılımcı oradaki verilerin bir çoğunu değiştirip denemeler yapacaktır.
public partial class Form1 : Form { public Form1() { InitializeComponent(); } bool suruklenmedurumu = false; //Class seviyesinde bir field(değişken) tanımlıyoruz ki,MouseDown da biz bunu true yapacağız,MouseUpta false değerini alacak ve MouseMove eventında true ise hareket edecek. Point ilkkonum; //Global bir değişken tanımlıyoruz ki, ilk tıkladığımız andaki konumunu çıkarmadığımızda buton mouse imlecinden daha aşağıdan hareket edecektir. private void button1_MouseDown(object sender, MouseEventArgs e) { suruklenmedurumu = true; //işlemi burada true diyerek başlatıyoruz. button1.Cursor = Cursors.SizeAll; //SizeAll yapmamımızın amacı taşırken hoş görüntü vermek için ilkkonum = e.Location; //İlk konuma gördüğünüz gibi değerimizi atıyoruz. } private void button1_MouseMove(object sender, MouseEventArgs e) { if (suruklenmedurumu) // suruklenmedurumu==true ile aynı. { button1.Left = e.X + button1.Left - (ilkkonum.X); // button.left ile soldan uzaklığını ayarlıyoruz. Yani e.X dediğimizde buton üzerinde mouseun hareket ettiği pixeli alacağız + butonun soldan uzaklığını ekliyoruz son olarakta ilk mouseın tıklandığı alanı çıkarıyoruz yoksa butonun en solunda olur mouse imleci. Alttakide aynı şekilde Y koordinati için geçerli button1.Top = e.Y + button1.Top - (ilkkonum.Y); } } private void button1_MouseUp(object sender, MouseEventArgs e) { suruklenmedurumu = false; //Sol tuştan elimizi çektik artık yani sürükle işlemi bitti. button1.Cursor = Cursors.Default; //İmlecimiz(Cursor) default değerini alıyor. } } |
İndirme
Uygulamayı Kaynak Kodları ile Birlikte İndirmek İçin Lütfen Tıklayınız..
Not: Herhangi bir sorunuz olursa lütfen çekinmeyin, eklemimi/düzeltmemi istediğiniz bir yer olursa memnun olurum. İyi günler İyi çalışmalar. (Adınızı soyadınızı ve mail adresinizi doğru girmeniz sizinle iletişim kurmam için yeterlidir.)





#1 by muhammet on Temmuz 20, 2011 - 12:16 am
Merhaba
Güzel çalışma
Bunun gibi mesela 10 buton bı arada olsa ıstedıgımızı suruklesek onu nasıl yapabılırız , 1o buton yaratıp tek tek mouse event yazmıyacaz heralde dımı ?
#2 by Mahmut Can Sözeri on Temmuz 20, 2011 - 10:03 am
Merhaba, Öncelikli olarak teşekkür ediyorum. Elbette yazmıyoruz. 1 tane butonun event larına yazıp. Diğer butonları bu event’a yönlendiriyoruz. Daha sonra örneğin;
private void button1_click (object sender, EventArgs e)
{
( sender as button) .Text=”Bu butona tıklantı”; // dediğinizde hangi butondaysa o çalışacaktır.
}
Bu şekilde çalışatırabilirsiniz. Tabi ben burada click event ını örnek verdim. Diğer kontrol için de yapabilirsiniz.
İyi çalışmalar
Kolay gelsin
#3 by çağrı on Kasım 18, 2011 - 4:15 am
Merhaba. Eğer butonları dynamic olarak ekliyorsak butonlar üzerinde sürükleme işlemini nasıl yapabilirz.Yardımcı olursanız sevinirim.
#4 by Mahmut Can Sözeri on Kasım 18, 2011 - 12:51 pm
Merhaba aslında bir yukarıdaki soru tam olarak sorunuzun cevabı. Örneğin 10 tane button ekliyorsunuz uygulamanıza;
private void Form1_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
Button btn = new Button();
btn.Width = 100;
btn.Height = 40;
btn.Text = String.Format("btn{0}", i);
btn.MouseDown += new MouseEventHandler(btn_MouseDown);
btn.MouseMove += new MouseEventHandler(btn_MouseMove);
btn.MouseUp += new MouseEventHandler(btn_MouseUp);
flowLayoutPanel1.Controls.Add(btn);
}
}
void btn_MouseUp(object sender, MouseEventArgs e)
{
Button button1 = sender as Button;
}
void btn_MouseMove(object sender, MouseEventArgs e)
{
Button button1 = sender as Button;
}
void btn_MouseDown(object sender, MouseEventArgs e)
{
Button button1 = sender as Button;
}
uygulamadaki kodları her bir evente yazarsanız kodunuz çalışacaktır. Ayrıca eğer bu şekilde form'un load anında tek bir seferde değilde belli aralıklar ile butonları oluşturuyorsanız tek yapmanız gereken eventini atamak. Event atadığınızda işleminiz tamamlanmıştır. İyi çalışmalar