Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
по-моему нет хотя я не очень понимаю о чем идет речь,
я хочу сделать такое - есть много форм с кнопками, которые запускают разные процессы,
а одна общая форма куда все процессы будут делать оутпут,
- поэтому хотелось бы когда этот оутпут делается - то чтобы пользователь это видел,

один вариант сделать так:

Код

void tout(AnsiString s)
{
TextOutputForm->Visible=true;
TextOutputForm->FormStyle=fsStayOnTop;
TextOutputForm->FormStyle=fsNormal;
TextOutputForm->RichEdit1->Lines->Add(s);
Application->ProcessMessages();
}


но при тогда при каждом выводе происходит какое-то типа мигание - что не эстетично.

Автор: Гость_zogman 25.11.2005, 15:04
_hunter спасибо, сейчас попрубую !
(предыдущий мой мессадж был - sextonу)

Автор: Гость_zogman 25.11.2005, 15:48
_hunter проблем:

а как мне поставить форму on Top ?
я делаю так:

Код

TextOutputForm->FormStyle=fsStayOnTop;
TextOutputForm->FormStyle=fsNormal;



но после этого условие
GetTopWindow(NULL)==TextOutputForm->Handle

Не выполнено smilesmilesmile

Автор: _hunter 25.11.2005, 15:52
тогда проще сделать форму fsStayOnTop

Автор: Гость_zogman 25.11.2005, 15:57
Ну тогда это будет мешать пользователю работать с другими прогоми
- у меня вывод происходит не так часто а прога считает долго, пока она считает и молчит нечего ей делать онТопе

Автор: Vyacheslav 25.11.2005, 16:59
А почему просто не сделать
Код

TextOutputForm->Show();

Автор: Cheremnov 28.11.2005, 09:56
В такой ситуации завожу пользовательское сообщение,
ставлю на нее ловушку, в которой делается вызов:

TextOutputForm->BringToFront();
TextOutputForm->WindowState:=wsNormal;

Автор: Гость_zogman 28.11.2005, 15:31
команды
TextOutputForm->BringToFront(); и TextOutputForm->Show();
делают форму видимой и самой верхней, среди всех форм данного приложения,
то есть если мое приложение загорожено чем-то еще, то это не помогает smile

А есть ли средство показать форму даже если она загорожена другими прогами ?

Cheremnov не понял что есть "пользовательское сообщение,
ставлю на нее ловушку" ?

Автор: sexton 28.11.2005, 16:22
что-то я все меньше понимаю чего хочет человек smile

Автор: 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)
{
...
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)