Вставить форму слова в позиции курсора - PullRequest
0 голосов
/ 19 декабря 2011

Я ищу способ вставить форму MS Word в позицию курсора.На данный момент у меня есть следующий код, который вставляет фигуру в заранее определенном месте:

        Microsoft.Office.Interop.Word.Range CurrRange = Globals.ThisAddIn.Application.Selection.Range;

        //Get the id of the MS Word shape to be inserted
        int shapeId = (int)MsoAutoShapeType.msoShapeRoundedRectangle;
        //Get the value of the name attribute from the selected tree view item
        string nodeText = treeViewItem.GetAttribute("name");

        //Add a new shape to the MS Word designer and set shape properties
        var shape = CurrRange.Document.Shapes.AddShape(shapeId, 170, 200, 100, 20);
        shape.AlternativeText = String.Format("Alt {0}", nodeText);
        shape.TextFrame.ContainingRange.Text = nodeText;
        shape.TextFrame.ContainingRange.Font.Size = 8;

Место, где фигура вставляется, жестко закодировано:

Это видно из 2-го и3-ий параметр метода AddShape():

170 = позиция, измеренная в точках к левому краю автофигуры

200 = позиция, измеренная в точках к верхнему краю автофигуры

Я посмотрел на свойства и методы моего объекта Range, но, похоже, не могу найти ничего, в котором хранятся значения позиций, которые мне требуются.

1 Ответ

2 голосов
/ 19 декабря 2011

Последний параметр AddShape - это Anchor, который ожидает объект диапазона. Попробуйте передать свой диапазон в это:

var shape = CurrRange.Document.Shapes.AddShape(shapeId, 0, 0, 100, 20,CurrRange);

Обновление. Похоже, что в документах Word 2010 есть ошибка , что она не учитывает привязку. Сохраните документ в виде файла .doc и протестируйте снова, если вы сделаете это, он будет привязан к началу абзаца. Ссылка выше только на форумы Microsoft, я не смог найти отчет об ошибке подключения для этой проблемы.

В качестве обходного пути можно указать верхний и левый столбцы в зависимости от местоположения выделения:

Microsoft.Office.Interop.Word.Range CurrRange = Globals.ThisAddIn.Application.Selection.Range;

//Get the id of the MS Word shape to be inserted
int shapeId = (int)MsoAutoShapeType.msoShapeRoundedRectangle;

//Get the value of the name attribute from the selected tree view item
string nodeText = "Hello World";

var left = Globals.ThisAddIn.Application.Selection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdHorizontalPositionRelativeToPage);
var top = Globals.ThisAddIn.Application.Selection.get_Information(Microsoft.Office.Interop.Word.WdInformation.wdVerticalPositionRelativeToPage);

//Add a new shape to the MS Word designer and set shape properties
var shape = CurrRange.Document.Shapes.AddShape(shapeId, left, top, 100, 20);
shape.AlternativeText = String.Format("Alt {0}", nodeText);
shape.TextFrame.ContainingRange.Text = nodeText;
shape.TextFrame.ContainingRange.Font.Size = 8;
...