Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

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

 
TIF ©   (2009-10-22 03:49) [0]

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

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


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


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

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


 
TIF ©   (2009-10-22 04:12) [2]

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

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

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


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

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

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

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

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


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


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


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


 
Anatoly Podgoretsky ©   (2009-10-22 11:34) [5]

Из первых ...


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

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

Ну наверное из
uses forms;

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

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

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


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

RTFS: TApplication.Run


 
TIF ©   (2009-10-23 03:48) [8]

> TApplication.Run

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


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


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


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


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

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

Ясно.
Ну всё-таки за толчок в сторону 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, которая как раз не упоминается :)
Странно как-то; буду знать.



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
15-1255424698
CoffeMan
2009-10-13 13:04
2009.12.13
Как отобразить GPS координаты в программе


2-1256864358
Тимофей
2009-10-30 03:59
2009.12.13
скриншот заданной области


2-1256116699
harisma
2009-10-21 13:18
2009.12.13
Зависимость высоты компонента от размера фонта


15-1255863244
POOP
2009-10-18 14:54
2009.12.13
Если в bat файле


15-1255496803
И. Павел
2009-10-14 09:06
2009.12.13
Компоненты для смены скинов.