c#如何仅在某个位置触发点击

时间:2016-03-31 17:04:55

标签: c# winforms

我有一个C#UserControl。在其中我覆盖了OnPaint方法。然后我在里面画了一个圆圈。

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

这是图像

enter image description here

我想要的是仅当鼠标在圆圈内时触发鼠标点击事件,因为用户控件更大。

2 个答案:

答案 0 :(得分:3)

您可以在用户控件上触发所有点击事件,并检查鼠标位置是否在圈内

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必须是圆圈中心的x位置和yCenterOfCircle y位置。我假设在你的例子中它是你控制的中心,半径将是你控制的一半。

答案 1 :(得分:1)

我会通过覆盖OnMouseDown

来做到这一点
/// <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);
    }
}

因此,如果鼠标位于控件中心的给定半径范围内(使用毕达哥拉斯定理,则传递click事件。否则,忽略它,因为控件实际上 点击。

然后,您可以照常将事件处理程序添加到control.Click

编辑:要完全复制示例代码,请更改:

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