我遇到了在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时我都会绘制一个像素。在绘图之前我暂时禁止清理,所以我可以看到它们。
可能会被问到或可能有助于排查问题的其他一些信息:
答案 0 :(得分:2)
我以为我已经彻底研究了这个,但显然没有。在发布此问题后不久,我使用略有不同的术语进行了另一次搜索,发现了这一点:
http://vbcity.com/forums/t/72877.aspx
...这足以让我觉得GraphicsPath和我的主要绘图图形不一样。使用重载的GraphicsPath.IsVisible(PointF,Graphics)很好地解决了这个问题。
基本上它是试图检查我的形状的非常混淆(像素化)版本,该版本已缩放到相同大小但未平滑。