Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

Отобразить кнопку на панели задач (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
2-1256274351
snowkam
2009-10-23 09:05
2009.12.13
не сохраняются расширения


15-1255816936
POOP
2009-10-18 02:02
2009.12.13
Помогите с Latex


2-1256278721
Drowsy
2009-10-23 10:18
2009.12.13
Multiple rows in singleton select.


2-1256632484
Max1
2009-10-27 11:34
2009.12.13
Имитация зажатия Shift


15-1255627268
@!!ex
2009-10-15 21:21
2009.12.13
Бесплатный редактор Flash





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский