Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как удержать форму поверх всех окон? [D3, Win95/98]


zeos ©   (2002-06-08 17:15:00) 

Только не говорите, что в инспекторе. Мне нужно организовать переключение (обычное состояние/поверх всех окон), чтобы форма при этом не перерисовывалась.


Walker   (2002-06-10 01:34:00) [1]

to SPeller ©
ты прав, конструкция очень интересная :)
(я сам заметил только тогда, когда уже отослал сообщение)

а почему я так делал - толком не помню... для отладки наверное


Novarm   (2002-06-10 00:08:00) [2]

А не проще-ли:
Form1.FormStyle:=fsStayOnTop;
Form1.FormStyle:=fsNormal;

Лично я так всегда делал


sevylor   (2002-06-09 20:07:00) [3]

procedure TForm1.CheckBox4Click(Sender: TObject);
begin
if CheckBox4.Checked then
SetWindowPos(Handle, hwnd_TopMost, 0, 0, 0, 0, swp_NoMove + swp_NoSize)
else
SetWindowPos(Handle, hwnd_NoTopMost, 0, 0, 0, 0, swp_NoMove + swp_NoSize);
end;

Что интересно, то же самое описано в Forms.pas, но действительно, если указывать Form1.Style=fsOnTop - то перерисовка, а если писать эти строки в лоб, то нет! Удачи.


SPeller   (2002-06-09 06:38:00) [4]

if cb_AlwaysOnTop.Checked
then uFlags:=SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE
else uFlags:=SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE;

Весьма интересная конструкция...:)))))


Walker   (2002-06-09 03:24:00) [5]

где-то в старых своих исходниках я вот что отыскал:


procedure TFrm_Options.cb_AlwaysOnTopClick(Sender: TObject);
var
uFlags: Cardinal;
hWndInsertAfter: HWND;
begin
if cb_AlwaysOnTop.Checked
then uFlags:=SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE
else uFlags:=SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE;{}

if cb_AlwaysOnTop.Checked
then hWndInsertAfter:=HWND_TOPMOST
else hWndInsertAfter:=HWND_NOTOPMOST;

SetWindowPos(Application.Handle,hWndInsertAfter,
0, 0, 0, 0, uFlags);
end;


причём кроме этого пришлось писать собственные процедуры сворачивания окна и восстановления из значка


zeos   (2002-06-08 19:52:00) [6]

>MaximatorVeter ©

Разве нельзя ей этого простить или у вас есть веские причины ...

Мне это очень не ндравиться.


MaximatorVeter   (2002-06-08 18:41:00) [7]


> zeos


> Song

Стоит заметить, что в этом случае форма вся видна (смена formStyle происходит по CheckBox на форме). Перерисовывать ее как бы и не надо. Но ведь она при этом так заманчиво подмигивает.

> zeos

Разве нельзя ей этого простить или у вас есть веские причины ...


Song   (2002-06-08 18:21:00) [8]

Прорисовка есть всегда. В винзипе не смотрел, но видимо старое состояние просто перерисовывается принудительно.


zeos   (2002-06-08 17:29:00) [9]

Почему же в WinZip"e перерисовки нет!?


Song   (2002-06-08 17:24:00) [10]

Вы поймите что переключение снизу на верх по Z буферу приведёт к тому, что изображение должно перерисоваться полночтью/частично, иначе на окне будут куски других окон, которые раньше его закрывали. Я советую Вам книжки умные почитать, чтобы такие вопросы отпадали сами собой.
Кроме fsStayOnTop окно можно вытолкнуть наверх через SetWindowPos() как Вам уже посоветовал MBo.


Наверх

Титульная страница Поиск, карта сайта Написать письмо