The Russian Electronic Developer Magazine | |
Русский электронный журнал разработчика | |
БОЛВАНЪ - ...деревянная или иная вещь,
по которой должно отлить металическую,
образецъ на льякъ...
(Даль В.И. Толковый Словарь...)
Честно говоря, мои муки при изучении программирования на C для OS/2 были бы значительно меньшими, если бы ToolKit от IBM вместо пустых отвлеченных примеров (да еще и написанных в разных стилях) содержал некоторое количество хорошо комментированных работающих заготовок программ.
По моему мнению, даже отсутствие хорошей документации (справочники-то в ToolKit-е все-таки есть ;-)) не является такой уж непреодолимой преградой. Все это - дело наживное, тем более теперь - в условиях почти вездесущего Internet-а (и все-таки не могу не отметить книжку Фроловых - кое-что в голове помогла привести в систему).
Программирование же по принципу "делай как я" позволяет достаточно быстро достичь желаемых результатов, но только при наличии хороших примеров.
Что и послужило поводом к написанию данной статьи (не претендуя на истину в последней инстанции, надеюсь, что мой пример хороший :-)). Посвящена она не очень внятно излагаемой в документации проблеме минимизации диалогов.
В самом деле, как быть, если главное окно Вашей программы должно представлять из себя диалог? И при этом оставаться полноценным главным окном, т.е. иметь собственную иконку, возможность изменять свои размеры, правильно минимизироваться, максимизироваться и восстанавливать свои размеры, присутствовать в списке окон и т.д., и т.п.
Если кратко изложить рекомендации от IBM (см. Redbooks OS/2 V2.0 Volume 4: Application Development (2)), то они сводятся к следующему:
- WinDlgBox() создает модальный диалог. Его нельзя минимизировать по определению;
- для создания немодальных диалогов предлагается два пути:
1). создать главное окно функцией WinCreateStdWindow() и самостоятельно разместить
на нем элементы диалога в виде дочерних окон;
2). использовать для загрузки диалога из ресурсов функцию WinLoadDlg(), а затем сделать его видимым с помощью функции WinShowWindow() или WinSetWindowPos().
Первый путь прост в понимании, но утомителен в программировании. Кроме того, приложение будет намертво привязано к форме диалога, т.е. даже простое изменение положения какого-либо элемента диалога будет требовать перекомпиляции программы.
Второй путь более привлекателен (в силу простоты создания диалога и возможности написания программ, независимых от формы диалога) и IBMеры сразу же предлагают использовать его, скромно умолчав "о всего-то сотне километров трясины, скал и непроходимых джунглей, кишаших голодными дикими зверями" (с) не помню чей.
Результаты моих скромных изысканий на этом пути представлены ниже в виде исходного текста программы Болван диалоГовый (коротко, БГ). Я постарался написать к нему достаточно подробные комментарии и осветить все темные места. Примерно так, по моему мнению, должны были бы выглядеть программы-заготовки, которых мне так не хватало.
Коротко о том, что имеет и умеет БГ:
- не зависит от формы диалога (диалог в ресурсе);
- имеет все атрибуты фрейма, в том числе, свою иконку, которая отображается в соответствующих местах (меню и таблицу акселераторов тоже можно грузить из ресурсов - здесь опущено, чтобы не перегружать текст);
- отображается в списке окон;
- реагирует на изменение размеров окна;
- умеет правильно максимизироваться, минимизироваться и восстанавливать положение и размеры окна (в том числе, и при максимизации из минимизированного положения);
- при изменении размеров окна выравнивает позиции элементов диалога (тех, о которых знает);
- при выходе запоминает свое положение и размеры, восстанавливая их при следующем старте (в том числе, и минимизированное).
В прилагаемом архиве (boldy.zip) находятся:
- исходный текст БГ (boldy.c)
- заголовки БГ (boldy.h)
- ресурсы БГ (boldy.rc)
- диалог БГ (boldy.dlg)
- командный файл для замены ресурсов в EXE-модуле БГ (rcboldy.cmd)
- командный файл для удаления записи о параметрах окна БГ
из OS2.INI (deboldy.cmd)
- иконка БГ (boldy.ico)
- исполняемый файл БГ (boldy.exe) - скомпилирован Watcom 10.0
Сознательно опускаю файл определений (*.def) - каждый может написать его сам - только
добавлю, что под стек надо выделить не меньше 16K.
Интересные ссылки:
Услуги юриста адвокат стоимость услуг гражданских и уголовных адвокатов.
Комментариев к странице: 0 | Добавить комментарий
Редактор: Дмитрий Бан
Оформление: Евгений Кулешов