2016-03-31 13 views
3

C# UserControl var. İçinde OnPaint yöntemini geçersiz kıldım. Sonra bunun içine bir daire çiziyorum.C# nasıl tetiklenir Sadece belirli bir konumda tıklayın

Bitmap GraphicsImage = new Bitmap(24, 24, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
Graphics.FromImage(GraphicsImage).Clear(btnColor); 

Graphics graphics = e.Graphics; 
SolidBrush myBrush = new SolidBrush(btnColor); 
Pen myPen = new Pen(btnColor); 
// Draw the button in the form of a circle 
graphics.DrawEllipse(myPen, 0, 0, 40, 40); 
graphics.FillEllipse(myBrush, new Rectangle(0, 0, 40, 40)); 

İşte Image

enter image description here

İstediğim fare daire içinde sadece usercontrol büyük olduğu için, klik olayı tetiklemek için olmasıdır. Fare pozisyon

private void yourcontrol_Click(object sender, EventArgs e) 
{ 
    Point pt = yourcontrol.PointToClient(System.Windows.Forms.Control.MousePosition); 
    //check if point is in the circle with 
    if (Math.Sqrt(Math.Pow(pt.X - xCenterOfCircle, 2) + Math.Pow(pt.Y - yCenterOfCOircle, 2)) < radius) 
    { 
     //do something 
    } 
} 

xCenterOfCircle çevrenizde ve yCenterOfCircle merkezinin x konumu olmak zorunda dairenin içinde ise

+0

Sadece bilgi amaçlı, 'Pen' ve' SolidBrush' hem tek kullanımlık ve (sadece using' tablolarda 'koyun) ile yapıldığında imha edilmelidir. –

cevap

3

Kullanıcı denetimi tüm tıklama olayları tetikleyebilir ve kontrol edebilirsiniz y pozisyonu. Örneğinizde sizin kontrolünüzün merkezi olduğunu ve yarıçapın kontrolünüzün yarısı kadar olacağını varsayıyorum. .

1

Ben OnMouseDown geçersiz kılarak bunu olacaktır: fare Pisagor teoremi yardımıyla kontrol (merkezinin belirli bir yarıçap içinde ise

/// <summary> 
/// Raises the <see cref="E:System.Windows.Forms.Control.MouseClick"/> event. 
/// </summary> 
/// <param name="e">An <see cref="T:System.Windows.Forms.MouseEventArgs"/> that contains the event data. </param> 
protected override void OnMouseClick(MouseEventArgs e) 
{ 
    var centerX = Left + Width/2.0; 
    var centerY = Top + Height/2.0; 
    var dist = (e.X - centerX)*(e.X - centerX) + (e.Y - centerY)*(e.Y - centerY); 
    if(dist <= (radius*radius)) 
    { 
     base.OnMouseClick(e); 
    } 
} 

Yani, Aksi takdirde click olayı aktarmak, bunu görmezden , aslında tıklandığında edilmemiş kontrol ettiği gibi Daha sonra normal şekilde control.Click için olay işleyicileri ekleyebilirsiniz

Düzenleme:.. örnek kod e çoğaltmak xactly, değişim:

var centerX = 20; //(40-0)/2 
var centerY = 20; 
İlgili konular