Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Внизпрограммирование Найти похожие ветки
← →
МишаК (2006-07-02 20:13) [0]можно сделать так что бы прогр-ма всегда была активизированна
даже если параллельно ей работает другая например MS Word
← →
RzCoDer © (2006-07-02 20:18) [1]да, ты прав, действительно это можно сделать ;)
← →
Mr.Floppy (2006-07-02 20:27) [2]Чтобы всегда висела поверх других окон? Если да, то:
Form1.FormStyle := fsStayOnTop; //поверх все окон
Form1.FormStyle := fsNormal; //вернуть обратно
← →
Юрий Зотов © (2006-07-02 20:39) [3]> МишаК (02.07.06 20:13)
Вопрос непонятен. Поясните, что Вы подразумеваете под словом "активизирована".
← →
parovoZZ © (2006-07-02 20:39) [4]А чтобы ВСЕГДА висела поверх всех окон, периодически бери хендл самого верхнего окна и сверяй со своим - если разнится, то заново помещаешь своё окно на самый верх. Работает даже в игрушках.
← →
Leonid Troyanovsky © (2006-07-02 21:10) [5]
> parovoZZ © (02.07.06 20:39) [4]
> хендл самого верхнего окна и сверяй со своим - если разнится,
> то заново помещаешь своё окно на самый верх.
Это не игрушки.
--
Regards, LVT.
← →
Юрий Зотов © (2006-07-02 21:44) [6]> parovoZZ © (02.07.06 20:39) [4]
Юзер будет в восторге. Окна сами прыгают - то одно поверх другого, то наоборот... работать невозможно, но зрелище - сказочное.
← →
Пусик © (2006-07-02 21:55) [7]Задача "об окне поверх остальных" имеет вполне практическое применение и достаточно элегантное решение. Кроме того, окну необязательно быть активным. Достаточно быть поверх всех.
← →
Юрий Зотов © (2006-07-02 21:59) [8]> Пусик © (02.07.06 21:55) [7]
Совершенно верно. И при этом не прыгать вверх-вниз по таймеру, не так ли?
← →
Пусик © (2006-07-02 22:02) [9]
> И при этом не прыгать вверх-вниз по таймеру, не так ли?
Совершенно верно. Не по таймеру. Но прыгать.
← →
Eraser © (2006-07-02 22:11) [10]> [7] Пусик © (02.07.06 21:55)
> Кроме того, окну необязательно быть активным
более того - ему не обязательно быть даже foreground, но фактически оно будет поверх всех окон, а прыжки если и будут, то не заметно для юзера.
← →
Leonid Troyanovsky © (2006-07-02 22:14) [11]
> Пусик © (02.07.06 22:02) [9]
> Совершенно верно. Не по таймеру. Но прыгать.
Куда, пардон, прыгать? И, собс-но, на зачем.
--
Regards, LVT.
← →
Пусик © (2006-07-02 22:17) [12]
> Куда, пардон, прыгать? И, собс-но, на зачем.
Собс-но для того, чтобы быть поверх остальных окон.
← →
Игорь Шевченко © (2006-07-02 22:19) [13]Пусик © (02.07.06 22:17) [12]
> Собс-но для того, чтобы быть поверх остальных окон.
Для этого собс-но прыгать не надо.
← →
Пусик © (2006-07-02 22:21) [14]
> Игорь Шевченко © (02.07.06 22:19) [13]
> Пусик © (02.07.06 22:17) [12] > Собс-но для того, чтобы
> быть поверх остальных окон.Для этого собс-но прыгать не
> надо.
А можно непрыгающий пример без использования DirectX и т.п.
← →
Игорь Шевченко © (2006-07-02 22:25) [15]Пусик © (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:36) [16]
> Игорь Шевченко © (02.07.06 22:25) [15]
Для любой формы?
← →
Юрий Зотов © (2006-07-02 22:39) [17]Не, Игорь, так неинтересно. То ли дело, когда прыгает... красота... даже если незаметно для юзера (хотя незаметно вряд ли получится - и это радует больше всего).
← →
Пусик © (2006-07-02 22:42) [18]
> Юрий Зотов © (02.07.06 22:39) [17]
> Не, Игорь, так неинтересно. То ли дело, когда прыгает...
> красота... даже если незаметно для юзера (хотя незаметно
> вряд ли получится - и это радует больше всего).
Ну почему же. Когда прыгает, очень даже неплохо.
И прыжки эти не будут заметны пользователю.
← →
Юрий Зотов © (2006-07-02 22:49) [19]> Пусик © (02.07.06 22:42) [18]
Дык я и говорю - красотишша. Юзверь в восторге будет.
А насчет того, "не будут заметны"... видите ли, милый Пусик, Win32 - среда мультизадачная. И в ней может быть много процессов, а в них - много потоков, и у всех у них могут быть свои приоритеты, а приоритеты эти запросто могут быть и выше нормального. И потоки время от времени могут выполнять какие-то операции достаточно заметной длительности...
Подумайте - что из этого следует?
:o)
← →
Пусик © (2006-07-02 22:54) [20]
> Подумайте - что из этого следует?
Отсюда следует, что при первом "прыжке", то бишь всплытии окна на самый верх может быть некоторая задержка. Вот и все.
← →
Юрий Зотов © (2006-07-02 23:09) [21]> Пусик © (02.07.06 22:54) [20]
Разве только при первом?
А что мешает любому стороннему потоку затеять свою длительную высокоприоритетную операцию в ЛЮБОЕ время, между двумя ЛЮБЫМИ прыжками? Причем неважно какими - вверх или вниз.
А что мешает этому же, или любому другому потоку периодически такие операции повторять? При этом, конечно, абсолютно не синхронизируясь ни с какими окнами и ни с какими прыжками...
Экая, право, чехарда получится... крастотишша...
:o)
← →
Leonid Troyanovsky © (2006-07-02 23:11) [22]
> Пусик © (02.07.06 22:54) [20]
> Отсюда следует, что при первом "прыжке", то бишь всплытии
> окна на самый верх может быть некоторая задержка.
Моя хор. знакомая употребляет слово "прыгать" для
обозначения известного действия, иногда, дейс-но,
приводящего к задержкам. По-моему, вполне образно.
Sorry, не удержался.
--
Regards, LVT.
PS Не понятно, почему ИШ иногда сбивается на "оно"
при именовании феномена. Может это, дейс-но, развод?
← →
Пусик © (2006-07-02 23:18) [23]
> Юрий Зотов © (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] > Отсюда следует, что
> при первом "прыжке", то бишь всплытии > окна на самый верх
> может быть некоторая задержка.Моя хор. знакомая употребляет
> слово "прыгать" дляобозначения известного действия, иногда,
> дейс-но,приводящего к задержкам. По-моему, вполне образно.
>
А Вы пошляк-с, г-н Трояновский.
← →
Eraser © (2006-07-02 23:18) [24]> [17] Юрий Зотов © (02.07.06 22:39)
> Не, Игорь, так неинтересно. То ли дело, когда прыгает...
Дык способ, который предложил ИШ не исключает этого самого прыгания... т.к. если какое-то другое приложение тоже выполнит код [15], то предыдущее приложение уже будет далеко не "поверх всех окон", придется прыгать по таймеру.
Именно по-этому не стОит злоупотреблять выдвижением окна поверх остальных,
а при формулировке автора "всегда была активизированна" это вообще недопустимо.
← →
Пусик © (2006-07-02 23:21) [25]
> Eraser © (02.07.06 23:18) [24]
Следует исключить из рассмотрения случай, когда на десктопе одновременно длительное время используются 2 таких приложения.
В одном из них(или в обоих) необходима опционально настройка для отключения подобной возможности.
← →
Eraser © (2006-07-02 23:23) [26]> [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 лишние, для рассматриваемого нами случая.
← →
Eraser © (2006-07-02 23:26) [27]> [25] Пусик © (02.07.06 23:21)
> Следует исключить из рассмотрения случай, когда на десктопе
> одновременно длительное время используются 2 таких приложения.
по крайней мере одно такое приложение запускается нажатием CAD, конечно ф-я, предлженая ИШ выполняется в нем один раз, но этого достаточно, чтобы "наше" приложение "ушло" в бэкграунд.
← →
Пусик © (2006-07-02 23:43) [28]Привожу свое решение(минимум - только иллюстрация).
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;
← →
Игорь Шевченко © (2006-07-02 23:54) [29]Пусик © (02.07.06 22:36) [16]
> Для любой формы?
Для любой c родителем HWND_DESKTOP.
← →
Игорь Шевченко © (2006-07-02 23:56) [30]Пусик © (02.07.06 23:18) [23]
> Вот только хочу дождаться реализации без "прыжков" для любой
> формы приложения.
А что, был вопрос про "любую форму" ? Я что-то пропустил при чтении или это уже ваша вольная интерпретация ?
← →
Игорь Шевченко © (2006-07-03 00:00) [31]Eraser © (02.07.06 23:18) [24]
> Дык способ, который предложил ИШ не исключает этого самого
> прыгания... т.к. если какое-то другое приложение тоже выполнит
> код [15], то предыдущее приложение уже будет далеко не "поверх
> всех окон", придется прыгать по таймеру.
За прыгание по таймеру программу в корзину, программисту - пожизненный эцих с гвоздями.
← →
Пусик © (2006-07-03 00:08) [32]
> Игорь Шевченко © (02.07.06 23:56) [30]
> Пусик © (02.07.06 23:18) [23] > Вот только хочу дождаться
> реализации без "прыжков" для любой > формы приложения. А
> что, был вопрос про "любую форму" ? Я что-то пропустил при
> чтении или это уже ваша вольная интерпретация ?
А что, вопрос был про конкретную форму?
← →
Пусик © (2006-07-03 00:10) [33]Вообще, в постинге [16] задача была конкретизирована.
Думаю, что автор вопроса не будет за это в обиде, тем более, что в топике он этого не сделал.
← →
Юрий Зотов © (2006-07-03 01:01) [34]> Пусик © (02.07.06 23:18) [23]
> сказанное выше оппонентами верно только для главной формы
> приложения. И неверно для остальных.
Естественно. Впрочем, Игорь уже уточнил - с родителем HWND_DESKTOP.
> Не всегда целесообразно такой стиль использовать для главной формы,
Угу, снова согласен.
> Но, решение существует.
Дык... а кто сомневался?
> Вот только хочу дождаться реализации без "прыжков" для любой формы
> приложения.
Хотя оно элементарно и очевидно, но все для Вас, милейший Пусик:
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0;
Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST
end;
Ровно 2 элементарных строчечки, как видите. И никаких прыжков. И для любой формы.
:о)
> Дело в том, что если некоторый высокоприоритетный поток начнет свою
> деятельность после того, как целевое окно уже будет поверх остальных,
> то никаких прыжков уже не понадобится.
Дело в том, милейший Пусик, что абсолютно ничто не мешает потоку по ходу пьесы менять свой приоритет, как ему вздумается. И, чтобы не слишком мешать системе, обычно фоновые потоки, выполняющие критические операции именно так и делаются - ставят себе высокий приоритет только на время выполнения этой самой операции, а потом снова ставят обычный, или даже Idle.
Так что, картина получается такая: поток дремал-дремал, а потом вдруг ка-ак проснулся, да ка-ак начал безобразничать! И какое из "прыгающих" окон в этот момент оказалось верхним - такое верхним и останется, до тех пор пока поток снова не задремлет, и ни таймер, ни Ваш OnIdle не помогут. А в дальнейшем эта бурная деятельность потока запросто может повторяться, с произвольной периодичностью. И получится, что во время этой самой бурной активности сверху будет то одно окно, то другое, то пятое, то десятое. А бедняга юзер, ничего ни о каких потоках не подозревающий, будет удивленно смотреть, как у него окна на экране самопроизвольно дергаются на передний план и обратно. Картина Репина!
Вот такие вот прыжки, милейший Пусик. А ведь можно и без них. Всего 2 строчки.
:о)
← →
Плохиш © (2006-07-03 01:11) [35]ToAll
Читал вас долго и унимательно, но так и не понял, при чём здесь окна поверх всех, если автор спросил:
> можно сделать так что бы прогр-ма всегда была активизированна
> даже если параллельно ей работает другая например MS Word
Хотел бы спросить у автора, что он понимает под словом "активизированна"?
← →
Юрий Зотов © (2006-07-03 01:16) [36]> Плохиш © (03.07.06 01:11) [35]
Уже спрашивал, в [3]. Автор молчит, как партизанка на допросе.
Поэтому как отвечать на его вопрос - пока неясно. Ну мы тем временем и решили поразвлечься немного.
:o)
← →
Пусик © (2006-07-03 01:21) [37]
> Юрий Зотов © (03.07.06 01:01) [34]
Маэстро, Вы бесподобны ;)
← →
Пусик © (2006-07-03 01:23) [38]
> Юрий Зотов © (03.07.06 01:01) [34]
Спасибо за красивое решение.
← →
Пусик © (2006-07-03 01:45) [39]Ну и последнее замечание.
В решении с Application.OnIdle форма останется поверх даже менеджера задач. К сожалению.
← →
Юрий Зотов © (2006-07-03 01:57) [40]> Пусик © (03.07.06 01:45) [39]
Тогда и я добавлю: чтобы top-форма не отображалась в панели задач, ей, естественно, нужно влепить еще и WS_EX_TOOLWINDOW.
Но все равно - те же 2 строчки.
:о)
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.011 c