Полезные мелочи при разработке на C# под AutoCAD

в 7:27, , рубрики: .net, autocad, cad, CAD/CAM, Программирование, метки: , , , ,

В продолжение своего предыдущего поста habrahabr.ru/post/164305/ продолжаю публиковать интересные тонкости при разработке на C# под AutoCAD. Сегодня речь пойдет о решении проблемы передачи фокуса в AutoCAD при использования Modeless Window.

Коротко о проблеме. Для отображения собственных диалоговых окон, созданных на WPF, необходимо использовать метод Application.ShowModelessWindow(_mw);

public class CommandClass
{
static MainWindow _mw;

[CommandMethod("OpenMdlWindow")]
public static void OpenWindow()
{
if (_mw == null)
{
_mw = new MainWindow();
Application.ShowModelessWindow(_mw);
}

_mw.Closed += _mw_Closed;
}
}

Допустим мы создали на нашей форме кнопку, при нажатии которой запускается процесс очистки чертежа с помощью стандартной команды _purge. Для этого в обработчик события нажатия на кнопку добавляем метод:
Document _acDoc;

internal void Clear()
{
_acDoc.SendStringToExecute(
"._-PURGE " + "_ALL " + "n" + "_N ",
false, false, false
);
};

Что произойдет при нажатии на кнопку? А ничего, пока мы не кликнем мышью в окне AutoCAD-а.
Избежать ненужного ручного перевода фокуса, используя только .NET API AutoCAD-а не получиться, поэтому придется использовать P/Invoke. Делается это просто:
1. Добавляем

[DllImport("user32.dll")]
extern static IntPtr SetFocus(IntPtr hWnd);

2. Изменяем наш метод

internal void Clear()
{
SetFocus(Application.DocumentManager.MdiActiveDocument.Window.Handle);

_acDoc.SendStringToExecute(
"._-PURGE " + "_ALL " + "n" + "_N ",
false, false, false
);
}

Все.

Автор: Tepliuk

Источник

Поделиться

* - обязательные к заполнению поля