WPF 光标位于部分透明图像上

发布于 2024-08-21 16:09:53 字数 79 浏览 5 评论 0原文

我有一个包含透明区域的 png,并将其设置为图像标签。

当光标位于图像的不透明部分上方时,如何将光标设置为手?

谢谢

I have a png that contains transparent regions and I set it to the image tag.

How am I able to set the cursor to a hand when it is over an opaque part of the image?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雾里花 2024-08-28 16:09:53

为此,您需要查看位图本身。 WPF 的点击测试机制认为使用“透明”画笔绘制的任何像素即使不可见,仍然可单击。这通常是一件好事,但会妨碍您尝试做的事情。由于 .png 使用透明画笔进行绘制,因此在进行命中测试时,整个 .png 被视为已绘制。

您需要在 MouseMove 事件处理程序中执行以下操作:

  1. 继续以正常方式调用命中测试。
  2. 对于返回的每个 HitTestResult,检查它是否是 Image,如果是,则检查鼠标下方是否有透明像素
  3. 。图像或图像的不透明像素,停止。
  4. 根据鼠标所在位置确定 Cursor

要确定鼠标是否位于图像的透明像素上:

  1. 获取鼠标相对于图像的位置 (e.GetPosition( image))
  2. 如果您使用拉伸,则必须在此时反向计算拉伸以获得位图索引
  3. 使用 BitmapSource.CopyPixels 将 1 像素矩形复制到数组中 (即仅鼠标悬停的单个像素)
  4. 检查检索到的像素值以查看它是否是透明像素

To do this you will need to look at the bitmap itself. WPF's hit testing mechanism considers any pixel painted ith a "transparent" brush to still be clickable even though invisible. This is normally a good thing but gets in the way of what you're trying to do. Because a .png paints with the transparent brush, the entire .png is considerd as painted when doing hit testing.

What you need to do in your MouseMove event handler is:

  1. Go ahead and invoke hit testing the normal way.
  2. For each HitTestResult you get back, check to see if it is an Image and if so, whether a transparent pixel is under the mouse
  3. When you get a hit on a non-image or a non-transparent pixel of an image, stop.
  4. Decide on a Cursor value based on what the mouse is over

To determine whether a the mouse is over a transparent pixel of an image:

  1. Get the mouse position relative to the image (e.GetPosition(image))
  2. If you're using stretching you must back-compute the stretch at this point to get a bitmap index
  3. Use BitmapSource.CopyPixels to copy a 1-pixel rectangle into an array (ie. only the single pixel the mouse is over)
  4. Check the pixel value that was retrieved to see if it is a transparent pixel
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文