GraphicsPath.IsVisible()与实际路径不匹配?

时间:2015-02-22 23:55:59

标签: c# .net gdi+ region hittest

我遇到了在UserControl上使用World坐标绘制的GraphicsPath与使用鼠标测试形状的GraphicsPath.IsVisible()的结果之间的差异。

我执行了一个小测试,相对于绘制的GraphicsPath形状,它绘制了IsVisible()返回true的地图。结果显示出非常低的分辨率"形状I版画。

链接到共享的Google云端硬盘图片,显示结果: http://goo.gl/zd6xiM

我有没有做过或没有做过正确的事情导致这种情况?

谢谢!

这是我的OnMouseMove()事件处理程序的主要部分:

protected override void OnMouseMove(MouseEventArgs e)
{
    //base.OnMouseMove(e);

    debugPixel = Point.Empty;

    PointF worldPosition = ScreenToWorld(PointToClient(Cursor.Position));

    if (_mouseStart == Point.Empty) // Just moving mouse around, no buttons pressed
    {
        _objectUnderMouse = null;

        // Hit test mouse position against each canvas object to see if we're overtop of anything
        for (int index = 0; index < _canvasObjects.Count; index++) // Uses front to back order
        {
            NPCanvasObject canvasObject = _canvasObjects[index];
            if (canvasObject is NPCanvasPart)
            {
                NPCanvasPart canvasPart = (canvasObject as NPCanvasPart);
                NPPart part = canvasPart.Part;
                GraphicsPath gp = canvasPart.GraphicsPath;

                // Set the object under the mouse cursor, and move it to the "front" so it draws on top of everythign else
                if (gp.IsVisible(worldPosition))
                {
                    // DEBUG
                    debugPixel.X = e.X;
                    debugPixel.Y = e.Y;

                    _objectUnderMouse = canvasObject;
                    _canvasObjects.MoveItemAtIndexToFront(_canvasObjects.IndexOf(canvasObject));

                    break; // Since we're modifying the collection we're iterating through, we can't reliably continue past this point
                }
            }
        }
    }
    else
    {
        ...
    }
}

稍后在我的绘图代码中,每当debugPixel!= Point.Empty时我都会绘制一个像素。在绘图之前我暂时禁止清理,所以我可以看到它们。

可能会被问到或可能有助于排查问题的其他一些信息:

  • 我尝试过不同的Graphics.InterpolationMode设置,但似乎没有任何效果
  • 我已将TranslateTransform和ScaleTransform应用于主绘图图形,但底层HitTest地图似乎缩放并且平移等于GraphicsPath
  • 对于我的主绘图画布,Graphics.PageUnit = GraphicsUnit.Inch,除非我正在进行基于像素的叠加内容

1 个答案:

答案 0 :(得分:2)

我以为我已经彻底研究了这个,但显然没有。在发布此问题后不久,我使用略有不同的术语进行了另一次搜索,发现了这一点:

http://vbcity.com/forums/t/72877.aspx

...这足以让我觉得GraphicsPath和我的主要绘图图形不一样。使用重载的GraphicsPath.IsVisible(PointF,Graphics)很好地解决了这个问题。

基本上它是试图检查我的形状的非常混淆(像素化)版本,该版本已缩放到相同大小但未平滑。