![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
программирование [D7, WinXP]
МишаК © (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.