|  | 
        
            | 
                    
                        | Windows Ortamında Sürükle Bırak İşlemleri (Drag&Drop) |  |  
                        | 
	
    
		
            | Gönderiliyor lütfen bekleyin... | 
 |  | 
        
            | Bu makalemizde, Windows ortamında bize vazgeçilmez kolaylıklar sağlayan 
				Sürükle ve Bırak(Drag and Drop) teknolojisini, uygulamalarımızda nasıl 
				kullanabileceğimiz hakkında küçük bir örnek geliştireceğiz. Her teknolojinin 
				komplex bir tarafı olduğu gibi, D&D teknolojisininde bazı komplex tarafları 
				bulunmakta. Bu da sürükle işlemi gerçekleştiği anda, klavye veya faremizde 
				basılı olarak tuttuğumuz bazı tuşlarla ilgilidir. Örneğin; sürükle işlemi 
				sırasında hiç bir tuşa basmadığımızda veya SHIFT tuşuna bastığımzda bu 
				taşıma(move), "Ctrl" tuşuna bastığımızda bu kopyalama(copy), "ALT" tuşuna 
				bastığımızda ise bu belirtilen dosyanın kısayolunu(Shortcut), belirli bir yere 
				yerleştirir. Peki bu işlemler sırasında bu tuşlara basılı olduğunu nasıl anlarız? İşte bu konuda bize 
				Keystate ve bazı Bitwise Operatatörler yardımcı 
				olacak. 
 Bitwise Operatörler
 
 Bu operatörler tamsayı, karakter gibi değişkenlerin sayısal değerlerinin 
			üzerinde değil de doğrudan 0 ve 1 lerden oluşan bitlerini değiştirmek, sınamak 
			veya ötelemek için kullanılır.
			6 tane bitwise operatör bulunur. Bunlar;
 
 
 
			Biz bu uygulamamızda (&) AND operatörünü kullanacağız. Şimdi bu operatörün 
				özelliklerine bakalım.
				| & | And 
				Operatörü |  
				| | | Or 
				Operatörü |  
				| ^ | XOR 
				Operatörü |  
				| ~ | The Ones Complement(Bir’e Tümleme) |  
				| << | The Left Shift Operator(Sola Öteleme) |  
				| >> | The Right Shift Operator(Sağa Öteleme) |  
 (&) The AND Operator
 
 AND Operatörü 2 biti karşılaştırır ve sadece 2 bitin 1 değerini aldığı yerde 
			sonuç yine (1) değerini alır. Diğer durumlar (0) Sıfır’dır.
 
 
				Şimdi bu operatörü kullanarak işlem sırasında hangi tuşa basıldığını öğrenelim. 
					Keystate bu tür işlemler anında mouse veya klavye tuşlarından 
				hangisine basıldığı bilgisini tutan 0 ve 1 rakamlarından oluşan uzun bir 
				sayıdır. Her bir tuşun değeri bu sayı içinde saklıdır. Örnek ; Farenizin sol tuşuna basıldığında Keystate deki ilk bit "1" 
				olacaktır.
					| 1 | & | 0 | = | 0 |  
					| 1 | & | 1 | = | 1 |  
					| 0 | & | 0 | = | 0 |  
					| 0 | & | 1 | = | 0 |  
 
 
			Yukarıda verdiğimizi bilgileri uygulamaya dökersek.
				| Bit | Anahtar (Key) |  
				| 1 | Left Mouse Button |  
				| 2 | Right Mouse Button |  
				| 4 | SHIFT button |  
				| 8 | CTRL button |  
				| 16 | Middle Mouse Button |  
				| 32 | ALT button |  
 İşlemler sırasında "Ctrl" tuşuna bastığımızda Keystate de bulunan sayının 3. 
				biti 1 olmalıdır. Bu değer ;00001000 olabilir.
 Uygulama anındaki basılan tuşlar arasında "Ctrl" olup olmadığını anlamak için 
				"Keystate" deki değeri, yukarıda tabloda verdiğimiz değerler ile AND işlemine 
				sokarız.
 
 00001000 & (Sadece Ctrl)
 00001000
 - - - - - - - - - - - -
 00001000 (Sonuç yine aynı değer, yani 3. bitin değeri 1 dir. Bu "Ctrl" tuşuna 
	basıldığını gösterir.)
 
 00001001 & (Ctrl + Left Mouse Button)
 00001000
 - - - - - - - - - - - -
 00001000 (İşlem sırasında basılan tuşlar arasında "Ctrl" olduğundan dolayı sonuçta 3. bitin değeri 1 dir. Bu "Ctrl" tuşuna basıldığını gösterir. Bu durumda Keystate değeri 9 fakat bu işlem sonucu çıkan sonucun 10 luk tabandaki değeri 2 üzeri 3 den 8 dir.)
 
 00100110 &
 00001000
 - - - - - - - - - - - -
 000000000 (3. Bitin değeri (0)  ve bu "Ctrl" tuşuna basılmadığını 
				gösterir.)
 Bu durumda Keystate değeri 38 sayısını fakat sonuç bize (0) döndürecektir.
 
 
 Uygulama
 
 Bu bilgiler ışığında gelin Sürükle ve Bırak (Drag and Drop) uygulamamızı inşa 
				etmeye başlayalım.
				Uygulamamız bir PictureBox’dan diğerine sürükle bırak yöntemiyle nasıl resim 
				taşıma veya kopyalama yapabileceğimizi gösterecek. Visual Studio.Net i açarak bir Visual C# Windows Application açalım.
 
 
  
 Şimdi sıra formumuzu tasarlamaya geldi. İki adet PictureBox oluşturup, 
				herhangi bir tanesine resim yerleştirerek tasarımı bitirelim.
 
 
  
 Uygulamamız 3 adet Event (olay) ile oluşmakta. Bunlar ;
 
 1 - MouseDown
				( Bu resim kutularından herhangi birine mouse ile tıklanıldığına olacak 
				olayları içerir)
 2 - DragEnter
				(Resmi sürükleme anında yapılacaklar)
 3 - DropDrag
				(Son olayımızda resmi herhangi bir resim kutusuna üzerine bırakma(drop) 
				olayıdır)
 
 Bu 3 olayı her iki resim kutusu için yazacağımız için bunlar bağımsız metodlar 
				olacaktır. Şimdi sıra kodları yazmaya geldi.
 
 
 
				
					Bu 3 methodumuzu yazdıktan sonra, sıra bunları form controllerimize bağlama işlemine gelmiştir.
						| private void Form1_Load(object
							sender , System.EventArgs e) {
 // Picturebox lara resim drop 
								edilme özelliğini true olarak ayarlıyoruz.
 pictureBox1.AllowDrop = true 
							;
 pictureBox2.AllowDrop = true 
							;
 }
							
							// Bu Metod PictureBoxlara tıklanıldığında 
										yapılacakları içerir.
 private void pic_mousedown(object sender , 
								System.Windows.Forms.MouseEventArgs e)
 {
 // Belirtilen resme sol mouse 
									buttonuyla basıldığını kontrol ediyoruz.
 if (e.Button == 
								MouseButtons.Left)
 {
 // PictureBox objemizi 
									oluşturuyoruz.
 PictureBox pb = 
								(PictureBox)sender;
							          // 
									PictureBox için de eger bir resim verisi bulunuyorsa, sürükle bırak işlemine 
									başlıyoruz.
 if
								(pb.Image != null)
 {
 pb.DoDragDrop(pb.Image, DragDropEffects.Move | DragDropEffects.Copy);
 }
 }
 }
							// Bu metod ise sürükleme anındaki olayları 
										içerir.
 private void pic_dragenter(object sender , 
								System.Windows.Forms.DragEventArgs e)
 {
 // İlk Başta gönderilen datanın bir 
									resim olup olmadığını kontrol ediyoruz.
 if (e.Data.GetDataPresent(DataFormats.Bitmap))
 {
 // Sürükleme işlemi sırasında "CTRL" tuşuna basılı olup olmadığını kontrol 
									ediyoruz.
 if
								((e.KeyState & 8) == 8) // Ctrl tuşu ile taşıma.
 {
 // Basılıysa , o zaman fare işaretçisinin yanında küçük bir (+) 
									belirecektir.
 e.Effect = DragDropEffects.Copy;
 }
 else
 {
 e.Effect = DragDropEffects.Move;
 }
 
 }
 else
 {
 e.Effect = 
								DragDropEffects.None;
 }
 }
 
 // Bu method PictureBox lara 
										resim bırakma(drop) anındaki olayları içerir.
 private void pic_dragdrop(object sender , 
								System.Windows.Forms.DragEventArgs e)
 {
 // Resmi belirtilen PictureBox a 
									ekliyoruz.
 PictureBox pb = (PictureBox)sender;
 pb.Image = (Bitmap)e.Data.GetData(DataFormats.Bitmap);
 
 // Eğer Ctrl tuşuna basılmışsa resmi 
									aldığımız yerdeki resmi silmemeliyiz, aksi olursa resmi aldığımız pictureBox 
									içindeki değere null değerini vermeliyiz.
 if ((e.KeyState & 8) != 
								8)
 {
 if
								(pb.Name == "pictureBox1")
 {
 pictureBox2.Image = null;
 }
 else
 {
 pictureBox1.Image = null;
 }
 
 }
 
 }
 
 
 |  Yalnız bu uygulamayı her iki PictureBox(resim kutusu) içinde yapmalıyız.
 
 
   
 Şimdi sıra programımızı çalıştırmaya geldi. Sonuç olarak uygulamamız söyle bir 
			hal alacaktır.
 
 
   Sürükle ve Bırak işlemini yalnızca resimleri taşımak için değil, bir çok alanda kullanabiliriz ve bu uygulamalarımıza çok büyük kolaylık ve esneklik katacaktır. Umarım yararlı bir makale olmuştur.Bir sonraki makalemizde görüşmek üzere...
 
 Emrah YİĞİT
 [email protected]
 
                Makale:Windows Ortamında Sürükle Bırak İşlemleri (Drag&Drop) C#, Visual C# ve .NET Emrah Yiğit
 | 
        
            |  | 
        
            |  | 
        
            | 
                    
                        
                            
                        
                            Eklenen Son 10 
                            Bu Konuda Geçmiş 10 
                        
                            Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
                         
                            Son Eklenen 10 Makale Yükleniyor
                         
                            Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor
                         | 
        
            |  |