C#nedir?com
 
YAZAR HAKKINDA
Emrah Yiğit
Emrah Yiğit
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
6 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: anindaki basildigini basili bastigimizda degeri degerini herhangi islemi islemine keystate olaylari olmadigini picturebox sirasinda tusuna C# / VC#/.NET Emrah Yiğit
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : C# / VC#/.NET
Yayınlanma Tarihi : 9.7.2005
Okunma Sayısı : 28656
Yorum Sayısı : 10     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Turhal Temizer
Conda install environment.yml Package 12.4.2021
Turhal Temizer
Mac OS/X Removing CUDA 12.4.2021
Burak Selim Şenyurt
Tie Fighter Değil, Project Tye! 12.4.2021
Burak Selim Şenyurt
Stackoverflow Sevgi Anketinde Yıllardır Bir Numara Çıkan Programlama Dili Rust Kimdir? 12.4.2021
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Windows Ortamında Sürükle Bırak İşlemleri (Drag&Drop)
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
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;

& 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)
Biz bu uygulamamızda (&) AND operatörünü kullanacağız. Şimdi bu operatörün özelliklerine bakalım.

(&) 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.
 
1 & 0 = 0
1 & 1 = 1
0 & 0 = 0
0 & 1 = 0
Ş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.

Bit Anahtar (Key)
1 Left Mouse Button
2 Right Mouse Button
4 SHIFT button
8 CTRL button
16 Middle Mouse Button
32 ALT button
Yukarıda verdiğimizi bilgileri uygulamaya dökersek.

İş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.

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;
          }

     }

}

Bu 3 methodumuzu yazdıktan sonra, sıra bunları form controllerimize bağlama işlemine gelmiştir.
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
emrahyigit@gmail.com
Makale:
Windows Ortamında Sürükle Bırak İşlemleri (Drag&Drop) C#, Visual C# ve .NET Emrah Yiğit
  • Yazılan Yorumlar
  • Yorum Yaz
OCA
7
2007
Merhaba, öncelikle ilginiz için teşekkür ederim. Söyledikleriniz çok doğru. Yapılan örnek iki picturebox içindir dolayısıyla 2 den fazla pictureBox kullanacağımız örneklerde öncelikle global bir değişken olarak PictureBox p1 değişkenini oluşturmalı, ikinci olarak ise pic_mousedown() eventi içinde p1 = (PictureBox)sender eşitliğini yapmalıyız. Son olarak pic_dragdrop adlı event içinde ise p1.Image = null ifadesini kullanarak sorunu çözebiliriz. Kolay Gelsin.
OCA
7
2007
Hocam sorunu cozdum ve olayı tamamladım. Lakin soyle onemli bir sorun war. Siz sadece 2 picturebox kullanıp akınanı null yapmıssınız. Ama bende cok picturebox war. Dolayısıyla if ile kontrol etmek cok mantıksız. Move deyince aslında aldıgı yeri bosaltması lasım gibi ama oda olmuyor. Aldıgım yerdeki image yi nasıl bosaltırım bi turlu yapamadım. Tesekkürler...
OCA
7
2007
VS.NET 2005 te kodlarda ufak değişiklikler olma ihtimali warmıdır hocam. Cunku hata almama ragmen uygulamayı beceremiyorum... Teşekkürler...
NİS
18
2006
Tamamdır yaptım sonunda sağolun herşey için..
NİS
18
2006
Tamamdır yaptım sonunda sağolun herşey için..
NİS
17
2006
Peki bu 2005 de farklı mı ?? Ben yapamadım olmadı yani..
AĞU
10
2005
Tam olarak böyle bi döküman arıyordum. Çok teşekkürler.
AĞU
10
2005
Tam olarak böyle bi döküman arıyordum. Çok teşekkürler.
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • 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