| Автор
| Сообщение |
|
|
|
Цитата |
|
Я делаю менеджер задач в пакете программ.
Задачи менеджера:
1. Помочь настроить пользователю внешний вид модулей в пакете.
2. Помочь пользователю выбрать нужный подграф в графе пакета.
3. Обеспечить взаимодействие между модулями (по просьбе одного модуля стартовать другие модули и передавать между ними управление).
Всё сдела, всё работает. Менеджер имеет несколько окон. Теперь другая задача. Нужно, чтобы главное окно с кнопками именю (alTop) всегда оставалось на экране и не перекрывалось окнами модулей из пакета при их запуске. Точно так же, нужно, чтобы вторичное окно, располагающееся внизу экрана так же было всегда на виду. А все модули пакета располагали бы свои окна между этими двумя окнами менеджера. При этом, пакет может работать на экранах с различным разрешением.
Можно, конечно, просчитывать в модулях размеры выделяемой им области экрана. Но хочется более красивое решение.
Если речь идёт об окнах в одном модуле, то проблем нет. Два окна с атрибутоами alTop размещаются автоматически друг под другом (сверху то окно, которое первым было создано). Но если окна принадлежать разным модулям (под модулем подразумевается EXE-программа со своим графическим интерфейсом), то последнее созданное окно закрывает окно менеджера.
Если я делаю окно менеджера всегда видимым (пример кода приведён выше), то окно модуля "тонет" под ним.
Так вот, как бы сделать так, чтобы запускаемые из менеджера модули работали бы с выделенной менеджером областью экрана как с полным экраном и не лезли в те области экрана, где висят окна менеджера.
Есть три пути решения:
1) Сделать окна менеджера фиксированной высоты и в каждом модуле разворачивать формы в пределах оставшейся области. Но не кузяво.
2) При запуске модулей я имею хэндлы их процессов. Можно из менеджера получить доступ к их окнам (а их больше одного в каждом модуле) и из менеджера настраивать их размеры. Муторно и некузяво.
3) Ограничить для всех процессов область экрана. Красиво и кузяво. Так делал менеджер из пакета ПРОМТ (переводчик текстов). Так делает менеджер Microsoft с быстрым доступом к элементам офиса. То есть, окна менеджеров всегда видны, а остальные программы (все программы, любые) работают только в свободной области и думают, что это и есть весь экран. Вот я это сделать и хочу, но не знаю как.
Да вот, так ограничивает экран форма в MS Windows, которая находится (обычно) в самом низу экрана с кнопкой "пуск". Её же можно переместить вверх экрана, влево или вправо. Процессы, запускаемые в Windows не лезут на эту форму, а работают с оставшейся частью экрана как с полным экраном. Собственно, мне нужно, чтобы в менеджере было две таких формы: сверху и снизу экрана. Как это сделать? |
|
| В начало |
|
 |
|
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Это дело не такое уж хитрое - заполняешь структуру TAppBarData (дескриптор окна, код информационного сообщения, позиция);
вызываешь SHAppBarMessage. Первый параметр - код операции /добавить, удалить, изменить etc - см. MSDN/, второй - TAppBarData
А объявлено все это в модуле ShellApi _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
DrPass
Знающий :) /Почетный Модератор/

Возраст: 31
Знак зодиака: 
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
|
|
|
Цитата |
|
Это дело не такое уж хитрое - заполняешь структуру TAppBarData (дескриптор окна, код информационного сообщения, позиция);
вызываешь SHAppBarMessage. Первый параметр - код операции /добавить, удалить, изменить etc - см. MSDN/, второй - TAppBarData
А объявлено все это в модуле ShellApi _________________ Да пребудет с вами Сила! |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Gelios писал(а): | | в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage |
Я был бы очень признателен. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| DrPass писал(а): | Это дело не такое уж хитрое - заполняешь структуру TAppBarData (дескриптор окна, код информационного сообщения, позиция);
вызываешь SHAppBarMessage. Первый параметр - код операции /добавить, удалить, изменить etc - см. MSDN/, второй - TAppBarData
А объявлено все это в модуле ShellApi |
Ok. Попробую. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
Ни на одном русском форуме ничего не нашёл. В FAQ то же глухо. На сайтах с MSDN по-русски - тишина. На сайте MicroSoft есть описания, но нет примеров. Однако нашёл форум, где очень много примеров на любой случай жизни. Буду копаться там. Посмотрите, может кому тоже будут интересны эти сайты:
http://www.mamma.com - очень хороший поисковик для программистов
http://www.delphipraxis.net - огромное количество примеров |
|
| В начало |
|
 |
|
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
обещанный компонент _________________ нельзя давать всем всего, ибо всех много, а всего мало
Последний раз редактировалось: Gelios (Вт, 02-Дек-2003 7:34), всего редактировалось 1 раз |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Gelios писал(а): | | обещанный компонент |
Ok. Спасибо!
Я решил проблему вот так:
| Код: | var
ObenBar : TAppBarData;
ObenBarCreate : Integer; |
Перевод главной формы в верхний ToolBar:
| Код: | ObenBar.cbSize := SizeOf(TAppBarData);
ObenBar.hWnd := fMain.Handle;
ObenBar.uEdge := ABE_TOP;
ObenBar.rc.Left := 0;
ObenBar.rc.Top := 0;
ObenBar.rc.Right := 0;
ObenBar.rc.Bottom := fMain.Height;
ObenBarCreate := SHAppBarMessage(ABM_NEW, ObenBar);
if ObenBarCreate <> 0 then begin
SHAppBarMessage(ABM_QUERYPOS, ObenBar);
SHAppBarMessage(ABM_SETPOS, ObenBar);
Application.ProcessMessages;
MoveWindow(ObenBar.hWnd, ObenBar.rc.Left, ObenBar.rc.Top, GetSystemMetrics(SM_CXSCREEN), ObenBar.rc.Bottom, True);
end; |
Возвращение из ToolBar в главную форму:
| Код: | if ObenBarCreate <> 0 then begin
SHAppBarMessage(ABM_REMOVE, ObenBar);
ObenBarCreate := 0;
end; |
Однако есть проблемы.
1. Больше одного ToolBar создать не удаётся. Последующий перекрывает предыдущий, даже если один Top, а другой Bottom.
2. Если делаю один Top, то при перемещении мышки на любую другую форму этого приложения, ToolBar становится пустым, а форма, которую делал как ToolBar возвращается обратно в приложение.
Не кузяво, но кое-как выкрутился. Хотя было бы лучше решить эти две проблемы по-человечески. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Gelios писал(а): | | обещанный компонент |
Это не совсем компонент. Это пример работы с AppBar.
Однако компилируется, но работать отказывается:
Жмём Ok и смотрим:
 |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
мда действительно...
там один класс можно оформить как компонент...
а есть возможность прогнать его на Делфи 5? _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
 Gelios
Oracle-вый маньяк, Админ

Возраст: 37
Знак зодиака: 
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
|
|
|
Цитата |
|
мда действительно...
там один класс можно оформить как компонент...
а есть возможность прогнать его на Делфи 5? _________________ нельзя давать всем всего, ибо всех много, а всего мало |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Gelios писал(а): | мда действительно...
там один класс можно оформить как компонент...
а есть возможность прогнать его на Делфи 5? |
Я как раз и работаю на Delphi 5
Пробовал перейти на более поздние версии Delphi, но куча нужных мне компонент не переносится. Так вот и сижу на пятом.
Ошибки, о которых я написал, возникли именно на пятой дельфе. На более поздней может их и не быть. |
|
| В начало |
|
 |
|