gpt4 book ai didi

c# - PictureBox - 处理图像非透明区域的点击事件

转载 作者:行者123 更新时间:2023-11-30 21:46:50 37 4
gpt4 key购买 nike

我必须在 C# 中制作一个窗口窗体,其中两个 PictureBox 重叠。 TopPictureBox 包含一个透明的 png 图片。默认情况下,可以通过单击 TopPictureBox 中图像的任何可见或透明区域来单击 TopPictureBox。但我想让 TopPictureBox 只能通过单击图像的可见区域而不是透明区域来单击。另外我想让光标只在图像的可见区域发生变化,而不是在透明区域。

有什么办法可以做到这些吗?

我正在使用此代码使 TopPictureBox 透明。

TopPictureBox.BackColor = Color.Transparent;

感谢您的帮助。

enter image description here

最佳答案

检查 PictureBox 中的位置是否为 Transparent 取决于 ImageSizeMode 属性 图片框

您不能简单地使用BitmapGetPixel,因为根据SizeMode,图像的位置和大小是不同的。您应该首先根据 SizeMode 检测 Image 的大小和位置:

public bool HitTest(PictureBox control, int x, int y)
{
var result = false;
if (control.Image == null)
return result;
var method = typeof(PictureBox).GetMethod("ImageRectangleFromSizeMode",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var r = (Rectangle)method.Invoke(control, new object[] { control.SizeMode });
using (var bm = new Bitmap(r.Width, r.Height))
{
using (var g = Graphics.FromImage(bm))
g.DrawImage(control.Image, 0, 0, r.Width, r.Height);
if (r.Contains(x, y) && bm.GetPixel(x - r.X, y - r.Y).A != 0)
result = true;
}
return result;
}

然后您可以简单地使用HitTest 方法来检查鼠标是否在PictureBox 的非透明区域上:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (HitTest(pictureBox1,e.X, e.Y))
pictureBox1.Cursor = Cursors.Hand;
else
pictureBox1.Cursor = Cursors.Default;
}

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
if (HitTest(pictureBox1, e.X, e.Y))
MessageBox.Show("Clicked on Image");
}

同时将 BackColor 设置为 Color.Transparent 只会使 PictureBox 相对于其父级透明。例如,如果您在 Form 中有 2 个 PictureBox 设置了透明背景颜色,就因为您看到了窗体的背景。要制作一个支持透明背景的PictureBox,您应该自己绘制控件后面的内容。您可以在这篇文章中找到 TransparentPictureBox:How to make two transparent layer with c#?

关于c# - PictureBox - 处理图像非透明区域的点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38965660/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com