Два активных окна одновременно, как?
От: SWin  
Дата: 19.12.03 17:28
Оценка:
Народ! Подскажите, как сделать в рамках одного приложения два активных окна одновременно?

Положим, окно-родитель вызывает окно-сына, с помощью метода Show. Хочется, чтобы оба окошка подсвечивались синеньким, т.е. были активными.
Это почти из той же оперы, как, например, в MathCad, активно главное окно и окна инструментов одновременно.

Если в .NET такое нельзя, то скажите, плиз, как это сделать через API.

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



22.12.03 13:29: Перенесено модератором из '.NET' — TK
Re: Два активных окна одновременно, как?
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.12.03 22:01
Оценка:
Здравствуйте, SWin, Вы писали:

SW>Если в .NET такое нельзя, то скажите, плиз, как это сделать через API.


Это нельзя даже в API.

Активным может быть только одно окно. Что касается заголовка, то это возможно двумя путями:

1. (простой) Выпадающее окно не делается акнивным, но отрисовывается как активное и ему передается (принудительно) клавиатурный ввод.

2. Ловятся низкоуровневые сообщения WM_ACTIVATE, WM_NCACTIVATE (точно уже не помню) и блокируются. При этом придется попотеть. И глючить это может нехило. Но мы лично подобное проворачивали в своих проктах.
... << RSDN@Home 1.1.2 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Два активных окна одновременно, как?
От: yamid  
Дата: 20.12.03 06:59
Оценка:
Здравствуйте, SWin, Вы писали:

SW>Народ! Подскажите, как сделать в рамках одного приложения два активных окна одновременно?


SW>Положим, окно-родитель вызывает окно-сына, с помощью метода Show. Хочется, чтобы оба окошка подсвечивались синеньким, т.е. были активными.

SW>Это почти из той же оперы, как, например, в MathCad, активно главное окно и окна инструментов одновременно.

SW>Если в .NET такое нельзя, то скажите, плиз, как это сделать через API.


SW>Заранее спасибо.


Как в рамках .НЕТа сделать, не используя API, не знаю. Если через API — то ключ — мессаж WM_NCACTIVATE. Вот примерно такой код если не ошибаюсь делает то, что тебе надо (это оверрайд WndProc дочернего окна, в этом куске master — это окно, породившее дочернее, у которого надо сохранить "активную" рамку, а Win32 — класс, где написаны методы обращения к API):

        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case (int)Win32.WM.WM_ACTIVATE:
                   if ((((uint)m.WParam) & 0x1111) != 0) // != WA_INACTIVE
                   {
                       // child window is being activated - make sure master does not lose active border
                       Win32.SendMessage(master.Handle, (int)Win32.WM.WM_NCACTIVATE, 1, 0);
                   }
                   break;
            ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.