IZONE - http://www.izcity.com/ - бесплатный софт, вэб-сервисы, ресурсы для раскрутки, свежие номера журнала "Internet Zone".

 IZONE 


Окна своими руками

К.И. ЯКОВЛЕВ (jki_home@hotmail.com)

Предлагаю вашему вниманию статью о программировании под Windows. Всем любителям аббревиатуры "Must Die" рекомендуется дальше не читать - все равно ничего не поймете. Не потому, Боже упаси, что тупые, а потому, что интерес к системе, для которой пишется программа, обязательно должен быть конструктивным. Не обязательно ее любить - это ОС, а не женщина, но желание понять логику, заложенную в продукт разработчиками, необходимо. При подходе "Это же ужасно по-тупому все сделано" - то, что вы сваяете, действительно, будет крайне непривлекательным. И тупым.

Теоретическое изложение сопровождается примером. Написан он на C, именно на C, а не на C++, в том смысле, что мной не используются средства объектного программирования. И делается это специально для тех, кому ООП кажется чем-то недосягаемым и непостижимо сложным. Хотя по внутренней логике Windows - во многом "объектно ориентированная" система. В качестве примера использовался не "Hello World!", как в большинстве учебников, - из принципиальных соображений. По-моему, для создания программы, выводящей на экране монитора такого рода строку, нет нужды осваивать какую бы то ни было систему программирования. Проще всего это делается из форта: ."Hello World!" или бейсика: РRINT "Hello World!", из bat-файла: ECHO Hello World! или из DOS'овского отладчика DEBUG:

 A100
 MOV AH,9
 MOV DX,1B
 INT 21
 RET
 db "Hello World!",0D,0A,7,'$'
 

