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

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

программирование [D7, WinXP]


Страницы:   1 2 3

МишаК ©   (2006-07-02 20:13:00) 

можно сделать так что бы прогр-ма всегда была активизированна
даже если параллельно ей работает другая например MS Word


Игорь Шевченко   (2006-07-02 23:56:00) [21]

Пусик ©   (02.07.06 23:18) [23]


> Вот только хочу дождаться реализации без "прыжков" для любой
> формы приложения.


А что, был вопрос про "любую форму" ? Я что-то пропустил при чтении или это уже ваша вольная интерпретация ?


Игорь Шевченко   (2006-07-02 23:54:00) [22]

Пусик ©   (02.07.06 22:36) [16]


> Для любой формы?


Для любой c родителем HWND_DESKTOP.


Пусик   (2006-07-02 23:43:00) [23]

Привожу свое решение(минимум - только иллюстрация).

procedure TForm1.Idle(Sender: TObject; var Done: Boolean);
var
 Pt: TPoint;
 R: TRect;
begin
 if not Form2.Showing then Exit;
 GetCursorPos(Pt);
 R := Rect(Form2.Left,Form2.Top,Form2.Left+Form2.Width,Form2.Top+Form2.Height);
 if not PtInRect(R,pt) then SetWindowPos(Form2.Handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnIdle := Idle;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Form2.Show;
 Form1.Hide;
end;


Eraser   (2006-07-02 23:26:00) [24]

> [25] Пусик ©   (02.07.06 23:21)


> Следует исключить из рассмотрения случай, когда на десктопе
> одновременно длительное время используются 2 таких приложения.

по крайней мере одно такое приложение запускается нажатием CAD, конечно ф-я, предлженая ИШ выполняется в нем один раз, но этого достаточно, чтобы "наше" приложение "ушло" в бэкграунд.


Eraser   (2006-07-02 23:23:00) [25]

> [23] Пусик ©   (02.07.06 23:18)


> Вот только хочу дождаться реализации без "прыжков" для любой
> формы приложения.

procedure TfmBlackLayered.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.Style := Params.Style and (not (WS_DLGFRAME or WS_THICKFRAME));
 Params.Style := Params.Style or WS_POPUP  or
   WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_BORDER;
 Params.ExStyle := WS_EX_LAYERED or WS_EX_TRANSPARENT;
 Params.WndParent := 0;
end;

+
procedure TfmBlackLayered.FormShow(Sender: TObject);
begin
 ClockUpdate.Enabled := true;
 SetWindowPos(Handle,
   HWND_TOPMOST,
   0, 0,
   Screen.Width,
   Screen.Height,
   SWP_FRAMECHANGED or SWP_NOACTIVATE);
end;

+ (опционально, но желательно)
procedure TfmBlackLayered.ClockUpdateTimer(Sender: TObject);
begin
 SetWindowPos(Handle,
   HWND_TOPMOST,
   0, 0,
   Screen.Width,
   Screen.Height,
   SWP_NOACTIVATE);
end;

но, опять же, без прыжков, в общем случае - никак.

ps часть флагов в CreateParams лишние, для рассматриваемого нами случая.


Пусик   (2006-07-02 23:21:00) [26]


> Eraser ©   (02.07.06 23:18) [24]


Следует исключить из рассмотрения случай, когда на десктопе одновременно длительное время используются 2 таких приложения.
В одном из них(или в обоих) необходима опционально настройка для отключения подобной возможности.


Eraser   (2006-07-02 23:18:00) [27]

> [17] Юрий Зотов ©   (02.07.06 22:39)
> Не, Игорь, так неинтересно. То ли дело, когда прыгает...

Дык способ, который предложил ИШ не исключает этого самого прыгания... т.к. если какое-то другое приложение тоже выполнит код [15], то предыдущее приложение уже будет далеко не "поверх всех окон", придется прыгать по таймеру.
Именно по-этому не стОит злоупотреблять выдвижением окна поверх остальных,
а при формулировке автора " всегда была активизированна" это вообще недопустимо.


Пусик   (2006-07-02 23:18:00) [28]


> Юрий Зотов ©   (02.07.06 22:49) [19]


Видите ли, милый Юрий, сказанное выше оппонентами верно только для главной формы приложения. И неверно для остальных.
Не всегда целесообразно такой стиль использовать для главной формы, бывает необходимость исполььзовать его для другой формы в приложении.
Но, решение существует.
Вот только хочу дождаться реализации без "прыжков" для любой формы приложения.


> Юрий Зотов ©   (02.07.06 23:09) [21]
> > Пусик ©   (02.07.06 22:54) [20] Разве только при первом?
>  А что мешает любому стороннему потоку затеять свою длительную
> высокоприоритетную операцию в ЛЮБОЕ время, между двумя ЛЮБЫМИ
> прыжками? Причем неважно какими - вверх или вниз.


Дело в том, что если некоторый высокоприоритетный поток начнет свою деятельность послетого, как целевое окно уже будет поверх остальных, то никаких прыжков уже не понадобится.


> Leonid Troyanovsky ©   (02.07.06 23:11) [22]
> > Пусик ©   (02.07.06 22:54) [20] > Отсюда следует, что
> при первом "прыжке", то бишь всплытии > окна на самый верх
> может быть некоторая задержка.Моя хор. знакомая употребляет
> слово "прыгать" дляобозначения известного действия, иногда,
>  дейс-но,приводящего к задержкам. По-моему, вполне образно.
>


А Вы пошляк-с, г-н Трояновский.


Leonid Troyanovsky   (2006-07-02 23:11:00) [29]


> Пусик ©   (02.07.06 22:54) [20]

> Отсюда следует, что при первом "прыжке", то бишь всплытии
> окна на самый верх может быть некоторая задержка.


Моя хор. знакомая употребляет слово "прыгать" для
обозначения известного действия, иногда, дейс-но,
приводящего к задержкам. По-моему, вполне образно.

Sorry, не удержался.

--
Regards, LVT.

PS Не понятно, почему ИШ иногда сбивается на "оно"
при именовании феномена. Может это, дейс-но, развод?


Юрий Зотов   (2006-07-02 23:09:00) [30]

> Пусик ©   (02.07.06 22:54) [20]

Разве только при первом?

А что мешает любому стороннему потоку затеять свою длительную высокоприоритетную операцию в ЛЮБОЕ время, между двумя ЛЮБЫМИ прыжками? Причем неважно какими - вверх или вниз.

А что мешает этому же, или любому другому потоку периодически такие операции повторять? При этом, конечно, абсолютно не синхронизируясь ни с какими окнами и ни с какими прыжками...

Экая, право, чехарда получится... крастотишша...
:o)


