Прежде чем начать заниматься
собственно программированием на VC++, давайте сделаем обзор инструментов
и особенностей, которыми мы можем при этом пользоваться.
Программа на VC++ — а в сущности,
любая программа для Windows — обычно представляет собой фрейм, который
является основным окном программы. Это окно может быть "правильным" (то
есть содержать в себе все необходимые элементы — меню, "кнопки", полосы
прокрутки и т.п.), а может представлять собой просто диалоговое окно, как
в двух примерах этой главе. Внутри этого окна программа представляет пользователю
всю необходимую информацию, причем под информацией в данном случае понимаются
не только данные, то есть картинки и документы, но и технические элементы
программы — меню, полосы прокрутки и т.п. В программе на VC++ (по крайней
мере в такой, которая написана с использованием MFC) все элементы являются
объектами (не забывайте о том, что мы используем слово "объект" в строгом
объектно-ориентированном смысле). Кроме того, VC++ сам по себе является
объектно-ориентированным языком. Таким образом, объекты играют ключевую
роль во всем, что мы только ни делаем. Повторимся: за редким исключением
все элементы программы — данные, звуки, изображения, меню и т.д. — являются
создаваемыми вами объектами.
Объекты ведут себя...
В состав объектов входят функции-члены,
которые определяют поведение объекта. Эти функции управляют как самим объектом,
так и данными, с которыми этот объект работает. Функции одного объекта
могут влиять на другие объекты.
Объекты наследуют...
Когда вы определяете новый
объект, в большинстве случаев вы просто порождаете его из уже существующего
объекта с необходимыми вам свойствами. Новый объект сразу после создания
уже имеет ("наследует") все свойства и возможности старого объекта. Таким
образом, вы не тратите время на изобретение велосипеда. После создания
нового объекта вы только дополняете его код новыми функциями, которые вам
необходимы, — все старые функции и свойства у него уже присутствуют.
События вызывают сообщения...
Любое действие пользователя
во время выполнения Windows-программы вызывает генерацию сообщения. Такое
сообщение содержит в себе информацию о том, что именно сделал пользователь
(нажал клавишу, щелкнул мышью и т.п.), а также дополнительную информацию
—код нажатой клавиши, координаты курсора мыши и т.п. Некоторые сообщения
(например, от таймера) генерируются самой системой.
Объекты реагируют на сообщения...
Любой объект в программе для
Windows обладает способностью реагировать на сообщения. В случае объекта
MFC (пли полученного из такого объекта) реакции на определенные сообщения
уже имеются заранее. Прочие реакции вы добавляете самостоятельно в виде
функций обработки сообщений (message-handling functions).
Хороший стиль кода помогает...
При описании любого языка
один момент часто упускают из вида, и происходит это потому, что этот момент
— не часть языка, а скорее, философия. Стиль, оформление кода — все это
помогает разобраться во внутренней структуре программы и определить пути,
по которым идет ее исполнение в том или ином случае. Цифровой компьютер
выполняет команды, из которых состоит программа, в определенной последовательности.
Эта последовательность задается командами перехода, при помощи которых
создаются циклы и различные "ветви" алгоритма. Вы в своей программе можете
использовать сколько угодно таких команд, и до тех пор, пока вы соблюдаете
синтаксические правила языка, компилятор нисколько не заботится о внешнем
виде вашего кода. Об этом должны заботиться вы сами, так как если вы не
можете разобраться в своей программе, то скорее всего, она работает не
так, как вы предполагаете. А если даже и работает, то внести в нее изменения
чрезвычайно сложно.
Наиболее очевидный элемент
стиля кода — это отступы, то есть промежутки между левым краем экрана или
листа бумаги и началом очередной строки кода. У каждого программиста есть
свое мнение относительно использования отступов, и так как ни один учебник
программирования не дает сколько-нибудь ясных указаний на этот счет, мы
будем пользоваться своей системой. Впрочем, все это совершенно не касается
собственно мультимедиа, поэтому скажем только, что мы старались использовать
такую систему, которая облегчила бы понимание текста программы. В этой
книге вы не найдете ни одной, даже самой крошечной, программы, в которой
не использовались бы отступы. Хотя, конечно, наши представления о "понятности"
кода могут существенно отличаться от ваших. Мы рекомендуем вам следовать
двум правилам: (1) разработайте сами или освойте определенный стиль записи
текста программы и (2) применяйте его последовательно! Непоследовательность
в стиле кода еще хуже, чем отсутствие всякого стиля, так как не только
не помогает вам, но даже может ввести в заблуждение.
Второй важный элемент стиля
кода — это "видимость" объектов, то есть область их определения и действия.
Термин "видимость" определяет степень, в которой функции и переменные объекта
видны или доступны другим частям программы. Язык C++ имеет довольно строгие
правила на этот счет, и если вы их плохо помните, обратитесь к любому описанию
языка — мы не будем тратить время на эти детали. Представляйте себе вашу
программу в виде отдельных "коробочек", каждая из которых ограничивает
определенные объекты и может содержать в себе другие "коробочки". Когда
вы заканчиваете программу ("закрываете коробку"), за ее пределами не должно
быть видно ничего лишнего, кроме того, что необходимо для ее запуска. Точно
такое же правило действует и на всех остальных уровнях — на каждом из них
должно быть видно то и только то, что вам действительно необходимо. Каждый
раз, когда вы определяете новую переменную или функцию, подумайте, где
вы будете ее использовать, и поместите в как можно меньшую по объему "коробочку".
Используйте "private" чаще, чем "protected", a "protected" чаще, чем "public".
Исключая переменные "public" и передавая информацию в виде аргументов,
вы сделаете свой код более понятным и удобным. Помните, что структурное
программирование — это искусство прятать детали. Мы старались по возможности
придерживаться этого правила.
Мультимедиа в VC++
Если быть честным, то VC++ не содержит в
себе ничего такого, что предназначалось бы исключительно для мультимедиа.
Большинством свойств этого, языка вы будете пользоваться независимо от
того, какого рода программу вы пишете. Но некоторые особенности, а скорее,
объекты MFC, оказываются особенно полезными именно для мультимедиа. Попробуем
привести несколько примеров.
Чем чаще всего занимается мультимедиа-приложение?
Правильно, рисует на экране красивые картинки. Исходя из этого, можно предположить,
что в этой книге мы часто будем иметь дело с экранными окнами, в которых
будет выводиться та или иная информация. При этом мы будем пользоваться
базовым классом CWnd, в котором содержится почти вся необходимая нам "оконность".
Мы будем самостоятельно создавать из него новые классы и пользоваться уже
созданными.
Кроме того, очень часто мы будем пользоваться
графическими функциями и непосредственным выводом информации на дисплей.
И здесь классы MFC не бросают нас на произвол судьбы. Контексты устройств
(device contexts) обеспечивают взаимодействие вашей программы с устройствами
печати и отображения и управляются классом CDC и его производными. Функции
рисования, вывод шрифтов и операции с битовыми изображениями выполняются
классами, производными от класса CGdiObject.
Еще один важный момент в любом мультимедиа-приложении
— это хранение используемых данных. MFC и здесь приходят на помощь, обеспечивая
ряд классов для хранения чего угодно — от байтов и строк до списков и изображений.
Мы могли бы продолжать перечислять удобства
MFC еще очень долго, но не хотим превратить эту книгу в подобие рекламной
радиопередачи. Напомним еще раз только одно: чтобы получить как можно больше
от VC++ (независимо от того, какую программу вы на нем пишете), вы должны
быть хорошо знакомы с базовыми классами Microsoft. Очень неприятно (мы
говорим это на основании собственного опыта) потратить несколько часов
или дней на программирование какой-либо операции и потом обнаружить, что
такая операция все это время присутствовала среди классов MFC.
Но довольно разговоров! Пора браться за
дело. Давайте проверим, насколько удобны классы MFC для создания мультимедиа-приложений.
Примечание: основная функция базового класса заключается в том, что он служит основой для создания других классов. Объекты базового класса используются в прикладных программах очень редко (если вообще используются).