| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > как проверить что форма сейчас наверху ? |
| Автор: Гость_zogman 25.11.2005, 13:25 |
| как проверить что форма сейчас наверху ? т.е. видна пользователю, а не загорожена другими формами ? |
| Автор: sexton 25.11.2005, 14:43 |
| Мммм... А событие OnActivate тебе никак не поможет? |
| Автор: _hunter 25.11.2005, 14:57 |
| GetTopWindow() и сравниваеш результат с хендлом своей формы |
| Автор: Гость_zogman 25.11.2005, 15:01 | ||
| по-моему нет хотя я не очень понимаю о чем идет речь, я хочу сделать такое - есть много форм с кнопками, которые запускают разные процессы, а одна общая форма куда все процессы будут делать оутпут, - поэтому хотелось бы когда этот оутпут делается - то чтобы пользователь это видел, один вариант сделать так:
но при тогда при каждом выводе происходит какое-то типа мигание - что не эстетично. |
| Автор: Гость_zogman 25.11.2005, 15:04 |
| _hunter спасибо, сейчас попрубую ! (предыдущий мой мессадж был - sextonу) |
| Автор: Гость_zogman 25.11.2005, 15:48 | ||
| _hunter проблем: а как мне поставить форму on Top ? я делаю так:
но после этого условие GetTopWindow(NULL)==TextOutputForm->Handle Не выполнено |
| Автор: _hunter 25.11.2005, 15:52 |
| тогда проще сделать форму fsStayOnTop |
| Автор: Гость_zogman 25.11.2005, 15:57 |
| Ну тогда это будет мешать пользователю работать с другими прогоми - у меня вывод происходит не так часто а прога считает долго, пока она считает и молчит нечего ей делать онТопе |
| Автор: Vyacheslav 25.11.2005, 16:59 | ||
А почему просто не сделать
|
| Автор: Cheremnov 28.11.2005, 09:56 |
| В такой ситуации завожу пользовательское сообщение, ставлю на нее ловушку, в которой делается вызов: TextOutputForm->BringToFront(); TextOutputForm->WindowState:=wsNormal; |
| Автор: Гость_zogman 28.11.2005, 15:31 |
| команды TextOutputForm->BringToFront(); и TextOutputForm->Show(); делают форму видимой и самой верхней, среди всех форм данного приложения, то есть если мое приложение загорожено чем-то еще, то это не помогает А есть ли средство показать форму даже если она загорожена другими прогами ? Cheremnov не понял что есть "пользовательское сообщение, ставлю на нее ловушку" ? |
| Автор: sexton 28.11.2005, 16:22 |
| что-то я все меньше понимаю чего хочет человек |
| Автор: zogma 28.11.2005, 16:31 |
| sexton ??? |
| Автор: Гость_zogman 4.12.2005, 10:55 |
| Мне тут объяснили как поднять свою форму наверх (http://forum.sources.ru/index.php?showtopic=123916) приведу ето здесь может будет кому еще полезно evGenius: Как утверждает документация, SetForegroundWindow работает как нам нужно, только если вызывающий её процесс является активным. А активен тот процесс, чей поток обрабатывает пользовательский ввод. Оказывается, наш процесс может "прикинуться" активным, подключив свой поток к обработке пользовательского ввода. Это осуществляется при помощи функции AttachThreadInput. После вызова SetForegroundWindow можно будет отключиться от чужого потока, используя ту же функцию (но передавая в качестве третьего параметра FALSE, а не TRUE). Реализация этой идеи выглядит так. HWND hCurrWnd; int iMyTID; int iCurrTID; hCurrWnd = ::GetForegroundWindow(); iMyTID = GetCurrentThreadId(); iCurrTID = GetWindowThreadProcessId(hCurrWnd,0); AttachThreadInput(iMyTID, iCurrTID, TRUE); // hWnd - дескриптор окна. SetForegroundWindow(hWnd); AttachThreadInput(iMyTID, iCurrTID, FALSE); Моя практика показывает, что описанный метод успешно работает как под Windows 98/Me, так и под Windows 2000. -------------------------------------------------------------- Цитата (Сергей К. @ 1.12.05, 09:06) SetWindowPos однозначно должна работать -- для того и сделана evGenius: Нет, такая возможность для неактивных процессов заблокирована в новых версиях Windows. На замену пришло мигание в таскбаре. |
| Автор: Gala 5.12.2005, 14:11 |
| Если находишся в программе форму которой ты проверяещь тогда так if (Application->Form1->Active) { ... } |