Пусик   (2006-07-02 22:54:00) [31]


> Подумайте - что из этого следует?


Отсюда следует, что при первом "прыжке", то бишь всплытии окна на самый верх может быть некоторая задержка. Вот и все.


Юрий Зотов   (2006-07-02 22:49:00) [32]

> Пусик ©   (02.07.06 22:42) [18]

Дык я и говорю - красотишша. Юзверь в восторге будет.

А насчет того, "не будут заметны"... видите ли, милый Пусик, Win32 - среда мультизадачная. И в ней может быть много процессов, а в них - много потоков, и у всех у них могут быть свои приоритеты, а приоритеты эти запросто могут быть и выше нормального. И потоки время от времени могут выполнять какие-то операции достаточно заметной длительности...

Подумайте - что из этого следует?
:o)


Пусик   (2006-07-02 22:42:00) [33]


> Юрий Зотов ©   (02.07.06 22:39) [17]
> Не, Игорь, так неинтересно. То ли дело, когда прыгает...
>  красота... даже если незаметно для юзера (хотя незаметно
> вряд ли получится - и это радует больше всего).


Ну почему же. Когда прыгает, очень даже неплохо.
И прыжки эти не будут заметны пользователю.


Юрий Зотов   (2006-07-02 22:39:00) [34]

Не, Игорь, так неинтересно. То ли дело, когда прыгает... красота... даже если незаметно для юзера (хотя незаметно вряд ли получится - и это радует больше всего).


Пусик   (2006-07-02 22:36:00) [35]


> Игорь Шевченко ©   (02.07.06 22:25) [15]


Для любой формы?


Игорь Шевченко   (2006-07-02 22:25:00) [36]

Пусик ©   (02.07.06 22:21) [14]

Конечно можно:

SetWindowPos (YourForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);

Или FormStyle = fsStayOnTop в Design-time


Пусик   (2006-07-02 22:21:00) [37]


> Игорь Шевченко ©   (02.07.06 22:19) [13]
> Пусик ©   (02.07.06 22:17) [12] > Собс-но для того, чтобы
> быть поверх остальных окон.Для этого собс-но прыгать не
> надо.


А можно непрыгающий пример без использования DirectX и т.п.


Игорь Шевченко   (2006-07-02 22:19:00) [38]

Пусик ©   (02.07.06 22:17) [12]


> Собс-но для того, чтобы быть поверх остальных окон.


Для этого собс-но прыгать не надо.


Пусик   (2006-07-02 22:17:00) [39]


> Куда, пардон, прыгать? И, собс-но, на зачем.

Собс-но для того, чтобы быть поверх остальных окон.


Leonid Troyanovsky   (2006-07-02 22:14:00) [40]


> Пусик ©   (02.07.06 22:02) [9]

> Совершенно верно. Не по таймеру. Но прыгать.


Куда, пардон, прыгать? И, собс-но, на зачем.

--
Regards, LVT.


Страницы:   1 2 3

Наверх

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