原文: Png图片的透明部分穿透测试
1 private void Window_MouseMove(object sender, MouseEventArgs e){ NavBtnList.Clear(); 2 Point mouseP = e.GetPosition(this); 3 VisualTreeHelper.HitTest(this, new HitTestFilterCallback(HitFilter), 4 new HitTestResultCallback(HitResult), new PointHitTestParameters(mouseP)); 5 6 if (NavBtnList.Count > 0) 7 { 8 for (int k = 0; k < NavBtnList.Count; k++) 9 { 10 IconBtn element = NavBtnList[k] as IconBtn; 11 12 DrawingVisual drawingVisual = new DrawingVisual(); 13 using (DrawingContext context = drawingVisual.RenderOpen()) 14 { 15 VisualBrush brush = new VisualBrush(element) { Stretch = Stretch.None }; 16 context.DrawRectangle(brush, null, 17 new Rect(0, 0, element.ActualWidth, element.ActualHeight)); 18 context.Close(); 19 } 20 21 //dpi可以自己设定 22 // 获取dpi方法:PresentationSource.FromVisual(this).CompositionTarget.TransformToDevice 23 RenderTargetBitmap bitmap = new RenderTargetBitmap((int)element.ActualWidth, 24 (int)element.ActualHeight, 96, 96, PixelFormats.Pbgra32); 25 bitmap.Render(drawingVisual); 26 27 Point p = this.TranslatePoint(mouseP, element); //全局坐标转为局部坐标point 28 29 //获取鼠标下像素颜色值 30 var c = getImagePointColor((bitmap as BitmapSource), (int)p.X, (int)p.Y); 31 if (c != Convert16ToColor("#00000000")) 32 { 33 if (element.IsEnabled) 34 { 35 } 36 break; 37 38 } 39 bitmap.Clear(); 40 }} 41 42 1 //鼠标按下获得所有IconBtnFrame 存储在NavBtnList里 43 2 List<IconBtn> NavBtnList = new List<IconBtn>(); 44 3 45 4 public HitTestFilterBehavior HitFilter(DependencyObject dObject) 46 5 { 47 6 if (dObject is IconBtn) 48 7 { 49 8 NavBtnList.Add(dObject as IconBtn); 50 9 } 5110 return HitTestFilterBehavior.Continue; 5211 } 5312 5413 public HitTestResultBehavior HitResult(HitTestResult result) 5514 { 5615 return HitTestResultBehavior.Continue; 5716 }