PointToScreen не возвращает координаты экрана - PullRequest
0 голосов
/ 11 октября 2019

Я использую EyeShot 12. Я создаю прямоугольник, используя EyeShot Линия Сущность, она имеет 2 измерения по длине и ширине.

Моя функциональность включает в себя изменение размера текста , используя action-> SelectByPick, затем выбирая любое измерение и изменяя его значение, вызывая TextBox , чтобы пользователь мог добавить значение. Здесь TextBox выскакивает на месте указателя мыши.

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

Я могу найти положение существующей Линии (соответствующее выбранному измерению) в Координаты Eyeshot , но TextBox требует экранных координат значение для точного позиционирования.

Поэтому я использую control.PointToScreen для преобразования координат точки обзора в экран, но он возвращаетТочка, которая совпадает с координатами Eyeshot.

код:

foreach (Entity ent in model1.Entities)      
{
    if (ent.Selected)
    {
        Line lin = (Line)ent;

        Point3D midpt = lin.MidPoint;

        string newpt1X = midpt.X.ToString();
        string newpt1Y = midpt.Y.ToString();

        System.Drawing.Point startPtX = model1.PointToScreen(new 
        System.Drawing.Point(int.Parse(newpt1X) + 20, int.Parse(newpt1Y) + 20));

        TextBox tb = new TextBox();
        tb.Text = "some text";
        tb.Width = 50;
        tb.Location = startPtX;
        model1.Controls.Add(tb);
    }

Я искал другие результаты, но все переключаются на PointToScreen, чтобы получить это преобразование.

Надеяськто-то может указать, что я делаю.

Заранее спасибо

Сурадж

1 Ответ

0 голосов
/ 11 октября 2019

Вы сделали свой объект (TextBox) дочерним по отношению к ViewportLayout, поэтому вам нужна точка относительно него. Но элементы управления находятся не в мировой координате, а в экранной координате, основанной на их родителе.

Что вам действительно нужно, так это два (2) преобразования.

// first grab the entity point you want
// this is a world point in 3D. I used your line entity
// of your loop here
var entityPoint = ((Line)ent).MidPoint;

// now use your Viewport to transform the world point to a screen point
// this screen point is actually a point on your real physical monitor(s)
// so it is very generic, it need further conversion to be local to the control
var screenPoint = model1.WorldToScreen(entityPoint);

// now create a window 2d point
var window2Dpoint = new System.Drawing.Point(screenPoint.X, screenPoint.Y);

// now the point is on the complete screen but you want to know
// relative to your viewport where that is window-wise
var pointLocalToViewport = model1.PointToClient(window2Dpoint);

// now you can setup the textbox position with this point as it's local
// in X, Y relative to the model control.
tb.Left = pointLocalToViewport.X;
tb.Top = pointLocalToViewport.Y;

// then you can add the textbox to the model1.Controls
...