![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поверх всех окон [D5, WinXP]
3S © (2004-06-15 18:23:00)Имеется главная форма (MainForm), для предания ей статуса TOPMOST использую функцию...
procedure TMainForm.FormCreate(Sender: TObject);
begin
SetWindowPos(MainForm.Handle,
HWND_TOPMOST, Left, Top,
Width, Height,
SWP_NOACTIVATE or SWP_NOCOPYBITS or SWP_NOMOVE or SWP_NOSIZE);
end;
И все было бы хорошо, если бы мне не нужно было вызвать диалоговое окно. Вызываю его кнопкой Button1...
procedure TMainForm.Button1Click(Sender: TObject);
var Dialog1: TDialog1;
begin
Dialog1:=TDialog1.Create(Application);
Dialog1.ShowMOdal;
Dialog1.free;
end;
В TDialog1 также прописано TOPMOST при создании...
procedure TDialog1.FormCreate(Sender: TObject);
begin
SetWindowPos(Handle,
HWND_TOPMOST, Left, Top,
Width, Height,
SWP_NOACTIVATE or SWP_NOCOPYBITS or SWP_NOMOVE or SWP_NOSIZE);
end;
и в обработчике события OnPaint... - Application.RestoreTopMosts;
Вот тут и начинаются чудеса c MainForm (когда открыт Dialog1)...
При потере приложением фокуса (например при переключении с проги в WinWord), Dialog1 как полагается находится TopMost, но MainForm, то, как должно быть находиться, за Dialog1 (но поверх WinWord), а то слетает под окно WinWord.
Никто не сталкивался с этой проблемой? Где грабли?
Заранее огромное спасибо!
3S (2004-06-15 19:57:00) [1]Спасибо! Буду пробовать
GuAV (2004-06-15 19:43:00) [2]Попробовал сам... да проблема существует.
Имхо проблема в самой ShowModal;
Вот кусок из этой фции, перед входом в модальный цикл
SendMessage(Handle, CM_ACTIVATE, 0, 0);
вот и лови это сообщение и в нём делай SetWindowPos всем, кому надо.
Всё имхо, конечно, но имхо с формстейт Борланд что-то не то намутили.
3S (2004-06-15 18:55:00) [3]
> FormStyle, надо его установить в fsStayOnTop
А ты думаешь, это свойство использует другую функцию :-)
> Этой фразы я вообще не понял:
> и в обработчике события OnPaint... - Application.RestoreTopMosts
procedure
procedure TDialog1.FormPaint(Sender: TObject);
begin
Application.RestoreTopMosts;
end;
Без этой хрени, диалог не будет TOPMOST, даже если ему десять раз прописать свойство fsStayOnTop (глюк Delphi, хотя они считают что это винда)
Piter (2004-06-15 18:37:00) [4]3S (15.06.04 18:23)
Где грабли?
да везде. Чтобы форма была поверх всех - у нее специально есть свойство FormStyle, надо его установить в fsStayOnTop
Этой фразы я вообще не понял:
3S (15.06.04 18:23)
и в обработчике события OnPaint... - Application.RestoreTopMosts