Войти

Показать полную графическую версию : [решено] Запустившее приложение в качестве родителя на C#


Sanchos
17-10-2011, 01:43
Есть программа CorelDRAW и в неё интегрирован VSTA.
Пишу Addin на C# в этом VSTA, из кода в приложении создаю кнопку, которая запускает мою форму:

Form1 frm = new Form1(this.app);
frm.Show();

Но форма создаётся как независимое окно. К примеру сворачивание разворачивание CorelDRAW на мою форму никак не влияет.
Если использовать ShowDialog(), тогда всё вроде бы ок, форма становится зависимой от окна CorelDRAW, но она блокирует его.
Т.е. в приложении невозможно что либо делать пока открыта моя форма.

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

Delirium
17-10-2011, 12:50
Sanchos, тебе надо вызывать форму как обычную форму, т.к. ты и так указываешь при вызове, что Corel является родителем твоей формы. Далее тебе надо привязаться к событию главного приложения - State Changed. И проверять примерно так:
if(this.WindowsState == WindowState.Minimized)
frm.WindowState = WindowState.Minimized;

Sanchos
17-10-2011, 13:47
Delirium, если ты про Form1(this.app) тогда это просто передача переменной app в форму, т.к. она объявляется в Main.cs внутри #region VSTA generated code след. видом app = (Application)this.Host;.

По поводу отслеживать состояние окна CorelDRAW идея вроде хорошая, у него в объектной модели даже есть AppWindow.WindowState, вот только события нету на которое можно было бы эту проверку повешать. Да и проблема останется в том, что если я с формы переключусь на CorelDRAW, форма окажется под окном приложения. Можно конечно и TopMost менять, но это уже каким то гемороем попахивает (((

Должно же быть какое то элементарное и изящное решение.

Sanchos
17-10-2011, 14:15
придумал таки:

frm.Show(System.Windows.Forms.Control.FromHandle((IntPtr)app.AppWindow.Handle));

Delirium
18-10-2011, 01:08
Ну вот видишь, главное было подтолкнуть в нужную сторону :)




© OSzone.net 2001-2012