Çözüldü C# MouseMove Event

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Mustafaa1

Centipat
Katılım
29 Nisan 2022
Mesajlar
109
Çözümler
4
Daha fazla  
Cinsiyet
Erkek
Arkadaşlar Windows form açtım diyelim. 50 tane label koydum. Ben diyorum ki mousemove Event'i hangi labele gelirse onun arka plan rengini mavi yapsın. Bunun kodu lazım. 50 tane method oluşturup yapılabilir ama işlem kalabalığı. Basit bir yöntemi olabileceğini düşündüm.
 
Son düzenleyen: Moderatör:
Çözüm
İlgilenip yazdığınız için çok teşekkür ederim.İnternette baktım ama bulamadım aradığım cevabı
Ya ben basit bir labirent oyunu yaptım labeller alan oluyor.Farenin ucu eyer labele değerse messagebox da Alana deydiniz yazıyor.Dedimki bu değdiğim labelin Arka planı mouse üzerinde olduğunda mavi renk olsun paralelindede alana deydiniz yazsın thread.Sleep(300) yaptım uyuttum falan ama arkaplan mouse üzerine gelince renk değiştirmiyor.Anlattığın şeyi nasıl ona uyarlayabilirim sence ?

Şimdi tam olarak anlamadım, öncelikle verdiğim kod direk üstüne gelince arka planı mavi yapıyor zaten. Buna ek olarak LabelsMouseEnter methodunda MessageBox ekleyip ekrana hata verebilirsin.

Thread.Sleep ile neyi amaçladığını tam olarak anlamadım ama şöyle bir not düşeyim; Thread.Sleep ile ana thread'i uyutursan form ekranı da sana tepki veremez çünkü thread'i uyutmuş olursun.

Kodu oyunun için şöyle güncelleyebilirsin:
C#:
private void Form1_Load(object sender, EventArgs e)
{
    _myLabels = new List<Label>() { label1, label2, label3, label4, label5, label6 };
    _myLabels.ForEach(label => {
        label.MouseEnter += LabelsMouseEnter;
    });
}

private void LabelsMouseEnter(object sender, EventArgs e)
{
    ((Label)sender).BackColor = Color.Red;
    MessageBox.Show("Oyun Bitti", "Alana değdin!", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Oyunu yeniden başlatma satırı*
}

* Yıldız koyduğum kısım için bir method yaz veya direk bu satırdan ok'ye basıldıktan sonra label'ın arka planını temizle ki arka planı kırmızı kalmasın. İşte nasıl istersen öyle yönlendirirsin buradan sonra.
Tabii ki var, bütün label'ların mouse event'lerine aynı methodu gönderebilirsin.

C#:
private List<Label> _myLabels;
private void Form1_Load(object sender, EventArgs e)
{
    _myLabels = new List<Label>() { label1, label2, label3, label4, label5, label6 };
    _myLabels.ForEach(label => { 
                label.MouseEnter += LabelsMouseEnter;
                label.MouseLeave += LabelsMouseLeave;
            });
}

private void LabelsMouseEnter(object sender, EventArgs e)
{
    ((Label)sender).BackColor = SystemColors.HotTrack;
}
private void LabelsMouseLeave(object sender, EventArgs e)
{
    ((Label)sender).BackColor = SystemColors.Control;
}

labels.gif
 
Son düzenleme:
İlgilenip yazdığınız için çok teşekkür ederim.İnternette baktım ama bulamadım aradığım cevabı
Ya ben basit bir labirent oyunu yaptım labeller alan oluyor.Farenin ucu eyer labele değerse messagebox da Alana deydiniz yazıyor.Dedimki bu değdiğim labelin Arka planı mouse üzerinde olduğunda mavi renk olsun paralelindede alana deydiniz yazsın thread.Sleep(300) yaptım uyuttum falan ama arkaplan mouse üzerine gelince renk değiştirmiyor.Anlattığın şeyi nasıl ona uyarlayabilirim sence ?
 
Son düzenleme:
İlgilenip yazdığınız için çok teşekkür ederim.İnternette baktım ama bulamadım aradığım cevabı
Ya ben basit bir labirent oyunu yaptım labeller alan oluyor.Farenin ucu eyer labele değerse messagebox da Alana deydiniz yazıyor.Dedimki bu değdiğim labelin Arka planı mouse üzerinde olduğunda mavi renk olsun paralelindede alana deydiniz yazsın thread.Sleep(300) yaptım uyuttum falan ama arkaplan mouse üzerine gelince renk değiştirmiyor.Anlattığın şeyi nasıl ona uyarlayabilirim sence ?

Şimdi tam olarak anlamadım, öncelikle verdiğim kod direk üstüne gelince arka planı mavi yapıyor zaten. Buna ek olarak LabelsMouseEnter methodunda MessageBox ekleyip ekrana hata verebilirsin.

Thread.Sleep ile neyi amaçladığını tam olarak anlamadım ama şöyle bir not düşeyim; Thread.Sleep ile ana thread'i uyutursan form ekranı da sana tepki veremez çünkü thread'i uyutmuş olursun.

Kodu oyunun için şöyle güncelleyebilirsin:
C#:
private void Form1_Load(object sender, EventArgs e)
{
    _myLabels = new List<Label>() { label1, label2, label3, label4, label5, label6 };
    _myLabels.ForEach(label => {
        label.MouseEnter += LabelsMouseEnter;
    });
}

private void LabelsMouseEnter(object sender, EventArgs e)
{
    ((Label)sender).BackColor = Color.Red;
    MessageBox.Show("Oyun Bitti", "Alana değdin!", MessageBoxButtons.OK, MessageBoxIcon.Error);
// Oyunu yeniden başlatma satırı*
}

* Yıldız koyduğum kısım için bir method yaz veya direk bu satırdan ok'ye basıldıktan sonra label'ın arka planını temizle ki arka planı kırmızı kalmasın. İşte nasıl istersen öyle yönlendirirsin buradan sonra.
 
Son düzenleme:
Çözüm
Mousemove ile yapmıştım ondan hata veriyormuş.Bide bazı kişilerin adının yanında ks yazıyor o ne biliyo musun ?
 
Son düzenleme:
Üstüne gelirsen söyler :) Konu sahibi demek. Herhangi bir hata ile karşılaşırsan bilgim dahilinde yardımcı olmaya devam edebilirim. Kolay gelsin :D
Telefonda yazmıyor.Sağolasın reis sanada kolay gelsin.
Mouse eventi tamamda bunu bir control üzerine yapsak mesela button oluşturdum diyelim ona wasd tuşları atadım basınca gidiyor bir alan var oraya deyince oyunu yeniden başlatsın
29021CA8-0BAA-4E29-97EE-0E2A270EBD59.jpeg
 
