2015-02-22 2 views
0

Я испытываю несоответствие между графическим изображением, нарисованным в координатах мира, в UserControl и результатами GraphicsPath.IsVisible() для Hit. Протестируйте фигуру с помощью мыши.GraphicsPath.IsVisible() не соответствует реальному пути?

Я выполнил небольшой тест, в котором была сделана карта, где IsVisible() вернена, относительно формы GraphicsPath, которая была нарисована. Результаты показывают очень «низкую разрешающую» версию формы, которую я рисую.

Ссылка на разделяемой Google Drive изображение, показывающее результаты: 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, за исключением случаев, когда я делаю пиксельные оверлейные материалы

ответ

2

Я думал, что изучил это достаточно тщательно, но, видимо, нет. Вскоре после публикации этого вопроса, я сделал еще один поиск с несколько иной точки зрения и нашел это:

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

... что было достаточно, чтобы подсказке меня в том, что GraphicsPath и мои главные чертежные Графика не были одинаковыми. Использование перегруженной GraphicsPath.IsVisible (PointF, Graphics) решило эту проблему очень хорошо.

По существу, он пытался проверить на очень сглаженную (пиксельную) версию моей формы, которая была масштабирована до одного размера, но не сглажена.

Смежные вопросы