Mfc под колпаком или создание mfc приложения без app wizard


Содержание

Mfc под колпаком или создание mfc приложения без app wizard

Процедура генерации каркаса приложения состоит из 6 шагов и заключительного информационного окна.

Передвижение происходит от шага к шагу кнопочкой Next, вернуться назад можно Back, в любой момент можно сгенерировать приложения с любого шага кнопкой Finish или плюнуть на все, выбрать Cancel и пойти, например, к подруге.

Step 1

Для начала Вы должны решить какой вид будет иметь Ваше приложение. Будет на базе диалогового окна либо будет на базе обычного окна. Если приложение будет диалоговым окном (например, как калькулятор в Windows), то в этом шаге установите опцию напротив Dialog bases. В противном случае вам надо решить будет ли в Вашем приложении одно окно SDI или много окон MDI. Одно окно это Single document, много окон это Multiple document. У вас естественно есть возможность выбрать один из трех вариантов. После этого опять надо решать будет ли Ваше приложение поддерживать технологию Документ — Вид — смотрите предыдущие шаги. Если будете проверьте галочку напротив Document/View architecture support?.

Step 2

Второй шаг отвечает за настройку работ с базами данных. Вообщем, наверно, мало программ, которые не работают с БД. Но если работа с БД вам не нужна, выбирайте None. Две опции ниже отвечают за то, как вы будете работать с БД. То есть, будете использовать CFormView или нет. Если доступ будет, но использовать производные от CFormView не будете, выбирайте Header files only. А вот если будете тогда Database view without file support. А вот если Вы собираетесь, работая с базами данных сохранять и восстанавливать документы на диск тогда ваша опция Database view with file support. Выбор последних двух опций приведет к необходимости указать источник данных.

Step 3

Этот шаг отвечает за поддержку документов OLE, которая сейчас называется немного в новом плане — ActiveX. Если ничего не надо — тогда ставьте None. А вот если необходима поддержка внедренных объектов, тогда ставьте Container. Для того, чтобы ваше приложение могли вставить в составной документ и само приложение не будет работать автономно. Внимание оно не будет работать само, только внедренное, тогда вам нужна опция Mini-Server. Для того, чтобы приложение и внедрялось и работало само выбирайте Full Server. Ну а если необходимо внедрение объектов и само приложение должно внедряться в другие, тогда уж выбирайте Both container and server. Для поддержки автоматизации установите Automation, а для использования ActiveX установите ActiveX Control. Кроме того, если вы собрались поддерживать составные документы надо сделать выбор будете ли Вы поддерживать составные файлы. Эта возможность описана в пунктах Would you like to support compound files? Там просто Yes или No.

Step 4

В данном шаге мы с Вами будет настраивать внешний вид приложения. Если нужна панель инструментов тогда Docking toolbar. Если строка состояния, тогда Initial status bar. Для организации механизмов предварительного просмотра нужно установить Printing and print priview. Для организации файла справки установить Context — sensitive Help. Для того, чтобы оформление приложения в стиле Windows 95 активизируйте опцию 3d control. Если Ваши приложение должно работать с электронной почтой и факсами тогда MAPI это Ваша опция. А для приложения работающего с Internet надо выбрать Windows Socket. Тип панели инструментов устанавливается в How do you want your toolbars to look?. А в опции How many files you like on you recent file list? установите количество последних открытых файлов, которые помнит программа. По нажатию на кнопку Advanced появится диалоговое окно. Самое главное в нем это установка расширения файлов File extension. На том же окне на вкладке Windows Style можно настроить тонкости внешнего вида. Это кнопки, толщину рамки и так далее.

Step 5

Пятый шаг отвечает за настройку работы с MFC. Если Вам нужны в генерируемом коде комментарии типа TODO: и другие, то в ответ на вопрос Would you like to generate source file comments? ответьте Yes please, что означает, конечно пожалуйста. Вопрос о том, как будут использоваться компоненты MFC звучит так How would you like to use the MFC library?. Мы в предыдущих шагах это уже обсуждали, так что дело за Вами.

Библиотека Интернет Индустрии I2R.ru

Малобюджетные сайты.

Продвижение веб-сайта.

Контент и авторское право.

Программирование на С и С++

Побродим по DataSet

В этой публикации рассказано как можно решить такую, тривиальную, на первый взгляд, задачу, как создание формы, в которой есть DataGrid для перемещения по таблице данных и поля ввода для редактирования. Также показано, как делать навигационные контролы для перемещения по DataGrid.

Шифруем в PGP

Многие наверное слышали про PGP, но может не все знают, что мелкософт также включил поддержку криптования в Windows. Из моего желания с этим разобраться и появилась эта программа.

Многозадачность в Windows

В этой статье использование многозадачности и многопоточности в Windows для программистов С++.

Мапишный Постмачтер или как включить поддержку почты в свою программу.

Программный интерфейс MAPI, о котором пойдет речь в этой статье, является одним из средств, позволяющим создавать различного рода приложения, не являющихся частью почтовых систем, но вместе с тем предоставляющих пользователю некоторые средства для работы с электронной почтой на платформе Windows.

Введение в C#

В этой статье рассказывается о новом языке программирования — C#, о его особенностях; целях и истории создания. Этот язык вобрал в себя все самое лучшее из существовавших до него языков. C# является основным языком программирования для платформы Microsoft.NET (Visual Studio 7.0).

Начало работы с C#

В данной статье описывается все, что необходимо для начала программирования на C#. Рекомендации по началу работы с C#. Установка необходимого ПО — Visual Studio.NET или .NET Framework SDK. Системные требования. Примеры написания и компиляции простых примеров.

Атрибуты и их использование в C#

Эта статья посвящена одной из возможностей .NET, называемой атрибутами. Атрибуты позволяют вам расширять метаданные, т.е. добавлять любую информацию о своем коде в исполняемый файл. Статья содержит обзор фундаментальных концепций и несколько простых и доступных примеров позволяющих понять основы предмета.

Использование индексаторов в C#

В данной статье рассматриваются индексаторы — это одна из новых возможностей языка C#, делающая его более удобным и гибким. Индексаторы позволяют вам рассматривать экземпляр класса как массив. В данной статье приводится серия примеров, позволяющая понять основные концепции и принципы работы с индексаторами.

Побродим по DataSet

В этой публикации рассказано как можно решить такую, тривиальную, на первый взгляд, задачу, как создание формы, в которой есть DataGrid для перемещения по таблице данных и поля ввода для редактирования. Также показано, как делать навигационные контролы для перемещения по DataGrid.


Шифруем в PGP

Многие наверное слышали про PGP, но может не все знают, что мелкософт также включил поддержку криптования в Windows. Из моего желания с этим разобраться и появилась эта программа.

Использование аттрибутов в C# — пример кода

Надеюсь, что данная публикация станет первой в серии примеров использования (учебных и реальных). Это то, что нужно рядовому разработчику при освоении новой технологии. Чем больше его база исходного кода из таких примеров(простых и хорошо написанных) — тем легче ему в нелегкой нашей работе :-)

Как получить список пользователей с сервера

Пример показывает, как пользоваться функцией NetQueryDisplayInformation, для получения специфической информации о пользователях, а так же представлен класс, который позволяет получить более общий доступ к данному сервису.

Распаковщик иконок

Наверное Вы иногда замечали, что в некоторых приложения сидят красивые иконки. И, наверное, Вам тоже хотелось поместить эти иконки в свою программу. Давайте посмотрим — как просто можно это сделать.

Механизм обработки сетевых событий в Winsock2

Обычно, при программировании сокетов под Winsock 1.1, используются стандартные и, надеюсь известные большинству программистов операторы. При этом оповещение о событии на сокете проходит через сообщения windows. Думаю, не секрет, что такой способ порождает массу проблем при разработке приложений. Однако можно воспользоваться другим методом — в обход сообщений Windows, а именно через события WSA (WSA Events).

Вычисление IP адресов через SNMP

Все мы когда-то начинали программирование в сети с простой операции определения IP адреса, принадлежащему нашему компьютеру. На мой взгляд попытка определения IP адреса — это первый шаг к тому, чтобы со временем залезть во внутрь протокола TCP/IP.

Передача сокетов между процессами

Для того, чтобы передать сокет от одного процесса другому, можно воспользоваться функцией WSADuplicateSocket() из Winsock 2. Изначально в часто задаваемых вопросах (FAQ) эту проблему решали следующим способом .

