Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.10.2011, 02:53   #1
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию Параметр окна StayOnTop

Есть 2 окна(Form2 и Form6), одно из них главное окно программы(Form2). У обоих выставлен параметр StayOnTop. В событии OnShow главного окна выполняется SetWindowPos с параметром HWND_TOPMOST для обоих окон.

Идея заставить эти два окна быть поверх всех остальных до определенного действия с моей стороны.

При такой реализации есть два момента которые проявляются после того как мышкой активируем Form6.

1. Если переключится сначала на 1но стороннее окно, а затем на другое стороннее окно - Form6 перестает быть OnTop и перекрывается другими активными окнами.

2. Если переключится на стороннее окно и перетянуть его, то тот же самый эффект.

Form2 в этих двух случаях остается OnTop как и задумано. А вот Form6 не слушается... в чем загвоздка?
Airou вне форума Ответить с цитированием
Старый 23.10.2011, 03:03   #2
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
в чем загвоздка?
В том, что при деактивации приложения, fsStayOnTop сбрасывается у всех НЕглавных форм. Именно поэтому Form2 ведет себя как и задумывалось, а Form6 - нет.
Karpinsky вне форума Ответить с цитированием
Старый 23.10.2011, 06:04   #3
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Как можно решить эту проблему? Просто если в обработчике деактивации неглавного окна поставить fsStayOnTop это не поможет... тем более что он выполняется перед деактивацией.

Последний раз редактировалось Airou; 23.10.2011 в 21:12.
Airou вне форума Ответить с цитированием
Старый 23.10.2011, 22:30   #4
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Karpinsky Посмотреть сообщение
В том, что при деактивации приложения, fsStayOnTop сбрасывается у всех НЕглавных форм.
Подойдем с другой стороны?
Почему так происходит? И где это реализовано?
(Сам пока ищу ответы, но результатов маловато...)
Airou вне форума Ответить с цитированием
Старый 23.10.2011, 23:40   #5
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Перелопатив кучу страниц нашел вот что.

Цитата:
Почему, если присвоить свойству FormStyle значение fsStayOnTop, форма так и не остается на самом верху?

Просто добавьте application.RestoreTopMosts в обработчик события формы OnPaint. Это ошибка.

Могли бы вы рассказать об этом чуть-чуть поподробнее? Delphi где-то в неправильном месте осуществляет вызов NormalizeTopMosts?

Borland говорит что это Windows, но это случается когда StayonTop-форма НЕ является главной формой. (Некоторые английские программисты чтобы получить эту отговорку потратили несколько сотен долларов, звоня в американскую службу помощи по телефону 1-800).
Но при таком решении, окно все равно перекрывается... оно просто восстанавливает свой атрибут fsStayOnTop, после перерисовки.
Airou вне форума Ответить с цитированием
Старый 23.10.2011, 23:50   #6
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Пока есть идея - после деактивации НЕглавного окна вызвать функцию RestoreTopMosts. Но тут другая проблема... не могу отловить деактивацию. Если использовать обработчик onDeactivate, то он срабатывает если из НЕглавного окна переключились на главное окно, но не работает при переключении на стороннее окно.
Airou вне форума Ответить с цитированием
Старый 24.10.2011, 00:56   #7
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

Ага, выясняется, что при переключении на стороннее приложение, мое НЕглавное окно остается активным в рамках моего приложения. Значит нужно отследить потерю фокуса приложением в целом... может через WM_ACTIVATE главной формы?
Airou вне форума Ответить с цитированием
Старый 24.10.2011, 01:12   #8
Airou
Форумчанин
 
Регистрация: 09.04.2008
Сообщений: 151
По умолчанию

И о чудо. Не прошло и полгода но я все-таки добился необходимого. В конструкторе НЕглавной формы прописал
Код:
Application->OnDeactivate = Form6->OnDeactivate;
Код:
void __fastcall TForm6::FormDeactivate(TObject *Sender)
{
     Application->RestoreTopMosts();
}
PS (Многие вещи были неизвестны для меня поэтому процесс шел так туго :D )
Airou вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как привязать таблицу нового modal окна к Dataset динамически созданного родительского окна? delphicoding Общие вопросы Delphi 6 02.10.2011 22:41
StayOnTop Nester Общие вопросы Delphi 14 21.09.2009 09:25
Можно ли как-то задать параметр появления окна на экране?? baltushka Помощь студентам 0 13.06.2009 17:37
StayOnTop RIO Общие вопросы Delphi 6 17.01.2008 15:19
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13