C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Z-последовательность, Как переместить форму на верх.
tsl
Отправлено: 15.02.2004, 17:57


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Понимаю, что простой вопрос, но не могу победить. Чего-то не знаю.

Пробовал в форме вызывать this->Activate(); this->SetFocus(); Форма не выходит на поверхность.

Как форму перенести на верх, чтобы она стала верхней и активной.

Сделать это надо по таймеру из самой формы.
Asher
Отправлено: 16.02.2004, 10:57


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.

->BringToFront();
trigger
Отправлено: 16.02.2004, 11:28


Не зарегистрирован







а
Form->Show()
или
Form->ShowModal()
это не то?
tsl
Отправлено: 16.02.2004, 22:19


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Все это работает внутри одного приложения. Если в рамках одного приложения открыто много окон, то в рамках этой группы все работает. Мне же нужно, чтобы окно вышло на абсолютную поверхность. Т.е. стало поверх окон стороних приложений.
Pirs
Отправлено: 16.02.2004, 22:52


Дежурный стрелочник

Группа: Участник
Сообщений: 39



FormStyle=fsStayOnTop
Active -это свойство только для чтения
А вообще посмотри есть ли на формах которые теряют и получают фокус, компоненты с фокусом ввода напр. TEdit. Тогда надо сначала его деактивировать.
tsl
Отправлено: 17.02.2004, 07:49


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Сделал тестовую программу. Шаблон FormStyle=fsStayOnTop работает. Интересно, что я его тоже пробовал, но поместил в обработчик OnActivate. Там это присвоение вызывает ошибку (запрещенная операция). Это ввело меня в заблуждение. Я решил, что после активации формы такое присвоение невозможно. На самом деле, обработчик OnActivate — это единственное мной обнаруженое на данный момент место, где возникает данная ошибка.

Зависимость от присутствия и активности компонента TEdit не наблюдал.

Есть еще особенности. Конструкция FormStyle = fsStayOnTop срабатывает только при первом присвоении этого значения. Для того что бы повторное присвоение выводило форму на верх, я предварительно выполнял FormStyle = fsNormal. Это работает даже если поверх окна находится другое окно в стиле "оставаться на верху".
Pirs
Отправлено: 17.02.2004, 23:26


Дежурный стрелочник

Группа: Участник
Сообщений: 39



Active , OnActivate() и подобные им работают только с формами MDI.
Посмотри Help там все есть. (правда на English, может с этим проблема?)
tsl
Отправлено: 18.02.2004, 12:28


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Проблем нет, но каюсь, не посмотрел. Еще проблема. На вскидку никто не может сказать, как передать фокус окну, зная его handle?

Отредактировано tsl — 18/02/2004, 14:05
Gedeon
Отправлено: 18.02.2004, 13:18


Ветеран

Группа: Модератор
Сообщений: 1742



MSDN писал(а)
QUOTE

The SetFocus function sets the keyboard focus to the specified window. The window must be attached to the calling thread's message queue.

CODE

       HWND SetFocus(HWND hWnd);
tsl
Отправлено: 18.02.2004, 13:57


Дежурный стрелочник

Группа: Участник
Сообщений: 65



Я это видел и пробовал, но почему-то неполучается.

void __fastcall TForm1::OnMessage(...)
{
::SetFocus(this);
}

То, что выполняется видел по точке останова. Но фокус не передается.

В чем может быть дело?
Gedeon
Отправлено: 18.02.2004, 14:44


Ветеран

Группа: Модератор
Сообщений: 1742



[QUOTE]
SetFocus(this)
[QUOTE]
this — это неявный указатель на форму, попробуй
CODE

SetFocus(this->Handle);

Вернуться в Вопросы программирования в C++Builder