Получилось? Сколько байт занимает программа? И для этого предлагается компилировать полмегабайта одних только h-файлов! Расстрел воробьев межконтинентальными ракетами!
Посему предлагаемая вам разработка представляет собой простенький такой скринсэйвер. По черному экрану летает, отражаясь от краев, картинка и кое-где выскакивают текстовые фрагменты. Еще тот шедевр, но по крайней мере, для иллюстрации сойдет.
Итак, чем же программирование для Форточек и DOS различаются друг от друга? Прежде всего, DOS - система однозадачная. То есть программа, которая в данный момент выполняется, получает в свое безраздельное распоряжение все ресурсы системы и имеет полное право делать с ними все, что душеньке угодно. Конечно, желательно, чтобы после завершения все вернулось на круги своя, если только изначально не ставилась другая цель. Кстати, во время работы существует установка: все, что программа делает с системой, правильно, если это целесообразно.
По сути сама DOS (дисковая операционная система) на 80-90% - просто единообразная система ввода/вывода. Примерно из 100 функций последних версий две функции - загрузки/запуска программ, три - завершения, три - управления памятью, еще несколько сервисных, а все остальное, включая монстрообразную 44H (огромнейший набор сервисов), ввод/вывод.
Соответственно, DOS-программа работает по собственному алгоритму и только в исключительных случаях обращается к ОС для выполнения определенных функций. Или даже не к DOS, а к BIOS. Или напрямую к контролерам через порты. В общем, она - ЕДИНСТВЕННАЯ, ей все можно. И это хорошо. Настолько, что появившийся в i80286 защищенный режим процессора так и не был в этих системах востребован. Настолько, что еще в 1995-1996 г.г., в эпоху победного шествия Pentium/6x86/K5, многие игры разрабатывались под DOS - и никакие преимущества защищенного режима не окупали столь замечательной возможности непосредственно использовать все ресурсы машины.
Но время идет, появляется 80386, затем 486, игнорировать все более реальные преимущества защищенного режима (а он при переходе от 286 к 386 существенно расширил свои возможности) становится все более неразумным - и вот настала время новых ОС. Возможно, на первых порах одна из причин особой популярности MS Windows - появление "Операционной оболочки" над DOS, то есть всегда можно было вернуться в DOS (а не в какой-нибудь режим совместимости и эмуляции).
Но время идет, за всем не угонишься, корректно поддерживать все нововведения становится все труднее, поэтому приходится отказываться даже от того, что стало привычным. Первыми пали жертвой технического прогресса реальный режим (8086-совместимый) в Windows 3.1 и стандартный (80286-совместимый) в Windows 3.11. А вот за DOS цеплялись до последнего, даже ценой стабильности системы (кажется, Win NT никто "Must Die" не называет - так вот, в ней DOS'а НЕТ! - что является одной из причин ее большей стабильности). Но уже в Windows-95 OSR2 запускается не оригинальный DOS, а только DOS-подобный компонент Windows, а в Windows Me, кажется, исчезнет и он. MS-DOS уходит в мир преданий, к монохромным дисплеям и текстовому режиму. Вместе с ним покидает нас и столь сладкое для программера безраздельное обладание машиной.
Когда-то, лет 15 назад, я наблюдал бескомпромиссный (наподобие форумских дискуссий The Bat! contra Outlook Express) спор двух студентов, работавших на ЭВМ разных классов. Поклонник Д3-28 (нечто среднее между современными персоналками и большим настольным калькулятором) доказывал приверженцу БЭСМ-6 (мощная и современная по тем временам машина, с системой удаленного доступа), что имеет большую власть над своей машиной. И нашел, наконец, неопровержимый аргумент: он может ее ВЫКЛЮЧИТЬ И НАКРЫТЬ ЧЕХЛОМ! Итак, теперь программировать придется в "Must Die" даже тем, кто его люто ненавидит. А там "выключить и накрыть чехлом" нельзя. А что же можно? Не расстраивайтесь, очень многое!
Так как Windows - многозадачная ОС, идеология ее взаимодействия с вашей программой поменялась очень сильно. Теперь система активна, и она не только берет на себя всю работу с периферией, но и организует взаимодействие задач и составляющих их процессов. В соответствии с названием ОС и идеологией графического оконного интерфейса, не удивительно, что каждому процессу назначается ОКНО. Любая Windows-программа имеет хотя бы одно главное окно. Взаимодействие окон-процессов и ОС идет наряду с механизмом вызова функций и СООБЩЕНИЙ. Адресованные окну сообщения обрабатываются ФУНКЦИЕЙ ОКНА.
Это напоминает механизм резидентных программ в DOS - модуль инициализации устанавливает атрибуты главного окна и регистрирует его в ОС, подобно тому, как модуль инициализации резидентной программы DOS перенаправлял на функции-обработчики определенные прерывания, резервировал память под эти обработчики и их данные и завершался. В чистом виде резидентных программ в Windows нет (в многозадачной системе не нужно прежде завершать одну программу, чтобы сервисы были предоставлены другой - надо только зарегистрировать эти сервисы в ОС и ждать, когда к ним дойдет очередь), зато выполняющие их роль (предоставление сервисных функций) библиотеки DLL автоматически подгружаются в память, когда вновь запускаемая программа заявляет, что нуждается в сервисах данной библиотеки, и выгружаются, когда необходимость в них отпадает.
В DOS'е ничего подобного не было! Только не ловите меня на слове, не вспоминайте об оверлеях и стандартных функциях систем программирования - это совсем не то же самое. Оверлей подгружался по требованию, но был доступен только одной программе (впрочем, других-то и не было). А вот загруженная DLL доступна всем! Но пока оставим эту тему. А вот мимо чего мы не имеем право пройти, так это, мимо РЕСУРСОВ. Это особые данные, также включающиеся в особый раздел исполняемого модуля (*.EXE) и загружающиеся по мере необходимости. Они могут включать иконки, курсоры, битовые образы, меню, элементы диалоговых окон, текстовые строки и многое другое.
Если предоставляемый Windows выбор вас не устраивает, можно определить свои элементы. Они определяются отдельно от текста программы в виде файла с расширением .rc и обрабатываются специальным компилятором ресурсов в двоичный файл .res, а к исполняемой программе присоединяются на стадии редактирования связей.
Проницательный читатель, полагаю, уже задавался вопросом: "А зачем это все? Особенно текстовые строки?" Помнится, в DOS'е мне без всяких проблем удавалось включать текстовые строки в исходный текст программы. Разве в MD так нельзя? Тогда он еще раз "Must Die"!
И я включал! Оказывается, и в Windows такое возможно! Но как я уже говорил, ресурсы размещаются в отдельном разделе исполняемого модуля и могут быть из него извлечены (в системе Borland C++, которой я обычно пользуюсь, подойдет для этого случая и программа ResourceWorkshop), отредактированы независимо от исполняемого кода и вновь возвращены в исполняемый файл! Удобно, не правда ли? Именно так и делаются многие (особенно пиратские) неанглоязычные локализации. Правда, нужно, чтобы авторы заранее предусмотрели такую возможность - если программист подразумевал, что длина строки обязательно 37 символов, то ваша русско/украиноязычная строка в 43 символа, вполне вероятно, будет отображена неправильно. А если тот же программист, по совету проницательного читателя J, оформил ее не ресурсом, а включил в текст программы, то, как и в DOS, скорее всего, вы сможете заменить ее только строкой той же длины. А ресурсы меню, диалоговых окон и т. п. вообще не имеют аналогов в DOS!
Поскольку пришла пора переходить к примерам, оговорим некоторые моменты. Во-первых, я предлагаю вам пример, а не программный продукт! Тут используются ресурсы - текстовые строки и битовый образ. Далее - он проверен на работоспособность, но не более! Автор не берет на себя НИКАКОЙ ответственности, связанной с использованием или не использованием вами данного исходного текста, и не предоставляет никаких гарантий! Естественно, он не имеет никакого морального права ограничивать применение вами данного исходного текста, но теперь под вашу личную ответственность!

 > файл bcscsave.rc
 bcssBMP BITMAP trzssave.bmp
 STRINGTABLE
 BEGIN
1,"Не дающих получку осудят.\015Я ж без денег не делаюсь злей.\015ВСВЕТЛОМ БУДУЩЕМ денег не будет!
\015Мне сейчас уже стало светлей"
2,"Я согласен - и впредь не платите!\015Пусть шатает меня на ходу,\015Не кормите меня, не поите -
\015ВСЕ РАВНО Я НА СЛУЖБУ ПРИДУ!"
3,"Денег нет.Я не знаю причины.\015Почему не дают, лишь берут?\015Труд создал из меня ГРАЖДАНИНА,
\015для которого важен сам труд."
4,"День получки!Нет траурней даты.\015Просто НЕТ ее в этом году!\015Не платите аванс и зарплату -
\015ВСЕ РАВНО Я НА СЛУЖБУ ПРИДУ!"
5,"Не купить даже ""Сникерса"" в лавке.\015Мне доходы мои не видны.\015Впрочем (всем объясняю для справки)
\015Я ТРУЖУСЬ ДЛЯ ЗАЩИТЫ СТРАНЫ."
6,"НЕ ТОРГУЮ.НЕ ПРЕДПРИНИМАЮ,\015НЕ СЧИТАЮ РУБЛИ,НЕ КРАДУ-\015Сам виновен,я все понимаю...
\015ВСЕ РАВНО Я НА СЛУЖБУ ПРИДУ!"
 END
 > конец файла bcscsave.rc
 

Как видите, все достаточно просто: идентификатор, тип ресурса, значение. Учитывая специфику решаемой задачи, даже слишком, посему вот еще примерчик, но посложнее - с меню, диалоговыми окнами и т. п.

> файл kpnrtu.rc
 #include <windows.h>
 #include "kpnrtu.h"
 KpMenu MENU
 BEGIN
MENUITEM "Calc",IDM_CALC
POPUP "Mode"
BEGIN
MENUITEM "Арифметическая",IDM_MODE_A
MENUITEM "Tригонометрическая",IDM_MODE_T
MENUITEM "Экспоненциальная",IDM_MODE_E
MENUITEM "Double",IDM_MODE_D
MENUITEM "Fractions",IDM_MODE_F
END
POPUP "Edit"
BEGIN
MENUITEM "Matrix",IDM_ED_A
MENUITEM "Vector",IDM_ED_B
MENUITEM "Param",IDM_ED_P
MENUITEM "Names",IDM_ED_N
END
POPUP "Clipboard"
BEGIN
MENUITEM "Copy",IDM_TOC
MENUITEM "Paste",IDM_FROMC
END
MENUITEM "About",IDM_ABOUT
MENUITEM "Quit",IDM_EXIT
END
HotKeys ACCELERATORS
BEGIN
VK_F9,IDM_CALC,VIRTKEY
VK_F10,IDM_EXIT,VIRTKEY
"C",IDM_TOC,VIRTKEY,NOINVERT,CONTROL
"c",IDM_TOC,VIRTKEY,NOINVERT,CONTROL
VK_INSERT,IDM_TOC,VIRTKEY,NOINVERT,CONTROL
END
InputDiaBox DIALOG 20,20,300,65
STYLE WS_DLGFRAME|WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU
CAPTION "Data Input Dialog Box"
FONT 8,"Arial Cir"
BEGIN
EDITTEXT IDD_EDIT 10,20,280,12,ES_AUTOHSCROLL|WS_TABSTOP
DEFPUSHBUTTON "Okay",IDD_OK,20,40,36,18
PUSHBUTTON "Cancel",IDD_CANCEL,150,40,36,18
LTEXT "Info String",IDD_INFO,10,8,40,12
END
 KpIcon ICON trizico.ico

 > конец файла kpnrtu.rc

И это оказалось вам под силу. Директивы включения, как в обычном С (во включаемых файлах описаны используемые константы), заголовки ресурсов, иерархические структуры, строящиеся посредством вложенных BEGIN... END.
(Продолжение следует)

Источник: http://www.mycomp.com.ua/

 


Copyright © "Internet Zone"info@izcity.com
Копирование и использование данных материалов разрешается только в случае указания на журнал "Internet Zone", как на источник получения информации. При этом во всех ссылках обязательно явное указание адреса вэб-сайта http://www.izcity.com/. При наличии у копируемого материала авторов и источника информации - их также нужно указывать, наряду со ссылкой на нас.