我有一个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));
这是图像
我想要的是仅当鼠标在圆圈内时触发鼠标点击事件,因为用户控件更大。
答案 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;