Глава 2.
Создание приложений на базе библиотеки классов MFC
Лучше делать новости, чем рассказывать о них.
Уинстон Черчиль
Для того чтобы написать какое-либо приложение, прежде всего необходимо создать проект. Разработчики фирмы Microsoft постарались (уже давно) и создали специальные мастера, которые позволяют — после ответов на ряд вопросов — получить работающий каркас приложения. Вам остается только наполнить его конкретным содержанием. Вызвав диалог New, выберите в нем тип приложения MFC AppWizard (exe), а в поле Project Name — имя создаваемого приложения FrameWork. После нажатия кнопки ОК запустится мастер AppWizard, и вы увидите его первое окно (рис. 2.1).
Рис. 2.1. Первое окно мастера AppWizard
В этом окне представлены все три основных типа приложений Windows: однодокументное, многодокументное и на базе диалога.
Примечание
Обратите внимание на флажок Document/View architecture support? (Нужна поддержка архитектуры документ/представление?), которого вы не увидите в версиях Visual C++ ниже 6.0. В них приходилось вручную удалять фрагменты созданного каркаса приложения, поскольку зачастую автоматически подключаемая поддержка этой архитектуры (безусловно, очень удобной и полезной) не нужна.
Сбросьте флажок Document/View architecture support? и выберите переключатель Single document, поскольку нас сейчас интересуют самые основы
Примечание
Оставьте без изменения поддержку английского языка, т. к. русского все равно нет и неизвестно, когда появится.
Смело дважды нажимайте кнопку Next, чтобы перейти к третьему окну мастера, поскольку во втором окне задается поддержка для работы с базами данных. В третьем окне сбросьте флажок ActiveX Controls (элементы управления ActiveX) и переходите к следующему окну (рис. 2.2), в котором предлагается выбор некоторых дополнительных возможностей.
Примите установки, предложенные по умолчанию, и нажмите кнопку Advanced... (Дополнительно...), чтобы выбрать стили окна (рис. 2.3).
Для демонстрации влияния этих стилей, которые подробно будут описаны ниже, установим флажок Minimized (Свернутое).
Рис. 2.2. Четвертое окно мастера AppWizard
Рис. 2.3. Установка стиля основного окна приложения
Вернитесь к четвертому окну мастера и можете нажать кнопку Finish (Готово), поскольку в остальных окнах мы принимаем установки по умолчанию. На экране появится окно с информацией о проекте (рис. 2.4).
Примечание
Заданное вами имя проекта служит основой для имени класса приложения, изменить которое можно в пятом окне мастера.
Рис. 2.4. Информация о вновь созданном проекте
После того как вы нажмете кнопку ОК, мастер создаст для вас каркас приложения и завершит свою работу.
Постройте исполняемый файл, выполнив команду Build, и запустите его. На экране ничего не изменится, но на панели задач появится кнопка минимизированного приложения. Приложение FrameWork строит обычное, традиционное окно, хорошо знакомое всем пользователям системы Windows (рис. 2.5).
Его можно перемещать по экрану, закрыть, минимизировать (уменьшить до размера пиктограммы) или максимизировать (увеличить до размеров экрана), а также изменять его размер. Основное назначение этого примера заключается в том, что он позволяет нам познакомиться с основными принципами, которые положены в основу построения программ на базе библиотеки классов MFC.
Программа имеет три класса объектов: CFrameWorkApp, CMainWnd и CChildWnd. Первый позволяет создать объект "приложение", второй — объект "фрейм окна", и третий — сам объект "окно".
Каждое приложение, использующее библиотеку MFC, может содержать только один объект "приложение", который конструируется вместе с другими глобальными объектами C++ (определение — CFrameWorkApp theApp) и уже доступен, когда Windows вызывает функцию WinMain. На данном этапе знакомства — это самый существенный момент для успешного программирования под Windows на базе MFC.
Отвлечемся немного от основной темы, чтобы рассмотреть вспомогательные, но тесно связанные с программированием на Visual C++ вопросы.
Примечание
Библиотеку классов MFC можно использовать не только для написания полноценных Windows-приложений, но и в консольных приложениях.
Рис. 2.5. Основное окно приложения FrameWork
Соглашения об именах библиотеки MFC
В качестве префикса, обозначающего имя класса, библиотека MFC использует заглавную букву С от слова "class" (класс), за которым идет имя, характеризующее его назначение. Например, CWinApp — класс, определяющий приложение, CWnd — базовый класс всех оконных объектов, CDialog — класс окон диалога и т. д. Мы также будем придерживаться этого соглашения в приводимых примерах. Например, программа FrameWork содержит определения трех классов: CFrameWorkApp, CMainFrame и CChildWnd.
Для имен методов классов используется три способа. При первом способе имя объединяет глагол и существительное, например, Loadlcon (Загрузить пиктограмму) или DrawText (Нарисовать текст). При втором, имя метода состоит только из существительного, например, DialogBox (Блок диалога). Для функций, предназначенных для преобразования одного типа в другой, обычными являются такие имена, как XtoY(из X в Y).
Для членов классов библиотеки MFC принят следующий способ назначения имен: обязательный префикс m_ (от class member — член класса), затем идет префикс, характеризующий тип данных, и завершается все содержательным именем переменной, например, m_pMainWnd, где р — префикс, описывающий указатель (для переменных не членов класса префикс m_ не используется, чтобы можно было отличить обычные переменные от элементов любых классов, а не только классов библиотеки MFC). В своих примерах я придерживаюсь аналогичного способа формирования имен, и вам рекомендую поступать также.
Если вы посмотрите начало любого файла, то заметите, что одной из первых в них стоит строка #include "stdafx.h". Этот включаемый файл служит для подключения к программе необходимых ей библиотечных файлов. Когда вы будете писать большие приложения, вам обязательно потребуется использование заранее откомпилированных заголовочных файлов, что поможет существенно сократить требуемое время компиляции. Прекомпилированные заголовки удобны, если у вас есть несколько заголовков, которые должны быть включены во все или в большинство ваших исходных файлов. Однако их использование полезно только в том случае, если сами они не меняются между компиляциями.
Чтобы продемонстрировать вам способ сокращения времени компиляции, мы использовали прекомпилируемый файл <stdafx.h>, который должен включать в себя все наиболее часто используемые заголовочные файлы. В данном случае это и файл <afxwin.h>, содержащий описания основных классов библиотеки и сводящий воедино все включаемые файлы, необходимые для базового функционирования MFC, и <afxext h> содержаший описания классов общего назначения, макросы, базовые типы данных MFC и подключающий стандартные библиотеки ( run-time library) языка C, и <afxdtctl.h> и <afxcmn.h>, где находятся компоненты поддержки стандартных и совместимых с Internet Explorer 4 элементов управления По мере изложения материала мы ближе рассмотрим классы, определяемые во включаемых файлах MFC. Здесь же отметим изменения, которые претерпел основной включаемый файл Windows <windows.h>.
Как и раньше, каждая Windows-программа должна содержать этот файл. Отличие же заключается в том, что в своем последнем виде он уже не представляет собой огромного "монстра", а разбит на четыре сравнительно небольших файла: <windef.h>, содержащий определения базовых типов, <winbase.h>, описывающий базовые функции 32-разрядного API, <wingdi.h> и <winuser.h>, включающие объявления процедур GDI и USER, а также определения констант и макросов для соответствующих модулей системы.
В заключение темы стандартных включаемых файлов скажу несколько слов об определении
idefine VC_EXTRALEAN
применение которого позволяет исключить из процесса компиляции редко используемые части заголовочных файлов Windows (для С- и С++-программ, не обращающихся к MFC, определение имеет вид #defme WIN32 EXTRA_LEAN).