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

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

Отобразить кнопку на панели задач (TaskBar)


TIF ©   (2009-10-22 03:49:00) 

для приложения без форм. Как это реализовать?

Манипуляции с Application.Handle через ShowWindow/SetWindowLong не помогли


TIF   (2009-10-24 02:03:00) [1]

> Если нет главной формы, нет обработки сообщений, откуда
> кнопка возьмется ?

Ясно.
Ну всё-таки за толчок в сторону TApplication спасибо, полистал - нашёл-таки место, где эта кнопка создаётся, способ тот же (единственно возможный, как я понимаю) - через SetWindowLong

> Манипуляции с Application.Handle через ShowWindow/SetWindowLong
> не помогли

В общем, проблема решена, именно через эти функции. Просто всего-то нужно было их переставить местами:
  SetWindowLong(
   Application.Handle,
   GWL_EXSTYLE,
   GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_APPWINDOW
  );
  ShowWindow(Application.Handle, SW_SHOWDEFAULT);


То есть сначала SetWindowLong, а потом ShowWindow, но не наоборот. В MSDN же только сказано:
Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function. Specifically, if you change any of the frame styles, you must call SetWindowPos with the SWP_FRAMECHANGED flag for the cache to be updated properly.
"Данные окна кешируются, нужно вызвать SetWindowPos с флагом SWP_FRAMECHANGED, чтобы увидеть эффект"

Попробовал - не помогает, помогает только ShowWindow, которая как раз не упоминается :)
Странно как-то; буду знать.


Игорь Шевченко   (2009-10-23 11:21:00) [2]


> Посмотрел. Про кнопку ничего не увидел, намёк не понял


Посмотри еще раз. Если нет главной формы, нет обработки сообщений, откуда кнопка возьмется ?


TIF   (2009-10-23 03:48:00) [3]

> TApplication.Run

Посмотрел. Про кнопку ничего не увидел, намёк не понял :(


Игорь Шевченко   (2009-10-23 00:12:00) [4]

RTFS: TApplication.Run


TIF   (2009-10-23 00:01:00) [5]

> И откуда возьмется Application.Handle ?

Ну наверное из
usesforms;

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

То есть категорично "нет окна - не будет и кнопки"? Кнопка всегдасвязана с каким-либо окном?

Ок. Допустим что никакой лазейки создания кнопки для процесса нет, но ведь Application - это как раз и есть самое главное окно delphi-приложения, только невидимое?
Окно, значит, есть... (или у меня ошибка в рассуждениях). А как для него кнопку-то сотворить для него?


Anatoly Podgoretsky   (2009-10-22 11:34:00) [6]

Из первых ...


Игорь Шевченко   (2009-10-22 11:19:00) [7]


> Ну или если попроще, то просто минимальный Project.dpr:
> program Project;
> uses
>   ...
> begin
>   ...
> end.


И откуда возьмется Application.Handle ?


guard_gg   (2009-10-22 06:24:00) [8]

Дело в том что такой проект мало чем отличается пустого проекта на Pascal.
Если дополнить этот проект директивой {$APPTYPE CONSOLE} (или создать New->Others->ConsoleApplication) то проект дополнится консолевким окном и принципы работы с этим окном фактически не будут отличатся от Pascal.

Но! Эта программа - всего лишь просто процесс, он будет сидеть в диспетчере задач но окна у него нет.
Для того чтобы у него появилось окно, нужно сначала зарегистрировать через WinAPI новый класс окна, а далее создать через тот же WinAPI новое окно и вручную обрабатывать все сообщения которые посылает в это окно пользователь и система.

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

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


TIF   (2009-10-22 04:12:00) [9]

> А что имеется в виду?

VCL Forms Application из которого удаляется форма с юнитом, создаваемые по-умолчанию (вместо них создаётся новый чистый Unit.pas). Итого = Unit.pas + Project.dpr

Ну или если попроще, то просто минимальный Project.dpr:
program Project;
uses
  ...
begin
  ...
end.


Германн   (2009-10-22 03:56:00) [10]


> TIF ©   (22.10.09 03:49)
>
> для приложения без форм.

А что имеется в виду? WinAPI о формах вообще не знает ничего.


Наверх

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