Отображение дочернего окна в панели задач
От: Anton Batenev Россия https://github.com/abbat
Дата: 24.12.05 03:48
Оценка:
Hello, All!

Необходимо, чтобы не главное немодальное окно отражалось в панели задач (аналог свойства формы ShowInTaskbar в .net). После создания формы вызываю SetWindowLong(form->Handle, GWL_EXSTYLE, WS_EX_APPWINDOW). Все вроде как ОК — все нормально отображается. НО! Пытаюсь переключиться со второго окна на главное щелчком мыши на заголовке на панели задач — не получается. Так же, при сворачивании главного окна, сворачивается и второе (при этом, второе исчезает с панели задач). Что нужно делать, чтобы их поведение было следующим — оба бы отображались в панели задач, между ними можно было переключаться стандартным образом, при сворачивании главного, не сворачивалось бы дочернее, при закрытии главного, закрывалось дочернее?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Отображение дочернего окна в панели задач
От: Аноним  
Дата: 26.12.05 08:54
Оценка: 14 (3)
Здравствуйте, Anton Batenev, Вы писали:

AB>Необходимо, чтобы не главное немодальное окно отражалось в панели задач (аналог свойства формы ShowInTaskbar в .net). После создания формы вызываю SetWindowLong(form->Handle, GWL_EXSTYLE, WS_EX_APPWINDOW).


Желательно это делать, перегружая метод CreateParams:

  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;



AB>Все вроде как ОК — все нормально отображается. НО! Пытаюсь переключиться со второго окна на главное щелчком мыши на заголовке на панели задач — не получается. Так же, при сворачивании главного окна, сворачивается и второе (при этом, второе исчезает с панели задач). Что нужно делать, чтобы их поведение было следующим — оба бы отображались в панели задач, между ними можно было переключаться стандартным образом, при сворачивании главного, не сворачивалось бы дочернее, при закрытии главного, закрывалось дочернее?


Тут есть определенная сложность, связанная с существованием главного окна приложения (не путать с главной формой), за что создателей VCL надо бы побить... Поэтому дальше — сплошные извращения, так что просьба не пинать

1. В dpr-файле нужно установить доп. стиль этого окна, примерно так:

  ExtendedStyle := GetWindowLong(Application.Handle, GWL_EXSTYLE);
  SetWindowLong(Application.Handle, GWL_EXSTYLE,
    ExtendedStyle or WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);


2. Создать класс главной формы приложения. Засунуть его в auto-create. Указать эту форму в свойствах проекта, как главную. При этом она использоваться не будет!. Что и следует указать в том же dpr:

  Application.ShowMainForm := False;


3. Главную (с твоей точки зрения, а не с т.з. VCL) форму (обзовем ее MyMainForm), у которой ты перегрузил CreateParams, тоже сделать auto-create. В dpr написать (после Application.CreateForm и перед Application.Run):

  MyMainForm.Show;


4. Для остальных форм проекта, которые должны отображатьсяв панели задач, просто перегрузить CreateParams.

Все. Шаманство на этом заканчивается. Формы будут нормально сворачиваться и можно будет переключаться как мышью та и по alt+tab.
Конечно, в классе MyMainForm нужно предусмотреть логику завершения работы приложения.

Проблема, которую мне не удалось победить — корректная работа с модальными окнами при переключении по alt+tab.
Re[2]: Отображение дочернего окна в панели задач
От: ekamaloff Великобритания  
Дата: 27.12.05 04:16
Оценка:
Здравствуйте, Аноним, Вы писали:

[skipped]

Что-то как-то сложно все... Чем плох такой
Автор: ekamaloff
Дата: 14.12.05
метод? Давно пользуюсь и проблем не замечал.
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[3]: Отображение дочернего окна в панели задач
От: HowardLovekraft  
Дата: 27.12.05 08:36
Оценка:
Здравствуйте, ekamaloff, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


E>[skipped]


E>Что-то как-то сложно все...


"Герои легких путей не ищут!" (С)

E>Чем плох такой
Автор: ekamaloff
Дата: 14.12.05
метод? Давно пользуюсь и проблем не замечал.


Дык... вот тем и плох, что описал в вопросе автор.
Если точнее, не плох — он просто не полностью решает задачу. Формы отображаться в панели задач начинают (в данном случае ), но, если не провести хитрых манипуляций с Application.Handle, то на панели задач появляется еще одно "лишнее" окно.

Опять же, если это проделать с главной формой (имею ввиду, Application.MainForm), то есть-таки глюк при сворачивании окон (хотя при переключении — нет).

Ну и, конечно, проблема при закрытии главной формы — закрываешь ее, и приложение завершает работу. А если у Вас так организован MDI-интерфейс??? При закрытии одного из документов закрывать все приложение???
Re[4]: Отображение дочернего окна в панели задач
От: ekamaloff Великобритания  
Дата: 27.12.05 09:10
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>"Герои легких путей не ищут!" (С)


В том-то и проблема.

E>>Чем плох такой
Автор: ekamaloff
Дата: 14.12.05
метод? Давно пользуюсь и проблем не замечал.


HL>Дык... вот тем и плох, что описал в вопросе автор.


Хорошо, смотрим что описал автор:

НО! Пытаюсь переключиться со второго окна на главное щелчком мыши на заголовке на панели задач — не получается. Так же, при сворачивании главного окна, сворачивается и второе (при этом, второе исчезает с панели задач).


Т.е. он столкнулся с двумя проблемами:
1) переключение;
2) сворачивание других форм при сворачивании главного.

Отвечаю: этих проблем у меня не наблюдается.

Небольшое дополнение: некоторое время назад обнаружил проблемы с переключением. Т.е. при попытке переключиться между формами с пом. панели задач или Alt+Tab-ом форма временно выходила на передний план, становилась активной, но затем пропадала (т.е. уходила на задний план). Выяснилось что глюки такие появляются при наличии в приложении форм со свойством FormStyle=fsStayOnTop (при отсутствии таковых все работает правильно). Вылечилось добавлением следующего:

procedure TSomeForm.FormActivate(Sender: TObject);
begin
  BringToFront;
end;


HL>Если точнее, не плох — он просто не полностью решает задачу. Формы отображаться в панели задач начинают (в данном случае ), но, если не провести хитрых манипуляций с Application.Handle, то на панели задач появляется еще одно "лишнее" окно.


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

HL>Опять же, если это проделать с главной формой (имею ввиду, Application.MainForm), то есть-таки глюк при сворачивании окон (хотя при переключении — нет).


Какой глюк? Повторюсь — я никаких глюков со сворачиванием не замечаю.

HL>Ну и, конечно, проблема при закрытии главной формы — закрываешь ее, и приложение завершает работу. А если у Вас так организован MDI-интерфейс??? При закрытии одного из документов закрывать все приложение???


Т.е. вы хотите чтобы при закрытии главного окна приложение не завершало работу? Так это уже совсем другой вопрос. В исходном сообщении я такого требования не обнаружил, хотя описаны они там достаточно подробно:

Что нужно делать, чтобы их поведение было следующим — оба бы отображались в панели задач, между ними можно было переключаться стандартным образом, при сворачивании главного, не сворачивалось бы дочернее, при закрытии главного, закрывалось дочернее?

It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.