2012-09-20 26 views
10

sınırları içinde olup olmadığını bir üst formda yer alan kullanıcı denetimi üzerinde yüzer zaman bir kullanıcı denetimiimleç kontrolü

public partial class UserControl1 : UserControl, IMessageFilter 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) 
    { 
     var mouseLocation = Cursor.Position; 

     if (Bounds.Contains(PointToClient(mouseLocation))) 
     { 
      bool aBool = true;//breakpoint 
      bool two = aBool;//just assignment so compiler doesn't optimize my bool out 
     } 
     if (m.Msg != 0x20a) // Scrolling Message 
     { 
      return false;//ignore message 
     } 
     return false; 
    } 
} 

var Algılama, kesme isabet değil. Kesme noktası yakınlarda vuruldu, ancak kullanıcı kontrolünde gerçek bir metin kutusunda olabilir ve bir isabet alamıyorum. Bu kullanıcı kontrolünün sınırları dahilinde olup olmadığımı nasıl doğru bir şekilde belirleyebilirim?

FWIW, İki monitörüm var. Kullandığım monitörde bir fark yaratıyor görünmüyor.

+0

[WinForm denetim üzerinde İmleç (C#, WinForm 4.0)] muhtemel yinelenen (http://stackoverflow.com/questions/5620276/cursor-over-winform-control-c-winform-4-0) –

+0

@ DanielA.White Bağlantınızda gördüğüm cevaplar tek bir kontrole özgüdür. Burada genel bir mesaj filtresine bağlandığımı unutmayın. Bunun işe yaramayacağını düşünmüyorum. Sonunda, sadece çocuk kontrollerini içeren genel kullanıcı kontrolünü değil, farenin hangi kontrolün bittiğini bilmem gerekiyor. –

cevap

39

Control.ClientRectangle yerine Control.Bounds karşı vuruş testi deneyin sizin usercontrol iki metin kutusu olsaydı örneğin :

if (ClientRectangle.Contains(PointToClient(Control.MousePosition))) { 
    bool aBool = true;//breakpoint 
    bool two = aBool; 
} 
+0

Eğer bu 'MouseEventArgs'dan geliyorsa,' Point'Colent' olmadan da 'Location' özelliğini de kullanabilirsiniz. – Nyerguds

-2

Sadece hızlı bir hile için, tüm userconrol'un kontrolünü tek bir olayla tetikleyebilir ve fare olayları üzerinde işlem yapabilirsiniz. Eğer

textBox1.MouseMove += new MouseEventHandler(controls_MouseMove); 
    textBox2.MouseMove += new MouseEventHandler(controls_MouseMove); 
    ... 

    void controls_MouseMove(object sender, MouseEventArgs e) 
    { 
     Control subc=sender as Control; 
     int mouseX = MousePosition.X; 
     .... 
    } 
+0

En azından bazı denetimlerin fare tıklatma olayını aldıklarında mousemove olayını tetiklediğini unutmayın. Bununla başa çıkmanın en iyi yolu, fare işaretçisinin gerçekten kontrolün dışında olup olmadığını, fare hareketinin olay işleyicisinin içinde iki kez kontrol etmektir. – xDisruptor