MFC под колпаком или создание MFC приложения без App Wizard

Чаще всего создание нового MFC приложения поручается визарду (MFC App Wizard). Визард генерирует основной скелет приложения, который, мы в последствии заполняем нужным кодом, в конечном счёте получая готовое приложение. Предлагаю пролить немного света на таинственные участки кода, который для нас генерирует заботливый визард. А заодно и посмотрим как самостоятельно, без помощи визарда, создавать MFC приложения.

Лекция 4. Обзор языка C#

Основные идеи создания C#, базовые конструкции языка, исключения и многое другое в этом обзоре.

Перехват данных Internet Explorer

Чтобы определить какие данные Internet Explorer посылает и принимает при нажатиии на кнопку отправки формы, достаточно создать программу, имитирующую эти действия. Но к счастью, IE использует WININET.DLL — системную Win32® DLL, которая обеспечивает высокоуровневый доступ к протокола HTTP, FTP, и Gopher, освобождая Вас от необходимости программирования сокетов Windows®.

On-Line справочник по функциям библиотек C++

Это руководство содержит описание всех библиотечных функций библиотеки Borland C++, общих переменных и типов, а также примеры программ для иллюстрации использования большинства функций, переменных и типов.

Как я могу получить поддержку MFC помимо создания приложения MFC с помощью Мастера приложений?

Я знаю, что когда мы используем Мастер приложений для создания приложения MFC в VС++, мастер автоматически добавляет необходимые библиотеки в проект.

Я хочу создать приложение MFC вручную. Как это сделать?

Вы можете создать приложение MFC вручную, есть много зависимостей и суетиться. Но это может быть интересно. Вот небольшой учебник.

Создайте следующий файл HelloMFC:

Чтобы скомпилировать это в командной строке, есть все библиотеки, которые необходимо связать. Вы заметите, что в коде выше нет WinMain или main. МФЦ запустил свой основной в библиотеках. Он определен в appmodul.cpp , который вы можете найти в каталоге MFC\SRC.

В любом случае, вот как вы можете скомпилировать приведенный выше код:

cl.exe hellomfc.cpp/EHsc/I atlmfc\include/I Включает /I Включает\Winsdk atlmfc\lib\amd64\nafxcw.lib Libs\libcmt.lib Libs\Ke rnel32.Lib Libs\User32.Lib Libs\Gdi32.Lib Libs\MSImg32.Lib Libs\ComDlg32.Lib Lib s\WinSpool.Lib Libs\AdvAPI32.Lib Libs\Shell32.Lib Libs\ComCtl32.Lib Libs\ShLwApi.Lib Libs\Uuid.lib atlmfc\lib\amd64\atls.lib Libs\Ole32.Lib Libs\OleAut32.Lib Li bs\oldnames.lib Libs\WS2_32.Lib Libs\MsWSock.Lib Libs\OleAcc.Lib Libs\comsuppw.l ib Libs\GdiPlus.lib Libs\Imm32.Lib Libs\WinMM.Lib Libs\MsXml2.Lib Libs\OleDlg.L ib Libs\Urlmon.Lib /Ссылка/SUBSYSTEM: WINDOWS

Примечание. Вышеизложенное, очевидно, зависит от конкретного расположения файлов вашей библиотеки, но это необходимые библиотеки.

Когда вы создаете новое приложение MFC, вы найдете этот код в предварительно скомпилированном заголовке:

в который входят файлы заголовков MFC. Даже если вы попытаетесь создать новое консольное приложение Win32 и попросите мастера включить поддержку MFC, вы снова найдете эти строки в предварительно скомпилированном заголовке:

Итак, если вы хотите создать консольное приложение, которое каким-то образом использует классы MFC, просто создайте новый пустой проект, перейдите к его свойствам и в Общие измените Использование MFC от использования стандартных библиотек Windows для использования MFC в статической библиотеке. Тогда вам просто нужно включить эти заголовки, и вы готовы к работе.;)

Как я могу получить поддержку MFC помимо создания приложения MFC с помощью мастера App?


Я знаю, что, когда мы используем мастер App для создания приложения MFC в VC ++, мастер автоматически добавляет необходимую LIBS к проекту.

Я хочу создать приложение MFC вручную. Как это сделать?

Вы можете создать приложение MFC вручную, есть много зависимостей и суетился вокруг. Но это может быть интересно делать. Вот небольшой учебник.

Создайте следующий HelloMFC файл:

Для компиляции в командной строке, есть все библиотеки , которые должны быть связаны между собой . Вы заметите , что нет WinMain или главный в приведенном выше коде. MFC скатал его главный в библиотеках. Она определяется в appmodul.cpp которой вы можете найти в каталоге MFC \ SRC.

Во всяком случае, вот как вы можете скомпилировать код выше:

cl.exe hellomfc.cpp / EHsc / I atlmfc \ включать / I Включает / I Включает \ Winsdk atlmfc \ Lib \ amd64 \ nafxcw.lib Libs \ Libs библиотеку libcmt.lib \ Ke rnel32.Lib Libs \ User32.Lib Libs \ gdi32. Lib Libs \ MSImg32.Lib ЛИЭС \ ComDlg32.Lib Lib сек \ WinSpool.Lib Libs \ AdvAPI32.Lib Libs \ Shell32.Lib Libs \ ComCtl32.Lib Libs \ ShLwApi .LIB Libs \ Uuid.lib atlmfc \ Lib \ amd64 \ ATLS. Lib Libs \ Ole32.Lib Libs \ OleAut32.Lib Li шс \ oldnames.lib Libs \ WS2_32.Lib Libs \ MsWSock.Lib Libs \ OleAcc.Lib Libs \ comsuppw.l И.Б. Libs \ GdiPlus.lib Libs \ Imm32.Lib Libs \ winmm.lib Libs \ MsXml2.Lib ЛИЭС \ OleDlg.L И.Б. Libs \ Urlmon.Lib / ссылка / SUBSYSTEM: WINDOWS

Примечание: выше, очевидно, зависит от конкретного местоположения ваших файлов библиотек, но те необходимые библиотеки.

Как получить поддержку MFC помимо создания приложения MFC с помощью мастера приложений?

Я знаю, что когда мы используем App Wizard для создания приложения MFC в VC ++, мастер автоматически добавляет необходимые библиотеки в проект.

Я хочу создать приложение MFC вручную. Как это сделать?

2 ответа

Вы можете создать приложение MFC вручную, есть много зависимостей и суеты вокруг. Но это может быть весело. Вот небольшой учебник.

Создайте следующий файл HelloMFC:

Чтобы скомпилировать это в командной строке, есть все библиотеки, которые необходимо связать. Вы заметите, что в коде выше нет WinMain или main. MFC похоронил свою основную в библиотеках. Он определен в appmodul.cpp который вы можете найти в каталоге MFC \ SRC.

В любом случае, вот как вы можете скомпилировать приведенный выше код:

cl.exe hellomfc.cpp / EHsc / I atlmfc \ include / I Включает / I Включает \ Winsdk atlmfc \ lib \ amd64 \ nafxcw.lib Libs \ libcmt.lib Libs \ Ke rnel32.Lib Libs \ User32.Lib Libs \ Gdi32. Lib Libs \ MSImg32.Lib Libs \ ComDlg32.Lib Lib s \ WinSpool.Lib Libs \ AdvAPI32.Lib Libs \ Shell32.Lib Libs \ ComCtl32.Lib Libs \ ShLwApi .Lib Libs \ Uuid.lib atlmfc \ lib \ amd64 \ atls. lib Libs \ Ole32.Lib Libs \ OleAut32.Lib Li bs \ oldnames.lib Libs \ WS2_32.Lib Libs \ MsWSock.Lib Libs \ OleAcc.Lib Libs \ comsuppw.l ib Libs \ GdiPlus.lib Libs \ Imm32.Lib Libs \ WinMM.Lib Libs \ MsXml2.Lib Libs \ OleDlg.L ib Libs \ Urlmon.Lib / link / SUBSYSTEM: WINDOWS

Примечание: приведенное выше, очевидно, зависит от конкретного расположения файлов вашей библиотеки, но это обязательные библиотеки.

Илон Маск рекомендует:  Что такое код msql_result

Когда вы создаете новое приложение MFC, вы найдете этот код в предварительно скомпилированном заголовке:

