您有两个选项:
如果您可以创建一个带有GraphicsPath
的Region
,那么选项一是可行的,这意味着您需要从Graphics
原始线条和曲线等中创建所需的形状。
如果您只有一个带有透明度的Bitmap
,最好不要使用带有Region
的Button
。
相反,您可以使用您的Button1
,并在每次点击时检查所点击像素的透明度。
如果它是透明的,您就调用其下方控件的单击事件。
private void Button1_MouseClick(object sender, MouseEventArgs e)
{
Size r = Button1.BackgroundImage.Size;
if ((e.X < r.Width && e.Y < r.Height) &&
((Bitmap)Button1.BackgroundImage).GetPixel(e.X, e.Y).A != 0)
{
Console.WriteLine("BUTTON clicked");
}
else
{
MouseEventArgs ee = new MouseEventArgs(e.Button, e.Clicks,
e.X + Button1.Left, e.Y + Button1.Top, e.Delta);
pictureBox1_MouseClick(pictureBox1, ee);
Console.WriteLine("BUTTON NOT clicked");
}
}
请注意,此检查假定您具有正常的布局,其中按钮图像位于左上角且没有缩放。如果您需要缩放图像,则应保留缩放后的位图以进行检查。但是,如果可以使用未缩放的图像,则应该这样做,因为这样看起来更好。
请注意,我如何为下面的控件创建正确的
MouseEventArgs
参数,以便您也可以在那里访问按钮或鼠标位置。
另请注意,使用
MouseClick
事件比使用
Click
事件更容易,因为它已经具有了鼠标位置。
如果您需要/想要使用
Click
事件,则可以跳过创建
EventArgs
,因为它没有有意义的数据;只需将
e
从点击传递出去即可。
以下是
Click
事件的开始方式:
private void Button1_Click(object sender, EventArgs e)
{
Point clickLocation = Button1.PointToClient(Control.MousePosition);
如果您想检查所有鼠标点击事件并将每个事件传递给父级,则必须编写所有代码。
首先让我们看看MSDN上事件的顺序。
- MouseDown事件。
- Click事件。
- MouseClick事件。
- MouseUp事件。
所以我们需要从MouseDown开始。 我们可以在一个名为hitTest的辅助函数中进行测试,以便我们可以重复使用它...:
Button clickedButton = null;
MouseEventArgs ee = null;
void hitTest(Button btn, MouseEventArgs e)
else clickedButton = null;
}
现在我们编写所有四个事件。我们只需要调用一次
hitTest
,并在
Click
事件中传递简单未修改的
e
参数:
private void Button1_MouseDown(object sender, MouseEventArgs e)
{
hitTest(sender as Button, e);
if (sender != clickedButton)
yourParent_MouseDown((sender as Button).Parent, ee);
else
}
private void Button1_Click(object sender, EventArgs e)
{
if (sender != clickedButton)
yourParent_Click((sender as Button).Parent, e);
else
}
private void Button1_MouseClick(object sender, MouseEventArgs e)
{
if (sender != clickedButton)
yourParent_MouseClick((sender as Button).Parent, ee);
else
}
private void Button1_MouseUp(object sender, MouseEventArgs e)
{
if (sender != clickedButton)
yourParent_MouseUp((sender as Button).Parent, ee);
else
}
当然你也需要为
yourParent
编写这四个事件。