Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Cursor on a partially transparent image

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

like image 437
TWith2Sugars Avatar asked Feb 12 '10 10:02

TWith2Sugars


1 Answers

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
like image 177
Ray Burns Avatar answered Oct 19 '22 11:10

Ray Burns