Народ! Подскажите, как сделать в рамках одного приложения два активных окна одновременно?
Положим, окно-родитель вызывает окно-сына, с помощью метода Show. Хочется, чтобы оба окошка подсвечивались синеньким, т.е. были активными.
Это почти из той же оперы, как, например, в MathCad, активно главное окно и окна инструментов одновременно.
Если в .NET такое нельзя, то скажите, плиз, как это сделать через API.
Заранее спасибо.
22.12.03 13:29: Перенесено модератором из '.NET' — TK
Здравствуйте, SWin, Вы писали:
SW>Если в .NET такое нельзя, то скажите, плиз, как это сделать через API.
Это нельзя даже в API.
Активным может быть только одно окно. Что касается заголовка, то это возможно двумя путями:
1. (простой) Выпадающее окно не делается акнивным, но отрисовывается как активное и ему передается (принудительно) клавиатурный ввод.
2. Ловятся низкоуровневые сообщения WM_ACTIVATE, WM_NCACTIVATE (точно уже не помню) и блокируются. При этом придется попотеть. И глючить это может нехило. Но мы лично подобное проворачивали в своих проктах.
... << RSDN@Home 1.1.2 beta 1 >>
Здравствуйте, 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;
...