именно так включаются заголовочные файлы MFC. Даже если вы попытаетесь создать новое консольное приложение Win32 и попросите мастера включить поддержку MFC, вы снова найдете эти строки в предварительно скомпилированном заголовке:

Поэтому, если вы хотите создать консольное приложение, которое каким-то образом использует классы MFC, просто создайте новый пустой проект, перейдите к его свойствам и в разделе « Общие» измените « Использование MFC» с « Использовать стандартные библиотеки Windows» на « Использование MFC в статической библиотеке» . Тогда вам просто нужно включить эти заголовки, и вы готовы к работе. ;)

How can I get MFC support apart from creating MFC application using App Wizard?

I know that when we use App Wizard for creating an MFC application in VC++, the wizard automatically adds the required libs to the project.

I want to create an MFC application manually. How to do that?

2 Answers 2

You can create an MFC app manually, there are a lot of dependencies and fussing around. But it can be fun to do. Here is a small tutorial.

Create the following HelloMFC file:

To Compile this at the command line, there’s are all the libraries that need to be linked. You will notice that there is no WinMain or main in the code above. MFC burried its main in the libraries. It is defined in appmodul.cpp which you can find in your MFC\SRC directory.

Anyway, here is how you can compile the above code:

cl.exe hellomfc.cpp /EHsc /I atlmfc\include /I Includes /I Includes\Winsdk atlmfc\lib\amd64\nafxcw.lib Libs\libcmt.lib Libs\Ke rnel32.Lib Libs\User32.Lib Libs\Gdi32.Lib Libs\MSImg32.Lib Libs\ComDlg32.Lib Lib s\WinSpool.Lib Libs\AdvAPI32.Lib Libs\Shell32.Lib Libs\ComCtl32.Lib Libs\ShLwApi .Lib Libs\Uuid.lib atlmfc\lib\amd64\atls.lib Libs\Ole32.Lib Libs\OleAut32.Lib Li bs\oldnames.lib Libs\WS2_32.Lib Libs\MsWSock.Lib Libs\OleAcc.Lib Libs\comsuppw.l ib Libs\GdiPlus.lib Libs\Imm32.Lib Libs\WinMM.Lib Libs\MsXml2.Lib Libs\OleDlg.L ib Libs\Urlmon.Lib /link/SUBSYSTEM:WINDOWS

Note: the above obviously depends on the specific location of your library files, but those are the required libraries.

AppWizard и архитектура Document-View

О принципах устройства приложения рассказывалось выше. Теперь рассмотрим, как оно создается с помощью Visual C++. Сначала разберем одно важное понятие — проект. До сих пор приложение рассматривалось, только как совокупность объектов базовых и производных классов. Но для обеспечения работы приложения требуется нечто большее — наряду с описанием классов необходимо описание ресурсов, связанных с приложением, нужна справочная система и т.п. Термин «проект» как раз и используется, когда имеется в виду такой более общий взгляд на приложение.

В среде Visual C++ можно строить различные типы проектов:

и обычных консольных приложений,


и приложений под Windows с использованием API,

и статических и динамических библиотек и т. п.

Рассмотрим только создание проектов типа MFC AppWizard. Фирма Microsoft разработала специальный инструментарий, облегчающий и ускоряющий создание проектов в среде Visual C++.

Прежде всего, нужно отметить, что создание проекта — это не только творчество, но и большой объем технической работы, требующей внимания и аккуратности. Все Windows-приложения имеют достаточно общую структуру, и, следовательно, можно построить некоторые шаблонные заготовки, подходящие для того или иного типа проектов. Построению таких заготовок способствует то, что приложения, создаваемые на основе MFC, строятся из элементов фиксированных классов. Логическим развитием этой идеи было введение специальных классов и специальной архитектуры построения приложения, которая подходила бы широкому классу приложений. О такой архитектуре уже упоминалось, когда речь шла о библиотеке MFC, — это архитектура Document-View. Она является основной, но не единственной при построении проектов в среде Visual C++. Суть ее в том, что работу многих приложений можно рассматривать как обработку документов. При этом можно отделить сам документ, отвечающий за представление и хранение данных, от образа этого документа, видимого на экране и допускающего взаимодействие с пользователем, который просматривает и (или) редактирует документ. В соответствии с этой архитектурой библиотека MFC содержит два семейства классов, производных от базовых классов CDocument и CView.

В результате появилась двухэтапная технология создания проектов. Вначале создается некая заготовка проекта с общими свойствами, подходящими для многих проектов этого типа. На втором этапе производится уже настройка, учитывающая специфику задачи. Для каждого этапа фирма Microsoft разработала свое инструментальное средство.

Начальная заготовка — остов приложения — создается в диалоге с пользователем инструментальным средством AppWizard. В процессе диалога пользователь определяет тип и характеристики проекта, который он хочет построить. Определив, какие классы из MFC необходимы для этого проекта, AppWizard строит остовы всех нужных производных классов. Построенный AppWizard остов приложения содержит все необходимые файлы для создания стартового приложения, которое является законченным приложением и обладает разумными функциональными свойствами, общими для целого класса приложений. Естественно, никаких специфических для данного приложения свойств остов не содержит. Они появятся на следующем этапе, когда программист начнет работать с остовом, создавая из заготовки свое собственное приложение. Тем не менее стартовое приложение можно транслировать и запускать на исполнение.

Термин остов (приложения, класса, функции) применяется для заготовок, создаваемых инструментальными средствами AppWizard и ClassWizard.

ClassWizard

Созданный AppWizard остов приложения составлен так, что в дальнейшей работе с проектом можно использовать другое инструментальное средство — ClassWizard (мастер классов), предназначенное для создания остовов новых производных классов. Еще одно основное назначение ClassWizard в том, что он создает остовы для переопределяемых методов. Он позволяет показать все сообщения, приходящие классу, и создать остов обработчика любого из этих сообщений. Это только две основные функции ClassWizard. Он не всесилен, но его возможности довольно велики.

Первые MFC-приложения

Первое приложение, создаваемое с использованием библиотеки классов MFC, достаточно простое. Оно отображает на экране маленькую диалоговую панель, содержащую строку текста.

В этом приложении используется единственный класс, наследованный от базового класса CWinApp.

Простое приложение

Самые простые приложения с использованием библиотеки классов MFC можно создавать без применения автоматизированных средств разработки приложений MFC AppWizard. Приведем исходный текст приложения first:

// Включаемый файл для MFC

// Класс CFirstApp — главный класс приложения.

// Наследуется от базового класса CWinApp.

class CFirstApp:public CWinApp

// Переопределение метода InitInstance,

// предназначенного для инициализациии приложения.

virtual BOOL InitInstance();

// Создание объекта приложения класса CFirstApp.

// Переопределение виртуального метода InitInstance класса CWinApp.

// Он вызывается каждый раз при запуске приложения.

В этом приложении определен только один класс — CFirstApp, наследованный от базового класса CWinApp. В класс CFirstApp входит метод InitInstance. Кроме того, определена одна глобальная переменная — theApp.

Для использования в приложении классов или функций библиотеки MFC необходимо включить эту библиотеку в проект приложения. Программные коды библиотеки классов MFC могут использоваться приложением двумя разными способами. Код библиотеки MFC либо непосредственно записывается в выполняемый файл приложения, либо вызывается по мере необходимости из отдельной dll-библиотеки.

Использование для приложения DLL-библиотеки немного ускоряет процесс построения проекта и позволяет создавать выполняемые файлы значительно меньшего размера. Однако сам по себе такой выполняемый файл работать не будет. Для него необходима dll-библиотека. Поэтому, если приложение будет устанавливаться и на других компьютерах, его надо распространять вместе с dll-библиотекой.

Если для создания нового приложения используется MFC AppWizard, библиотека MFC подключается автоматически. Программисту не нужно вручную вносить изменения в проектный файл в этом случае.

Рассмотрим, как работает приложение first на уровне исходного текста. Сначала в текст приложения включается файл afxwin.h. В этом файле определены классы, методы, константы и другие структуры для библиотеки классов MFC. Кроме того, включаемый файл afxwin автоматически подключает другой файл — windows.h, необходимый для вызовов функций стандартного программного интерфейса Windows.

Сравним исходный текст приложения first с аналогичным приложением, созданным без использования библиотеки классов MFC. В этом приложении присутствует главная функция приложения WinMain, которая вызывается, когда пользователь или операционная система запускает приложение:

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int nShowCmd)

