Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Хитрые окна
На страницу 1, 2  След.

Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
RedArc
Гость







СообщениеПт, 28-Ноя-2003 17:22    Заголовок сообщения: Хитрые окна
Цитата

Я делаю менеджер задач в пакете программ.
Задачи менеджера:
1. Помочь настроить пользователю внешний вид модулей в пакете.
2. Помочь пользователю выбрать нужный подграф в графе пакета.
3. Обеспечить взаимодействие между модулями (по просьбе одного модуля стартовать другие модули и передавать между ними управление).

Всё сдела, всё работает. Менеджер имеет несколько окон. Теперь другая задача. Нужно, чтобы главное окно с кнопками именю (alTop) всегда оставалось на экране и не перекрывалось окнами модулей из пакета при их запуске. Точно так же, нужно, чтобы вторичное окно, располагающееся внизу экрана так же было всегда на виду. А все модули пакета располагали бы свои окна между этими двумя окнами менеджера. При этом, пакет может работать на экранах с различным разрешением.

Можно, конечно, просчитывать в модулях размеры выделяемой им области экрана. Но хочется более красивое решение.

Если речь идёт об окнах в одном модуле, то проблем нет. Два окна с атрибутоами alTop размещаются автоматически друг под другом (сверху то окно, которое первым было создано). Но если окна принадлежать разным модулям (под модулем подразумевается EXE-программа со своим графическим интерфейсом), то последнее созданное окно закрывает окно менеджера.

Если я делаю окно менеджера всегда видимым (пример кода приведён выше), то окно модуля "тонет" под ним.

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

Есть три пути решения:
1) Сделать окна менеджера фиксированной высоты и в каждом модуле разворачивать формы в пределах оставшейся области. Но не кузяво.
2) При запуске модулей я имею хэндлы их процессов. Можно из менеджера получить доступ к их окнам (а их больше одного в каждом модуле) и из менеджера настраивать их размеры. Муторно и некузяво.
3) Ограничить для всех процессов область экрана. Красиво и кузяво. Так делал менеджер из пакета ПРОМТ (переводчик текстов). Так делает менеджер Microsoft с быстрым доступом к элементам офиса. То есть, окна менеджеров всегда видны, а остальные программы (все программы, любые) работают только в свободной области и думают, что это и есть весь экран. Вот я это сделать и хочу, но не знаю как.

Да вот, так ограничивает экран форма в MS Windows, которая находится (обычно) в самом низу экрана с кнопкой "пуск". Её же можно переместить вверх экрана, влево или вправо. Процессы, запускаемые в Windows не лезут на эту форму, а работают с оставшейся частью экрана как с полным экраном. Собственно, мне нужно, чтобы в менеджере было две таких формы: сверху и снизу экрана. Как это сделать?
В начало
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 28-Ноя-2003 23:28 
Цитата

Это дело не такое уж хитрое - заполняешь структуру TAppBarData (дескриптор окна, код информационного сообщения, позиция);
вызываешь SHAppBarMessage. Первый параметр - код операции /добавить, удалить, изменить etc - см. MSDN/, второй - TAppBarData
А объявлено все это в модуле ShellApi

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеПт, 28-Ноя-2003 23:29 
Цитата

Это дело не такое уж хитрое - заполняешь структуру TAppBarData (дескриптор окна, код информационного сообщения, позиция);
вызываешь SHAppBarMessage. Первый параметр - код операции /добавить, удалить, изменить etc - см. MSDN/, второй - TAppBarData
А объявлено все это в модуле ShellApi

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеПн, 01-Дек-2003 9:52 
Цитата

в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage
_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеПн, 01-Дек-2003 10:08 
Цитата

в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage
_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеПн, 01-Дек-2003 10:50 
Цитата

в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage
_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
RedArc
Гость







СообщениеПн, 01-Дек-2003 12:04 
Цитата

Gelios писал(а):
в дополнение хочу сказать, что могу заврта принести примерчик компонента, который инкапсулирует работу с AppBarMessage


Я был бы очень признателен.
В начало
RedArc
Гость







СообщениеПн, 01-Дек-2003 12:05 
Цитата

DrPass писал(а):
Это дело не такое уж хитрое - заполняешь структуру TAppBarData (дескриптор окна, код информационного сообщения, позиция);
вызываешь SHAppBarMessage. Первый параметр - код операции /добавить, удалить, изменить etc - см. MSDN/, второй - TAppBarData
А объявлено все это в модуле ShellApi


Ok. Попробую.
В начало
RedArc
Гость







СообщениеПн, 01-Дек-2003 16:41 
Цитата

Ни на одном русском форуме ничего не нашёл. В FAQ то же глухо. На сайтах с MSDN по-русски - тишина. На сайте MicroSoft есть описания, но нет примеров. Однако нашёл форум, где очень много примеров на любой случай жизни. Буду копаться там. Посмотрите, может кому тоже будут интересны эти сайты:

http://www.mamma.com - очень хороший поисковик для программистов
http://www.delphipraxis.net - огромное количество примеров
В начало
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеВт, 02-Дек-2003 7:22 
Цитата

обещанный компонент
_________________
нельзя давать всем всего, ибо всех много, а всего мало


Последний раз редактировалось: Gelios (Вт, 02-Дек-2003 7:34), всего редактировалось 1 раз
В начало
Посмотреть профиль Отправить личное сообщение
RedArc
Гость







СообщениеВт, 02-Дек-2003 18:27 
Цитата

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 возвращается обратно в приложение.

Не кузяво, но кое-как выкрутился. Хотя было бы лучше решить эти две проблемы по-человечески.
В начало
RedArc
Гость







СообщениеВт, 02-Дек-2003 19:20 
Цитата

Gelios писал(а):
обещанный компонент


Это не совсем компонент. Это пример работы с AppBar.
Однако компилируется, но работать отказывается:



Жмём Ok и смотрим:

В начало
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеСр, 03-Дек-2003 7:56 
Цитата

мда действительно...
там один класс можно оформить как компонент...
а есть возможность прогнать его на Делфи 5?

_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Gelios
Oracle-вый маньяк, Админ


Возраст: 37
Знак зодиака: Водолей
Зарегистрирован: 10.03.2005
Сообщения: 6141
Откуда: Яблочный рай
СообщениеСр, 03-Дек-2003 8:01 
Цитата

мда действительно...
там один класс можно оформить как компонент...
а есть возможность прогнать его на Делфи 5?

_________________
нельзя давать всем всего, ибо всех много, а всего мало
В начало
Посмотреть профиль Отправить личное сообщение
RedArc
Гость







СообщениеСр, 03-Дек-2003 12:36 
Цитата

Gelios писал(а):
мда действительно...
там один класс можно оформить как компонент...
а есть возможность прогнать его на Делфи 5?


Я как раз и работаю на Delphi 5 Счастлив
Пробовал перейти на более поздние версии Delphi, но куча нужных мне компонент не переносится. Так вот и сижу на пятом.

Ошибки, о которых я написал, возникли именно на пятой дельфе. На более поздней может их и не быть.
В начало
Показать сообщения:   
Страница 1 из 2 На страницу 1, 2  След.
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100