В продолжение своего предыдущего поста habrahabr.ru/post/164305 продолжаю публиковать интересные тонкости при разработке на C# под AutoCAD. Сегодня речь пойдет о решении проблемы передачи фокуса в AutoCAD при использования Modeless Window.
Коротко о проблеме. Для отображения собственных диалоговых окон, созданных на WPF, необходимо использовать метод Application.ShowModelessWindow(_mw);
Допустим мы создали на нашей форме кнопку, при нажатии которой запускается процесс очистки чертежа с помощью стандартной команды _purge. Для этого в обработчик события нажатия на кнопку добавляем метод:
Что произойдет при нажатии на кнопку? А ничего, пока мы не кликнем мышью в окне AutoCAD-а.
Избежать ненужного ручного перевода фокуса, используя только .NET API AutoCAD-а не получиться, поэтому придется использовать P/Invoke. Делается это просто:
1. Добавляем
2. Изменяем наш метод
Все.
Коротко о проблеме. Для отображения собственных диалоговых окон, созданных на 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 ); }Все.