// Отображение диалоговой панели.

// Завершение работы приложения

Если посмотреть на текст программы first, то там нет хорошо знакомой функции WinMain. Не видно также переменных, представляющих параметры этой функции.


В приложениях, основанных на классах MFC, функция WinMain скрыта от программиста в определении класса CWinApp. В каждом приложении определяется главный класс приложения, наследуемый от базового класса CWinApp. Приложение должно иметь только один объект главного класса приложения, наследованного от класса CWinApp.

Класс CWinApp выполняет все действия, которые обычно выполняет функция WinMain, — инициализирует приложение, обрабатывает сообщения и завершает приложение. Для этого класс CWinApp включает виртуальные методы InitApplication, InitInstance, Run и ExitInstance.

Чтобы выполнить инициализацию приложения, функция WinMain вызывает методы InitApplication и InitInstance для объекта главного класса приложения. Метод InitApplication выполняет инициализацию на уровне приложения. Программист может переопределить этот метод в своем приложении. Метод InitInstance выполняет инициализацию каждой копии приложения. Обычно этот метод создает главное окно приложения. Программист должен обязательно переопределить этот метод в своем приложении. Остальные методы, например Run, можно не переопределять.

Затем функция WinMain начинает обрабатывать цикл сообщений. Для этого вызывается метод Run. Можно переопределить этот метод, чтобы реализовать собственный цикл обработки сообщений.

Когда приложение заканчивает работу и цикл обработки сообщений завершается, вызывается метод ExitInstance. Программист может переопределить этот метод, чтобы выполнить какие-либо действия перед завершением приложения.

В случае приложения first главный класс приложения, который называется CFirstApp, определяется следующим образом:

class CFirstApp:public CWinApp

virtual BOOL InitInstance();

Этот класс наследуется от базового класса CWinApp. При этом базовый класс указан как public. Это означает, что в программе доступны все элементы базового класса CWinApp, объявленные как public. Можно вызывать методы класса CWinApp для объектов класса CFirstApp и обращаться к элементам данных класса CWinApp.

В объявлении класса CFirstApp объявлен виртуальный метод InitInstance. Этот метод переопределяется в приложении. Изначально метод InitInstance определен в классе CWinApp. Он отвечает за инициализацию приложения. Он вызывается каждый раз, когда пользователь запускает приложение. Если пользователь запустит приложение несколько раз, то метод InitInstance будет вызываться каждый раз.

Метод InitInstance обязательно должен быть переопределен в главном классе приложения. Остальные виртуальные методы можно оставить без изменения.

Сразу после объявления главного класса приложения создается объект theApp этого класса:

Объект главного класса приложения должен быть определен как глобальный. В этом случае он будет создан сразу при запуске приложения и сможет управлять всей работой приложения. После создания глобального объекта вызывается функция WinMain, определенная в классе CWinApp. Она выполняет свои обычные функции — регистрирует классы окон, создает окно и т.д.

Нельзя создавать два или более объекта класса, наследованного от базового класса CWinApp. Каждое приложение должно иметь один и только один объект главного класса приложения.

Метод InitInstance главного класса приложения CFirstApp служит для инициализации. Он вызывается автоматически всякий раз, когда запускается очередная копия приложения. В приложении first метод InitInstance используется для вывода на экран диалоговой панели при помощи функции AfxMessageBox:

Функция AfxMessageBox определена в библиотеке классов MFC. Вместо функции AfxMessageBox можно воспользоваться функцией MessageBox программного интерфейса Windows.

Когда из приложения, созданного с использованием классов MFC, вызываются функции программного интерфейса API Windows, часто надо указывать перед именем функции символы . Например, вызов функции MessageBox может выглядеть следующим образом:

В конце метода InitInstance вызывается оператор return и возвращается значение FALSE. Приложение сразу же завершается. Если метод InitInsatnce вернет значение TRUE, приложение продолжит свою работу и приступит к обработке очереди сообщений.

Глава 3. Простейшие MFC-приложения

Самые простые приложения с использованием библиотеки классов MFC можно создавать в Microsoft Developer Studio без применения автоматизированных средств разработки приложений MFC AppWizard. Необходимо только создать проект типа Win32 Application и включить в его установки поддержку библиотеки MFC.

Приложение без главного окна

Самые простые приложения с использованием библиотеки классов MFC можно создавать без применения автоматизированных средств разработки приложений MFC AppWizard. Создадим приложение, отображающее на экране маленькую диалоговую панель, которая содержит строку текста. В этом приложении используется единственный класс, наследованный от базового класса CWinApp. Приведем исходный текст приложения:

В этом приложении определен только один класс — CFirstApp, наследованный от базового класса CWinApp . В класс CFirstApp входит метод InitInstance . Кроме того, определена одна глобальная переменная — theApp.

Для использования в приложении классов или функций библиотеки MFC необходимо включить эту библиотеку в проект приложения. Программные коды библиотеки классов MFC могут использоваться приложением двумя разными способами. Код библиотеки MFC либо непосредственно записывается в выполняемый файл приложения, либо вызывается по мере необходимости из отдельной dll-библиотеки.

Использование для приложения DLL-библиотеки немного ускоряет процесс построения проекта и позволяет создавать выполняемые файлы значительно меньшего размера. Однако сам по себе такой выполняемый файл работать не будет. Для него необходима dll-библиотека. Поэтому, если приложение будет устанавливаться и на других компьютерах, его надо распространять вместе с dll-библиотекой.

Замечание. Если для создания нового приложения используется MFC AppWizard, библиотека MFC подключается автоматически. Программисту не нужно вручную вносить изменения в проектный файл в этом случае.

Рассмотрим, как работает приложение first на уровне исходного текста. Сначала в текст приложения включается файл afxwin.h. В этом файле определены классы, методы, константы и другие структуры для библиотеки классов MFC. Кроме того, включаемый файл afxwin автоматически подключает другой файл — windows.h, необходимый для вызовов функций стандартного программного интерфейса Windows.

Сравним исходный текст приложения first с аналогичным приложением, созданным без использования библиотеки классов MFC. В этом приложении присутствует главная функция приложения WinMain , которая вызывается, когда пользователь или операционная система запускает приложение:

Если посмотреть на текст программы first, то там нет хорошо знакомой функции WinMain . Не видно также переменных, представляющих параметры этой функции.

В приложениях, основанных на классах MFC, функция WinMain скрыта от программиста в определении класса CWinApp . В каждом приложении определяется главный класс приложения, наследуемый от базового класса CWinApp . Приложение должно иметь только один объект главного класса приложения, наследованного от класса CWinApp .

Класс CWinApp выполняет все действия, которые обычно выполняет функция WinMain , — инициализирует приложение, обрабатывает сообщения и завершает приложение. Для этого класс CWinApp включает виртуальные методы InitApplication, InitInstance, Run и ExitInstance .

Чтобы выполнить инициализацию приложения, функция WinMain вызывает методы InitApplication и InitInstance для объекта главного класса приложения. Метод InitApplication выполняет инициализацию на уровне приложения. Программист может переопределить этот метод в своем приложении. Метод InitInstance выполняет инициализацию каждой копии приложения. Обычно этот метод создает главное окно приложения. Программист должен обязательно переопределить этот метод в своем приложении. Остальные методы, например Run, можно не переопределять.

Затем функция WinMain начинает обрабатывать цикл сообщений. Для этого вызывается метод Run . Можно переопределить этот метод, чтобы реализовать собственный цикл обработки сообщений.

Когда приложение заканчивает работу и цикл обработки сообщений завершается, вызывается метод ExitInstance. Программист может переопределить этот метод, чтобы выполнить какие-либо действия перед завершением приложения.

Илон Маск рекомендует:  CMS Drupal система управления содержимым сайта

В случае приложения first главный класс приложения CFirstApp наследуется от базового класса CWinApp . При этом базовый класс указан как public . Это означает, что в программе доступны все элементы базового класса CWinApp , объявленные как public . Можно вызывать методы класса CWinApp для объектов класса CFirstApp и обращаться к элементам данных класса CWinApp .


В объявлении класса CFirstApp объявлен виртуальный метод InitInstance . Этот метод переопределяется в приложении. Изначально метод InitInstance определен в классе CWinApp . Он отвечает за инициализацию приложения. Он вызывается каждый раз, когда пользователь запускает приложение. Если пользователь запустит приложение несколько раз, то метод InitInstance будет вызываться каждый раз.