Son düzenleme:
Telefonda yazmıyor.Sağolasın reis sanada kolay gelsin.
Mouse eventi tamamda bunu bir control üzerine yapsak mesela button oluşturdum diyelim ona wasd tuşları atadım basınca gidiyor bir alan var oraya deyince oyunu yeniden başlatsın
Eki Görüntüle 1394506
Çarpışma tespiti için çok karmaşık şeyler yazmışsın, videodaki gibi yapabilirsin. Daha okunaklı bir kod sunar sana ve birden fazla obje için onlarca tekrar yazmazsın.
Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.
Oyunu yeniden başlatmak ise X işlem gerçekleştiğinde tüm objeleri varsayılan değerlerine döndüren bir method yazmak.
 
Son düzenleme:
Teşekkür ederim senin sayende hallettim valla yoksa kolay kolay halledemezdim ben bunu, benim düşündüğüm hiç bir şeyi yapmadı 😂😂
Her zaman söylerim, C# öğrenmeye asla form ile başlanmamalı. Form Application hazır bir kütüphane ve sana çokça hazır kod sunar ve bunlar özünde OOP mimarisi içerir. Daha OOP konseptlerini düzgün anlamak bir yana C# dilinin yapısını doğru düzgün öğrenmeden kendini böyle karmaşık bir yere bırakmak çok yanlış bir başlangıç. Bir de üstüne Visual Studio sana o kadar çok yardım ediyor ki kaçırdığın bir sürü konsept oluyor. Kesinlikle öğrenmek için doğru bir platform değil. Konsol üzerinden düz C# yazmak lazım. Mesela konuyu açarken sorduğun ilk soruyu neden bildim? Form üstünde çok fazla tecrübem olduğundan değil, delegate event nedir bildiğimden aklıma geldi.
Tabi ben senin seviyeni bilmiyorum, C# diline hakimsen daha önce konsolda çalışmalar yaptıysan buradan devam etmekte bir problem yok. Ya da ikisini de aynı anda devam ettirebilirsin, mesela bilmiyorsan şimdiden delegate nedir araştırman faydalı olabilir. Daha sonra event ve C# içinde action, predicate gibi önceden tamınlı hazır delegate'leri falan da öğrenirsin. Bu tarz konuları konsol üzerinden öğrenmek daha faydalı.
 

Yeni konular

Geri
Yukarı