MFC под колпаком или создание MFC приложения без App WizardИсточник: cyberguru
Чаще всего создание нового MFC приложения поручается визарду (MFC App Wizard). Визард генерирует основной скелет приложения, который, мы в последствии заполняем нужным кодом, в конечном счёте получая готовое приложение.Получая такую заготовку для нашей будущей программы, сразу бросается в глаза большое количество кода, который отчасти кажется нам немного хитрым, а отчасти и непонятным, да плюс ко всему постоянно присутствует ощущение, что приличное количество кода скрыто от наших глаз. Предлагаю пролить немного света на таинственные участки кода, который для нас генерирует заботливый визард. А заодно и посмотрим как самостоятельно, без помощи визарда, создавать MFC приложения. Итак, немного о скрытом кодеКаждое 32 битное Windows приложение имеет два основных элемента: функции WinMain и WndProc. Ваша программа обязательно должна как минимум одну WinMain, плюс WndProc для каждого окна. Хотя MFC и создаёт за их за Вас, но всё-таки иметь представление о них желательно. Основная задача WinMain - это запуск приложения. Как только приложене запущено, Windows сразу же помещает сообщения Вашего приложения в очередь сообщений. Чтобы получить эти сообщения от операционной системы и обработать их, WinMain делает три API вызова. Первый - это GetMessage, задача которого получить сообщение. Затем TranslateMessage для подготовки необходимых преобразований сообщения. И в звключение WinMain вызывает DispatchMessage, который говорит операционной системе какому WndProc отправить сообщение для обработки. Как только WndProc получает сообщение, то сразу начинает пропускать через соответствующие обработчики, чтобы выполнить определённые действия, необходимые для данного сообщения. Ваша задача, как программиста - написать данные обработчики. Простейшее MFC приложение: Менее 20-ти строк кодаДалее мы рассмотрим простейшую структуру MFC приложения. Так как наша задача обеспечить присутствие в приложении WinMain и WndProc, то необходимо унаследовать для этих функций MFC классы. Класс приложения мы будем наследовать от MFC класса CWinApp. CWinApp все необходимые функции и переменные для инициализации, запуска и закрытия приложения. CWinApp так же содержит указатель m_pMainWnd, который указывает на объект класса основного окна. Каждое MFC проложение имеет один и только один объект, наследованный непосредственно от CWinApp. В примере, приведённом ниже, он имеет название "CMyApp." Класс, обслуживающий окно, будем наследовать от CFrameWnd. CFrameWnd так же имеет все необходимые функции и переменные, необходимые для создания и управления окнами. Обратите внимание, что фактически создание объекта окна не влечёт за собой непосредственное создание самого окна, а только содержит в себе функцию Create(), необходимую для создания окна. Давайте посмотрим, что происходит при запуске нашей программы. Эти этапы можно отследить в приведённом ниже примере:
А вот собственно сам пример: #include <afxwin.h> Фактически окно будет больше. Интерфейс однодокументного (Single Document) приложенияКод, который генерируется визардом при создании однодокументного приложения (SDI), более сложен на первый взгляд, но работает всё по тем же принципам. Мы так же наследуем класс от CWinApp. И наследуем всё тот же класс управления окном от CFrameWnd. Однако, в данном случае, класс управления окном будет называться CMainFrame. Наш класс приложения так же имеет функцию InitInstance(), но выглядит она уже немного сложнее. Кроме всего прочего она содержит следующие строки: CSingleDocTemplate* pDocTemplate; Здесь объект приложения создаёт указатель на однодокументный шаблон и связывает его с новым объектом однодокументного шаблона. Мы видим, что в конструктор CSingleDocTemplate передаётся четыре параметра. Первый типа integer - это ID ресурса IDR_MAINFRAME. Следующие три параметра указывают на классы для документа, фрейма, и вида. Затем указатель на новый CSingleDocTemplate добавляется в список шаблонов документов, создаваемый объектом приложения. (В SDI приложении только один шаблон.) Ресурс IDR_MAINFRAME содержит:
Строка документа разбита на семь частей, отделённых друг от друга символом '\n':
Примерно так эта строка может выглядеть: ЗаключениеИтак, теперь Вы имеете большее представление, о том, что происходит после того, как даётся команда визарду сгенерировать новый каркас приложения, а так же можете в случае необходимости изменить некоторые участки сгенерированного кода по Вашему усмотрению. Например, если необходимо изменить размер и положение основного окна приложения, то достаточно немного изменить функцию Create( ). Если Вы замените в вышеприведённом примере код на следующий, то получите окно меньшего размера, расположенное в верхнем левом углу экрана. RECT x; Короче говоря, существует множество настроек и функций, с которыми можно поиграться. Конечно Вам совсем необязательно изменять код, генерируемый визардом, но чем больше Вы будете знать о том, какие процессы происходят в приложении, тем качественнее оно будет. |