Метод InitInstance обязательно должен быть переопределен в главном классе приложения. Остальные виртуальные методы можно оставить без изменения.

Сразу после объявления главного класса приложения создается объект theApp этого класса. Объект главного класса приложения должен быть определен как глобальный . В этом случае он будет создан сразу при запуске приложения и сможет управлять всей работой приложения. После создания глобального объекта вызывается функция WinMain , определенная в классе CWinApp . Она выполняет свои обычные функции — регистрирует классы окон, создает окно и т.д.

Нельзя создавать два или более объекта класса, наследованного от базового класса CWinApp. Каждое приложение должно иметь один и только один объект главного класса приложения.

Метод InitInstance главного класса приложения CFirstApp служит для инициализации. Он вызывается автоматически всякий раз, когда запускается очередная копия приложения. В приложении first метод InitInstance используется для вывода на экран диалоговой панели при помощи функции AfxMessageBox , определенной в MFC.

Вместо функции AfxMessageBox можно воспользоваться функцией MessageBox программного интерфейса Windows. Когда из приложения, созданного с использованием классов MFC, вызываются функции программного интерфейса Windows, необходимо указывать перед именем функции символы . Например, вызов функции MessageBox будет выглядеть следующим образом:

В конце метода InitInstance вызывается оператор return и возвращается значение FALSE. Приложение сразу же завершается. Если метод InitInsatnce вернет значение TRUE, приложение продолжит свою работу и приступит к обработке очереди сообщений.

Приложение с главным окном

Приложение first не имело главного окна. Для вывода сообщения на экран использовалась функция AfxMessageBox , которая очень похожа на функцию MessageBox программного интерфейса Windows.

Рассмотрим другое приложение- приложение start, оно несколько сложнее предыдущего. При запуске оно отображает на экране компьютера обычное окно, имеющее заголовок, системное меню и кнопки управления.

Точно так же, как и в приложении first, во втором приложении используется класс CWinApp в качестве главного класса приложения. Для управления окном приложения создается еще один класс, наследуемый от базового класса CFrameWnd, входящего в библиотеку MFC.

Приложение start очень простое — оно состоит из одного главного окна и не содержит ни меню, ни каких-либо других органов управления. И тем не менее главное окно приложения обладает всеми возможностями Windows-окон. Оно имеет заголовок, системное меню и кнопки управления. Можно изменить размер этого окна, увеличить его на весь экран и уменьшить до размера пиктограммы.

В исходных текстах определяется главный класс CStartApp приложения, который наследуется от базового класса CWinApp . При этом базовый класс указан как public . Можно вызывать методы класса CWinApp для объектов класса CStartApp и обращаться к элементам данных класса CWinApp .

В определении класса CStartApp объявлен виртуальный метод InitInstance . Он переопределяется в файле реализации класса. После объявления главного класса приложения и переопределения функции InitInstance Метод InitInstance главного класса приложения CStartApp служит для инициализации. Он вызывается автоматически каждый раз, когда запускается очередная копия приложения.

Второй класс, класс CMainWindow, наследуется от базового класса CFrameWnd как public и представляет главное окно приложения. В классе главного окна определяется только конструктор.

В данном приложении метод InitInstance используется для отображения на экране окна приложения. Для этого создается объект класса CMainWindow и записывается указатель на этот объект в элемент данных m_pMainWnd класса CWinThread (этот класс является базовым для класса CWinApp ). Таким образом, объект приложения и объект окна приложения связываются вместе.

Для создания объекта класса CMainWindow используется оператор new. Он создает объект указанного класса, отводит память и возвращает указатель на него. При создании нового объекта класса окна оператором new для автоматически вызывается конструктор.

Само окно появится на экране только после того, как будет вызван метод ShowWindow . В качестве параметра методу ShowWindow передается значение m_nCmdShow . Переменная m_nCmdShow является элементом класса CWinApp . Его назначение соответствует параметру функции WinMain , который определяет, как должно отображаться главное окно приложения сразу после его запуска.

После появления окна на экране ему передается сообщение WM_PAINT при помощи вызова метода UpdateWindow . По этому сообщению приложение должно обновить содержимое окна.

В конце метода InitInstance вызывается оператор return и возвращается значение TRUE, означающее, что инициализация приложения завершилась успешно и можно приступать к обработке очереди сообщений (eсли метод InitInstance вернет значение FALSE, приложение немедленно завершится; эта возможность использовалась в приложении first).

Для создания окна приложения создается объект класса CMainWindow. Такой объект — это не окно, которое пользователь видит на экране компьютера . Этот объект является внутренним представлением окна . Для создания окна предназначается метод Create , определенный в классе CFrameWnd . Он создает окно и связывает его с объектом C++, в случае приложения start — с объектом класса CMainWindow. Метод Create вызывается в конструкторе класса CMainWindow.

Обработка окном сообщений

Работа операционной системы Windows основана на обработке сообщений. Когда пользователь работает с устройствами ввода/вывода (например, клавиатурой или мышью), драйверы этих устройств создают сообщения, описывающие его действия.

Сообщения сначала попадают в системную очередь сообщений операционной системы. Из нее сообщения передаются приложениям, которым они предназначены, и записываются в очередь приложений . Каждое приложение имеет собственную очередь сообщений.

Приложение в цикле, который называется циклом обработки сообщений , получает сообщения из очереди приложения и направляет их соответствующей функции окна, которая и выполняет обработку сообщения. Цикл обработки сообщений в традиционной Windows-программе обычно состоял из оператора while, в котором циклически вызывались функции GetMessage и DispatchMessage. Для более сложных приложений цикл обработки сообщений содержал вызовы других функций (TranslateMess a ge, TranslateAccelerator). Они обеспечивали предварительную обработку сообщений.

Каждое окно приложения имеет собственную функцию окна. В процессе обработки сообщения операционная система вызывает функцию окна и передает ей структуру, описывающую очередное сообщение. Функция обработки сообщения проверяет, какое именно сообщение поступило для обработки, и выполняет соответствующие действия.

Если при создании приложения используется библиотека классов MFC, то за обработку сообщений отвечают классы. Любой класс, наследованный от базового класса CCmdTarget , может обрабатывать сообщения. Чтобы класс смог обрабатывать сообщения, необходимо, чтобы он имел таблицу сообщений класса . В этой таблице для каждого сообщения указан метод класса, предназначенный для его обработки.

Группы сообщений

Сообщения, которые могут обрабатываться приложением, построенным с использованием библиотеки классов MFC, делятся на 3 группы.

Эта группа включает сообщения, предназначенные для обработки функцией окна. Практически все сообщения, идентификаторы которых начинаются префиксом WM_ , за исключением WM_COMMAND ,. относятся к этой группе.

Оконные сообщения предназначаются для обработки объектами, представляющими окна. Это могут быть практически любые объекты класса CWnd или классов, наследованных от него (CFrameWnd, CMDIFrameWnd, CMDIChildWnd, CView, CDialog) . Характерной чертой этих классов является то, что они включают идентификатор окна.

Большинство этих сообщений имеют параметры, детально характеризующие сообщение.

Сообщения от органов управления

Эта группа включает в себя сообщения WM_COMMAND от дочерних окон (включая окна стандартных классов), передаваемых их родительскому окну. Сообщения от органов управления обрабатываются точно таким же образом, что и оконные сообщения.

Исключение составляет сообщение WM_COMMAND с кодом извещения BN_CLICKED . Это сообщение передается кнопкой, когда пользователь на нее нажимает. Обработка сообщений с кодом извещения BN_CLICKED от органов управления происходит аналогично обработке командных сообщений.


Это сообщения WM_COMMAND от меню, кнопок панели управления и клавиш акселераторов. В отличие от оконных сообщений и сообщений от органов управления командные сообщения могут быть обработаны более широким спектром объектов. Эти сообщения обрабатывают не только объекты, представляющие окна, но также объекты классов, представляющих приложение, документы или шаблон документов.

Характерной особенностью командных сообщений является идентификатор. Идентификатор командного сообщения определяет объект, который вырабатывает (посылает) данное сообщение.

Таблица сообщений

В библиотеке классов MFC для обработки сообщений используется специальный механизм, который имеет название Message Map — таблица сообщений .

Таблица сообщений состоит из набора специальных макрокоманд, ограниченных макрокомандами BEGIN_MESSAGE_MAP и END_MESSAGE_MAP . Между ними расположены макрокоманды, отвечающие за обработку отдельных сообщений:

BEGIN_MESSAGE_MAP( ИмяКласса,ИмяБазовогоКласса ) // макросы END_MESSAGE_MAP()

Макрокоманда BEGIN_MESSAGE_MAP представляет собой заголовок таблицы сообщений. Она имеет два параметра. Первый параметр содержит имя класса таблицы сообщений. Второй — указывает его базовый класс.

Если в таблице сообщений класса отсутствует обработчик для сообщения, оно передается для обработки базовому классу, указанному вторым параметром макрокоманды BEGIN_MESSAGE_MAP . Если таблица сообщений базового класса также не содержит обработчик этого сообщения, оно передается следующему базовому классу и т.д. Если ни один из базовых классов не может обработать сообщение, выполняется обработка по умолчанию, зависящая от типа сообщения:

  • стандартные сообщения Windows обрабатываются функцией обработки по умолчанию;
  • командные сообщения передаются по цепочке следующему объекту, который может обработать командное сообщение.

Можно определить таблицу сообщений класса вручную, однако более удобно воспользоваться для этой цели средствами ClassWizard. ClassWizard не только позволяет в удобной форме выбрать сообщения, которые должен обрабатывать класс. Он включит в состав класса соответствующие методы-обработчики. Программисту останется только вставить в них необходимый код. К сожалению, использовать все возможности ClassWizard можно только в том случае, если приложение создано с применением средств автоматизированного программирования MFC AppWizard.

Рассмотрим макрокоманды, отвечающие за обработку различных типов сообщений.

Макрокоманда ON_WM_ . Обрабатывает стандартные сообщения операционной системы Windows. Вместо указывается имя сообщения без префикса WM_. Например:

Для обработки сообщений, определенных в таблице макрокомандой On_WM_ , вызываются одноименные методы. Имя метода обработчика соответствует названию сообщения, без учета префикса WM_. В классе CWnd определены обработчики для стандартных сообщений. Эти обработчики будут использоваться по умолчанию.

Макрокоманды ON_WM_ не имеют параметров. Однако методы, которые вызываются для обработки соответствующих сообщений, имеют параметры, которые, количество и назначение которых зависит от обрабатываемого сообщения.

Если определить обработчик стандартного сообщения Window в своем классе, то он будет вызываться вместо обработчика, определенного в классе CWnd (или другом базовом классе). В любом случае можно вызвать метод-обработчик базового класса из своего метода-обработчика.

Макрокоманда ON_REGISTERED_MESSAGE. Эта макрокоманда обслуживает сообщения операционной системы Windows, зарегистрированные с помощью функции RegisterWindowMessage . Параметра nMessageVariable этой макрокоманды указывает идентификатор сообщения, для которого будет вызываться метод memberFxn:

Макрокоманда ON_MESSAGE. Данная макрокоманда обрабатывает сообщения, определенные пользователем. Идентификатор сообщения (его имя) указывается параметром message. Метод, который вызывается для обработки сообщения, указывается параметром memberFxn:

Макрокоманда ON_COMMAND. Эти макрокоманды предназначены для обработки командных сообщений. Командные сообщения поступают от меню, кнопок панели управления и клавиш акселераторов. Характерной особенностью командных сообщений является то, что с ними связан идентификатор сообщения.

Макрокоманда ON_COMMAND имеет два параметра. Первый параметр соответствует идентификатору командного сообщения, а второй — имени метода, предназначенного для обработки этого сообщения. Таблица сообщений должна содержать не больше одной макрокоманды для командного сообщения:

Обычно командные сообщения не имеют обработчиков, используемых по умолчанию. Существует только небольшая группа стандартных командных сообщений, имеющих методы-обработчики, вызываемые по умолчанию. Эти сообщения соответствуют стандартным строкам меню приложение. Так например, если строке Open меню File присвоить идентификатор ID_FILE_OPEN, то для его обработки будет вызван метод OnFileOpen, определенный в классе CWinApp.

Макрокоманда ON_COMMAND_RANGE. Макрокоманда ON_COMMAND ставит в соответствие одному командному сообщению один метод-обработчик В некоторых случаях более удобно, когда один и тот же метод-обработчик применяется для обработки сразу нескольких командных сообщений с различными идентификаторами. Для этого предназначена макрокоманда ON_COMMAND_RANGE.

Она назначает один метод-обработчик для обработки нескольких командных сообщений, интервалы которых лежат в интервале от id1 до id2:

Макрокоманда ON_UPDATE_COMMAND_UI . Данная макрокоманда обрабатывает сообщения, предназначенные обновления пользовательского интерфейса, например меню, панелей управления, и позволяет менять их состояние.

Параметр id указывает идентификатор сообщения, а параметр memberFxn — имя метода для его обработки:

Методы, предназначенные для обработки данного класса сообщений, должны быть определены с ключевым словом afx_msg и иметь один параметр — указатель на объект класса CCmdUI . Для удобства имена методов, предназначенных для обновления пользовательского интерфейса, начинаются с OnUpdate:

afx_msg void OnUpdate (CCmdUI* pCmdUI);

В качестве параметра pCmdUI методу передается указатель на объект класса CCmdUI . В нем содержится информация об объекте пользовательского интерфейса, который нужно обновить, — строке меню или кнопке панели управления. Класс CCmdUI также включает методы, позволяющие изменить внешний вид представленного им объекта пользовательского интерфейса.

Сообщения, предназначенные для обновления пользовательского интерфейса, передаются, когда пользователь открывает меню приложения, а также во время цикла ожидания приложения, когда очередь сообщений приложения становится пуста.

При этом посылается несколько сообщений, по одному для каждой строке меню. С помощью макрокоманд ON_UPDATE_COMMAND_UI можно определить методы-обработчики, ответственные за обновление внешнего вида каждой строки меню и соответствующие ей кнопки на панели управления. Эти методы могут изменять состояние строки меню — отображать ее серым цветом, запрещать ее выбор, отображать около нее символ «галочка» и т.д.

Если не определить метод для обновления данной строки меню или кнопки панели управления, то выполняется обработка по умолчанию. Выполняется поиск обработчика соответствующего командного сообщения, и, если он не обнаружен, выбор строки запрещается.

Макрокоманда ON_UPDATE_COMMAND_UI_RANGE. Эта макрокоманда обеспечивает обработку сообщений, предназначенных для обновления пользовательского интерфейса, идентификаторы которых лежат в интервале от id1 до id2. Параметр memberFxn указывает метод, используемый для обработки:

Макрокоманда ON_ . Данные макрокоманды предназначены для обработки сообщений от органов управления. Такие сообщения могут передаваться органами управления диалоговой панели. Сообщения от органов управления не имеют обработчиков, используемых по умолчанию. При необходимости их нужно определить самостоятельно.

Все макрокоманды ON_ имеют два параметра. В первом параметре id указывается идентификатор органа управления. Сообщения от этого органа управления будут обрабатываться методом memberFxn. Например:

Макрокоманда ON_CONTROL_RANGE. Эта макрокоманда обрабатывает сообщения от органов управления, идентификаторы которых находятся в интервале от id1 до id2. Параметр wNotifyCode содержит код извещения. Метод-обработчик указывается параметром memberFxn:


Приложение, обрабатывающее сообщения

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

Рассмотрим теперь приложение, которое имеет меню и содержит обработчики сообщений, передаваемых приложению, когда пользователь открывает меню и выбирает из него строки. Пусть меню приложения состоит из одного пункта Test. Можно выбрать одну из следующих команд — Beep или Exit.

Файл ресурсов, в который включается описание меню, можно построить либо непосредственным созданием нового файла ресурсов, либо при помощи средств AppWizard. В любом случае при создании меню нужно определить название меню или строки меню. Каждый элемент меню должен иметь уникальный идентификатор, однозначно его определяющий:

Файл resource.h #define >Файл resource.rc #include «resource.h» IDR_MENU MENU DISCARDABLE BEGIN POPUP «Test» BEGIN MENUITEM «Beep», ID_TEST_BEEP MENUITEM SEPARATOR MENUITEM «Exit», ID_TEST_EXIT END END

Файлы, в которых находятся определение классов приложения и главного окна, представлены ниже:

Чтобы объекты класса могли обрабатывать сообщения, в определении класса необходимо поместить макрокоманду DECLARE_MESSAGE_MAP . По принятым соглашениям эта макрокоманда должна записываться в секцию public .

Кроме этого, необходимо также определить таблицу сообщений. Таблица начинается макрокомандой BEGIN_MESSAGE_MAP и заканчивается макрокомандой END_MESSAGE_MAP . Между этими макрокомандами расположены строки таблицы сообщений, определяющие сообщения, подлежащие обработке данным классом, и методы, которые выполняют такую обработку.

Приложение может содержать несколько классов, обладающих собственными таблицами сообщений. Чтобы однозначно определить класс, к которому относится таблица сообщений, имя этого класса записывается в первый параметр макрокоманды BEGIN_MESSAGE_MAP .

Приложение menu обрабатывает только две команды от меню приложения. Для обработки этих команд используют методы, представленные в определении класса CMainFrame.

Приложению может поступать гораздо больше сообщений и команд, чем указано в таблице сообщений класса CMainFrame. Необработанные сообщения передаются для обработки базовому классу — классу CFrameWnd . Класс, который будет обрабатывать сообщения, не указанные в таблице сообщений, указывается во втором параметре макрокоманды BEGIN_MESSAGE_MAP .

Замечание. Если класс приложения тоже обрабатывает сообщения (т.е. имеет таблицу сообщений), и некоторые из сообщений обрабатываются как окном, так и приложением, то нужно понять, какова очередность обработки сообщений тем или иным объектом. Те команды, которые не имеют обработчика в таблице сообщений класса окна, передаются для обработки в класс приложения. Если же команда может быть обработана и в классе окна, и в классе приложения, она обрабатывается только один раз в классе окна. Обработчик класса приложения в этом случае не вызывается.

indbooks

Читать онлайн книгу

Создание приложения средствами MFC AppWizard

В состав компиляторов Microsoft Visual C++ встроены средства, позволяющие программисту облегчить разработку приложений. В первую очередь к ним относятся MFC AppWizard и ClassWizard .

Как известно, в любом деле самое трудное – начало. Это высказывание в полной мере справедливо по отношению к разработке приложений Windows. Мы рассказывали в предыдущих книгах серии “Библиотека системного программиста” и вы могли убедиться в этом сами, что исходные тексты даже простых приложений Windows имеют большие размеры.

На создание работающего каркаса или шаблона приложения у программиста уходит слишком много времени. Обычно, чтобы не набирать исходный текст такого шаблона каждый раз, новые приложения создают на основе уже отлаженных примеров, изменяя их по своему усмотрению.

Благодаря MFC AppWizard среда разработчика Microsoft Visual C++ позволяет быстро создавать шаблоны новых приложений. При этом программисту не приходится писать ни одной строки кода. Достаточно ответить на ряд вопросов, которые задает MFC AppWizard, выбрав какое приложение вы желаете создать, и исходные тексты шаблона приложения вместе с файлами ресурсов готовы. Эти тексты можно сразу оттранслировать и получить готовый загрузочный модуль приложения.

Конечно, сегодня никакие средства автоматизированной разработки не смогут создать программу полностью без вашего участия – иначе зачем были бы нужны программисты? Прикладную часть приложения вы должны будете написать сами.

Однако MFC AppWizard окажет вам очень сильную помощь. Так, чтобы создать многооконный текстовый редактор обладающий справочной системой, в который к тому же можно включать OLE объекты и, вам не придется написать ни единой строчки кода программы. Исходные тексты такого приложения можно автоматически разработать с помощью AppWizard буквально за две минуты.

Но даже когда шаблон приложения полностью готов, Microsoft Visual C++ не оставляет вас один на один с его текстом. Встроенный в среду Visual C++ редактор ресурсов позволяет быстро создавать новые меню, диалоговые панели, добавлять кнопки к панели управления (панели toolbar).

Средства ClassView и ClassWizard позволят подключить к созданным и отредактированным ресурсам управляющий ими код. Большую часть работы по описанию и определению функций, обрабатывающих сообщения от меню, органов управления диалоговых панелей и т. д. также берут на себя ClassView и ClassWizard.

Во второй главе книги мы рассматривали приложение MFDialog, которое не имеет главного окна. Вместо окна это приложение использует обыкновенную диалоговую панель. Сейчас мы расскажем вам как создать приложение, подобное MFDialog, не набрав ни одной строки текста программы. Для этого мы будем использовать средства MFC AppWizard и ClassWizard.

Выберите из меню File строку New. На экране появится диалоговая панель New, содержащая меню. Выберите из него тип объекта, который надо создать. Для создания нового проекта выберите из этого меню строку Project Workspace. Теперь на экране откроется диалоговая панель New Project Workspace, показанная нами на рисунке 4.1.

Рис. 4.1. Диалоговая панель New Project Workspace

Из списка Type выберите тип приложения, которое вы желаете создать. В следующей таблице перечислены типы приложений, которые вы можете выбрать.

Тип приложения Описание
MFC AppWizard (exe) Приложение, создаваемое с использованием библиотеки классов MFC. С помощью AppWizard вы можете автоматически создать основные классы необходимые для приложения
MFC AppWizard (dll) Библиотека динамической компоновки – DLL, создаваемая с помощью библиотеки классов MFC. AppWizard позволяет автоматически создать все основные файлы, необходимые для DLL
OLE ControlWizard Органы управления OLE, созданные с использованием библиотеки классов MFC. Компилятор автоматически создает базовый набор файлов для проекта этого типа
Application Приложение, созданное на основе библиотеки классов MFC или с использованием только вызовов функций программного интерфейса Windows
Dynamic-Link Library Библиотека динамической компоновки, созданная с использованием только вызовов функций программного интерфейса Windows
Console Application Приложение, разработанное с использованием функций консольного ввода/вывода. Этот тип приложений можно использовать для создания небольших программ, работающих в пакетном режиме
Static Library Библиотека функций
Makefile Предоставляет дополнительные возможности для использования MAKE-файла
Custom AppWizard Позволяет создать собственный “волшебник” Custom AppWizard, который можно будет использовать для разработки шаблонов приложений с заданными вами свойствами

Список типов приложений, которые может создавать Microsoft Visual C++ версии 4.1, расширен. В него включен “волшебник” ISAPI Extension Wizard, который облегчает создание приложений для Microsoft Internet Information Server.

В этой книге мы расскажем о создании собственных приложений с использованием средств AppWizard. Поэтому выберите из списка Type строку MFC AppWizard (exe).

Теперь определите расположение базового каталога, в котором будут размещены проекты. Путь каталога можно ввести непосредственно в поле Location или выбрать, из списка, нажав на кнопку Browse. Затем введите в поле Name имя создаваемого проекта. В базовом каталоге создается одноименный подкаталог и в него записываются все файлы проекта. Имена файлов, составляющих проект, и названия классов приложения также присваиваются AppWizard на основе имени проекта.

В группе переключателей Platforms надо выбрать, для какой платформы создается приложение. Если вы работаете в среде операционных систем Windows NT или Windows 95, установите переключатель Win32.

После того как вы заполнили все поля диалоговой панели, нажмите кнопку Create. На экране появится первая диалоговая панель MFC AppWizard. Внешний вид этой панели зависит от того, какой тип приложения вами создается. Если вы создаете выполнимое приложение, то на экране появится диалоговая панель, показанная на рисунке 4.2.

Рис. 4.2. Первый шаг MFC AppWizard

На первом шаге вам предлагается определить, какой тип пользовательского интерфейса должно иметь приложение. Вы можете выбирать между многооконным интерфейсом (Multiple documents), однооконным интерфейсом (Single document) и интерфейсом основанном на диалоговой панели без главного окна (Dialog based).


После того как вы определите тип пользовательского интерфейса приложения, в заголовке диалоговой панели MFC AppWizard будет указано, сколько еще шагов (диалоговых панелей AppWizard) надо будет заполнить, чтобы определить все свойства приложения. Для приложений, имеющих интерфейс на основе главной диалоговой панели, процесс создания приложения будет состоять из 4 шагов, а для приложений, имеющих однооконный и многооконный интерфейс – 6 шагов.

Вы также можете выбрать язык, на котором написан интерфейс приложения. К сожалению, в той версии компилятора, которая была у нас, русский язык отсутствовал. Поэтому мы использовали в наших приложениях английский язык.

Заполнив первую диалоговую панель MFC AppWizard, нажмите кнопку Next >. На экране появится следующая диалоговая панель MFC AppWizard. В зависимости от того, какой тип интерфейса пользователя вы выбрали для приложения, вид этой диалоговой панели может несколько отличаться.

Если вы выбрали интерфейс приложения, основанный на диалоговой панели, тогда диалоговая панель на втором шаге будет иметь вид, показанный на рисунке 4.3. В этой панели можно указать, будет ли у создаваемого приложения информационная диалоговая панель, справочная подсистема, трехмерные органы управления, возможности использования технологии OLE и коммуникации с помощью протокола TCP/IP. Вы также сможете определить заголовок главной диалоговой панели приложения.

Рис. 4.3. Второй шаг MFC AppWizard

Если включить переключатель About box, то приложение будет иметь небольшую информационную панель About. В ней обычно содержится краткая информация о приложении – его название, номер версии, авторские права, небольшая пиктограмма. Чтобы вызвать эту панель, пользователь должен будет выбрать из системного меню главной диалоговой панели приложения строку About App…

Операционная система Windows имеет хорошо развитую справочную систему. Обычно каждое приложение имеет собственный справочный файл данных, содержащий разнообразную информацию о приложении. MFC AppWizard позволяет легко создать заготовку такого файла и подключить ее к приложению. Для этого следует включить переключатель Context sensitive Help. Теперь главная диалоговая панель приложения будет иметь кнопку Help, с помощью которой можно запустить справочную систему приложения.

Современный дизайн интерфейса приложений предполагает, что все органы управления, например кнопки и переключатели, должны выглядеть объемными. Чтобы получить эффект трехмерных органов управления, включите переключатель 3D controls.

Средства автоматизированного создания приложений легко позволяют создавать приложения, использующие OLE технологию. Для приложений, интерфейс пользователя которых основан на диалоговой панели, вы можете использовать технологию OLE automation. Эта технология позволяет приложению работать с объектами, созданными в других приложениях.

Чтобы облегчить программистам создание приложений Windows, разработаны органы управления OLE. Если вы будете их использовать, включите переключатель OLE controls.

Библиотека классов MFC версии 4.0 позволяет создавать приложения, взаимодействующие друг с другом через сетевой протокол TCP/IP. Чтобы включить поддержку этого протокола, включите переключатель Windows Sockets.

По умолчанию название главной диалоговой панели приложения совпадает с именем проекта. Вы можете изменить это название в поле Please enter a title for your dialog.

После того, как вы заполнили диалоговую панель, нажмите кнопку Next >. На экране появится следующая диалоговая панель, предназначенная для определения основных свойств приложения. Мы представили ее на рисунке 4.4.

Рис. 4.4. Третий шаг MFC AppWizard

В этой диалоговой панели вы можете попросить MFC AppWizard немного приподнять завесу тайны над волшебством автоматического создания приложения. Если вы переместите переключатель Would you like to generate source file comments в положение Yes, please, то исходный текст приложения будет снабжен комментариями.

Приложение может использовать библиотеку классов MFC двумя способами – вызывая библиотеки DLL или включая код классов непосредственно в приложение.

В первом случае приложение будет иметь меньший размер, но вместе с ним вы должны будете распространять dll-библиотеки MFC. Описание dll-библиотек MFC вы можете найти в разделе “Первое приложение MFC” главы “Введение в MFC”.

Во втором случае выполнимый файл приложения будет иметь больший размер, но он будет полностью содержать весь код, необходимый для его работы.

Способ подключения библиотеки MFC определяется положением переключателя How would you like to use the MFC library. Если он находится в положении As a shared DLL, то используется dll-библиотека MFC, а если в положении As a statically linked library, то код классов MFC включается непосредственно в выполнимый файл приложения.

Теперь вы можете перейти к последнему этапу определения свойств приложения. Нажмите кнопку Next >. На экране появится диалоговая панель для выбора названий классов приложения. Внешний вид этой панели представлен на рисунке 4.5.

Рис. 4.5. Четвертый шаг MFC AppWizard

В списке AppWizard creates the following classes for you перечислены названия всех классов, которые создает MFC AppWizard для вашего приложения. Названия этих классов являются производными от названия проекта. Ниже этого списка расположены четыре поля Class name, Base class, Header file, Implementation file. Когда вы выбираете из списка AppWizard creates the following classes for you название класса приложения в этих полях отображаются следующая информация:

Имя поля Описание
Class name Имя класса приложения, выбранное вами из списка. Вы можете изменить его по вашему усмотрению или оставить как есть
Base class Имя базового класса MFC, из которого наследуется класс выбранный из списка Class name. Для ряда классов базовый класс можно изменить. Более подробно об этом мы расскажем позже
Header file, Implementation file Эти два поля определяют названия включаемого файла, в котором описан класс, и файла, содержащего исходный код методов класса. Вы можете изменить их по своему усмотрению

Теперь все готово к созданию исходных текстов приложения. Для этого достаточно нажать кнопку Finish. На экране появится панель, содержащая информацию о свойствах приложения: тип интерфейса пользователя, названия классов приложения, а также другие особенности, определенные вами с помощью диалоговых панелей MFC AppWizard. Если все правильно, нажмите кнопку OK. MFC AppWizard сразу приступит к построению проекта, полностью создаст все файлы проекта и загрузит их в среду Microsoft Visual C++.

MFC AppWizard создаст проект, который сразу можно оттранслировать и получить приложение, полностью готовое к запуску. Запустите полученное приложение. На экране появится главная диалоговая панель приложения (рис. 4.6).

Рис. 4.6. Приложение Dialog

Полученное приложение имеет только две кнопки OK и Cancel. Нажав на любую из них, вы можете завершить приложение. Взяв за основу полученный проект, измените его в соответствии с вашими потребностями. Вы можете добавить в диалоговую панель новые органы управления, подключить к ним программный код, создать другие ресурсы, и т. д. Все эти задачи легко решаются в среде Microsoft Visual C++ версии 2.0 и 4.0.

Chapter 7
Инициализация или как написать приложение с нуля

7.4 MFC-приложение — MFC AppWizard

Этот тип приложения обладает всеми достоинствами и недостатками WinAPI-приложения, рассмотренного выше, так как MFC — это библиотека классов С++, т.е. надстройка над WinAPI. Кто-нибудь, конечно, скажет, что приложение на плюсах немерено большое, работает медленно и MFC для ленивых. В общем, тут у каждого свое мнение. Каждый по-своему прав. Тем не менее, я считаю, что для каждой задачи требуется свой инструмент. Где-то лучше использовать MFC, где-то WinAPI. Кричать, что первое или второе является незаменимым средством на все случаи жизни было бы неверно. У MFC есть свои особенности, отнести которые к достоинствам или недостаткам однозначно нельзя. В зависимости от решаемой задачи они идут в плюс или минус. Согласитесь,что глупо забивать сапожный гвоздь кувалдой или же скобу сапожным молотком.

  1. Запустите MSVisualC++6.0
  2. Щелкните меню File->New->MFC AppWizard(exe).
  3. Выберете каталог и имя проекта задайте mfc, щелкните OK.
  4. Step1: Поставьте переключатель на Single document, далее OK.
  5. Step3: Уберите флажок ActiveX Controls, далее OK.
  6. Щелкните Finish.
  7. Щелкните Build->Set Active Configuration и установите тип проекта MFC — Win32 Release
  8. Далее щелкаете Project->Settings->Link->Object/library modules: и добавьте туда opengl32.lib, glu32.lib и glaux.lib

В CMFCView объявите закрытую(private) переменную hGLRC типа HGLRC. Там же объявите функцию int SetWindowPixelFormat(HDC) и открытую(public) функцию display. Вот что должно получится:

Вставьте код этой функции в файл MFCView.cpp. Код возьмите из предыдущего раздела. Отредактируйте функцию CMFCView::PreCretaeWindow следующим образом: Добавьте также функцию display сюда: Теперь запустите View->Class Wizard и добавьте обработчик WM_CREATE,WM_DESTROY и WM_SIZE в класс CMFCView. Отредактируйте их следующим образом: Пояснения смотри в предыдущих разделах. В StdAfx.h включите заголовочные файлы после строчки #include Запустите еще раз Class Wizard и добавьте функцию OnIdle в класс CMFCApp. Эта функция вызывается всякий раз, когда очередь сообщений окна пуста. Отредактируйте ее:

Исходный файл смотрите здесь. Исполняемый файл здесь.

Илон Маск рекомендует:  Что такое код hypot
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL