Мастер приложений mfc как открыть
В предыдущем разделе приложение Windows было завершено вручную, однако на практике большинство из нас использует существующие библиотеки классов для разработки приложений Windows. MFC (Microsoft Foundation Class, Microsoft Foundation Class Library) заключается в том, что Microsoft инкапсулирует Windows API в классы C ++, чтобы упростить работу программистов. Используя эти классы, программисты могут эффективно завершить разработку приложений на платформе Windows. В этой теме мы разберем это подробно.
Помимо MFC, существуют другие библиотеки с открытым исходным кодом, которые помогают эффективно разрабатывать приложения Windows, такие как QT, но QT не разрабатывается Microsoft. Чтобы лучше анализировать MFC, давайте воспользуемся Visual Studio. Шаблон и мастер MFC для создания приложения для одного документа (SDI) на основе MFC.
- Запустите Visual Studio 2010, щелкните меню Файл -> Новый проект -> Проект, выберите язык Visual C ++ в появившемся окне проекта, затем выберите приложение MFC и введите имя проекта как SDIMFC, как показано на следующем рисунке. Показано.
2. После ввода имени проекта нажмите кнопку ОК, появится окно мастера приложений MFC, нажмите Далее и выберите тип приложения: один документ, как показано на следующем рисунке:
3. Нажмите «Далее», появится третье диалоговое окно мастера MFC, поддержка составных документов сохраняет выбор по умолчанию, а затем нажмите «Далее» в появившемся диалоговом окне, чтобы завершить создание однодокументного приложения MFC. Затем нажмите Ctrl + F5, чтобы запустить приложение MFC, после чего вы увидите созданный нами интерфейс приложения MFC, как показано на следующем рисунке:
В приведенной выше программе мы не писали никакого кода. После ее запуска было создано приложение со строкой заголовка, системным меню, развернутым, свернутым полем и регулируемой рамкой. Вся работа выполняется Инструмент мастера MFC помог нам завершить, то есть инструмент мастера сгенерировал для нас много кода, ниже представлена простая программа MFC для анализа структуры MFC.
Давайте посмотрим на код, сгенерированный для нас мастером MFC. Вы можете щелкнуть вкладку представления класса в VS (если вы не видите представление класса в интерфейсе VS, вы можете отобразить его через представление строки меню -> представление класса), вы можете увидеть класс, как показано на рисунке ниже.
3.1 Функция WinMain в приложении MFC
Поскольку функция WinMain существует в исходном коде MFC, нам, естественно, необходимо знать, где находится исходный код MFC. При установке Visual Studio мы установили исходный код MFC. Конкретный путь: путь установки VS \ VC \ atlmfc \ src \ mfc, если вы устанавливаете VS локально в D: \ Program Files (x86), путь к исходному коду MFC: D: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ src \ mfc. Затем используйте средство поиска Windows, чтобы проверить класс C ++, в котором существует функция WinMain. Перед поиском необходимо настроить средство поиска Windows. По умолчанию средство поиска Windows выполняет поиск содержимого в месте без индекса, выполняется поиск только имени файла, и его необходимо указать здесь Чтобы выполнить поиск по имени и содержимому файла, конкретные настройки показаны на рисунке ниже (следующий рисунок можно отобразить, выбрав инструмент -> параметр папки в Win7):
После завершения настройки введите WinMain в поле поиска, и вы увидите результат поиска, как показано ниже:
Реализация функции WinMain фактически находится в файле appmodul.cpp. Откройте файл cpp с помощью VS, и вы увидите определение функции WinMain:
Приведенный выше код - это функция _tWinMain, которая не является той функцией WinMain, которую я хочу. Это неправильно? На этот вопрос ответ отрицательный. Мы не обнаружили ошибки. Здесь _tWinMain - это определение макроса. Нажмите F12, чтобы увидеть, что он представляет WinMain. Исходный код определения макроса следующий (существует в заголовочном файле tchar.h):
Чтобы доказать, что WinMain, которую мы нашли, является той функцией входа, которую нам нужно найти, мы можем установить точку останова в функции _tWinMain в файле appmodul.cpp, а затем нажать кнопку F5, чтобы запустить программу SDIMFC. Мы обнаружили, что программа SDIMFC будет Остановитесь в установленной точке останова, как показано на рисунке ниже:
Мы нашли реализацию функции WinMain в MFC, но не поняли, как созданная нами программа MFC вызывает функцию _tWinMain в appmodul.cpp, то есть как класс MFC в программе связан с функцией WinMain Какой? Давайте посмотрим на класс CSDIMFCApp (что касается того, почему мы думаем об этом классе, потому что его суффикс - это App, то есть приложение, поэтому я предполагаю, что программа войдет в класс перед вводом функции WinMain), дважды щелкните класс в представлении класса, и он будет в VS Увидев определение этого класса в определении класса, мы можем узнать, что класс CSDIMFCApp наследуется от класса CWinAppEx, а класс CWinAppEx наследуется от CWinApp. Чтобы доказать, что код в классе CSDIMFCApp выполняется до функции WinMain, у нас есть конструктор в классе CSDIMFCApp Установите точку останова, а затем нажмите F5, чтобы запустить программу. Вы обнаружите, что программа сначала останавливается в конструкторе класса CSDIMFCApp, а затем переходит в функцию _tWinMain (точка останова - это точка останова, которую мы установили ранее). Вот еще один вопрос - почему программа вообще вызывает конструктор CSDIMFCApp? Теперь, когда конструктор вызван, должен быть определен объект этого класса. Затем мы можем обнаружить, что в классе CSDIMFCApp определен глобальный объект theApp типа CSDIMFCApp, который существует в файле SDIMFC.cpp. Конкретный код определения следующий:
Затем мы устанавливаем точку останова на этом глобальном объекте, а затем нажимаем F5 для отладки и запуска программы. Вы обнаружите, что порядок выполнения программы следующий: глобальный объект приложения -> конструктор CSDIMFCApp (он будет вызываться перед конструктором производного класса Конструктор родительского класса) -> _ функция tWinMain. В программе MFC объект App используется для однозначной идентификации экземпляра приложения, и каждая программа MFC имеет только один объект приложения (в данном случае объект приложения).
3.2 Дизайн и регистрация класса окна
Теперь мы нашли функцию WinMain в MFC. Согласно содержанию предыдущего раздела, следующим шагом будет поиск класса окна и кода для регистрации класса окна в приложении MFC. В предыдущем разделе класс окна и регистрация находятся в WinMain Давайте посмотрим, что инкапсулирует для нас функция WinMain в MFC. Функция WinMain в MFC просто вызывает функцию AfxWinMain. Давайте посмотрим на конкретный код AfxWinMain:
Приведенный выше код сначала вызывает функцию AfxGetThread для получения указателя на тип CWinThread, затем вызывает функцию AfxGetApp для получения указателя на тип CWinApp, а затем продолжает вызывать функцию AfxWinInit для AFX (функция с префиксом AFX является функцией инфраструктуры приложения, Application Framework ) Внутренняя инициализация, а затем pApp вызывает функцию InitApplication. Эта функция в основном выполняет внутреннее управление MFC. Эта функция является виртуальной функцией. Реализация в CWinApp (поиск кода реализации функции рассматривается, как описано выше):
Затем продолжайте вызывать функцию InitInstance для pThread. Нажмите F12, чтобы увидеть, что функция объявлена как виртуальная функция. В соответствии с полиморфизмом класса функция InitInstance, вызываемая в функции AfxWinMain, здесь вызывает функцию InitInstance подкласса CSDIMFCApp. Код определения этой функции:
В приведенном выше коде 77 строк кода и 78 строк кода - это отображение и обновление окна , Окно, созданное для нас m_pMainWnd, нажмите F12, чтобы перейти к его определению в качестве указателя на тип CWnd. Класс Cwnd - это стандартный класс окна, предопределенный для нас MFC. Теперь мы нашли класс окна в программе MFC, следующим шагом будет поиск MFC Как зарегистрировать окно в MFC, регистрация класса окна завершается функцией AfxEndDeferRegisterClass, которая определена в файле Wincore.cpp, а функция AfxEndDeferRegisterClass выполняется внутренне через функцию AfxRegisterClass (функция также определена в файле wincore.cpp ) Для регистрации класса окна Из-за нехватки места исходный код определения его функции здесь не размещен, и вы можете просмотреть его на этом компьютере.
3.3 Создание окна
Мы нашли пакет окна проектирования и регистрации MFC. Следующий шаг - создание окна в программе MFC. Эта функция завершается функцией CreateEx класса CWnd в MFC. Объявление этой функции находится в файле afxwin.h. Конкретный код выглядит следующим образом:
Код реализации находится в файле wincore.cpp. Окно CMainFrame создается в нашей программе. Класс CMainFrame наследуется от CFrameWndEx, который, в свою очередь, наследуется от CFrameWnd. Функция Create класса CFrameWnd вызывает функцию CreateEx, а функция Create CFrameWnd, в свою очередь, используется CFrameWnd. Вызывается функция класса LoadFrame. Объявление функции Create класса CFrameWnd находится в файле afxwin.h, а код его реализации - в файле winfrm.cpp. Код реализации выглядит следующим образом:
3.4 Окно дисплея и окно обновления
В функции InitInstance класса CSDIMFCApp есть код для отображения и обновления окна. Конкретный код выглядит следующим образом:
3.6 Функция оконной процедуры
В функции AfxEndDeferRegisterClass есть такая строка кода (отмечена красным ниже):
На этом этапе мы проанализировали рабочий механизм программы MFC и обнаружили, что процесс опыта такой же, как и во введении к предыдущей теме, но нам не нужно самостоятельно реализовывать эти процессы в MFC. Все они инкапсулируются для нас фреймворком MFC. Сократите количество задач для разработчиков и уделите больше времени реализации бизнес-логики программы. Разберемся вместе с запущенным процессом программы MFC:
В дополнение к главному окну фрейма созданной нами программы MFC существует еще одно окно, которое является визуальным окном, которое соответствует классу CView. Окно фрейма является родительским окном визуального окна. Связь между ними показана на рисунке ниже. Окно главного фрейма - это часть, включенная во внешний фрейм всего приложения, а визуальное окно - это просто пустое пространство в главном окне фрейма.
В этом пошаговом руководстве вы создадите приложение, напоминающее проводник. Вы создадите окно с двумя панелями. На левой панели будет содержаться объект кмфкшеллтриктрл , который отображает рабочий стол в иерархическом представлении. На правой панели будет содержаться кмфкшелллистктрл , отображающий файлы в папке, выбранной в левой области.
Предварительные требования
в Visual Studio 2017 и более поздних версиях поддержка MFC является дополнительным компонентом. чтобы установить его, откройте Visual Studio Installer из Windows меню. найдите версию Visual Studio, которую вы используете, и нажмите кнопку Modify (изменить ). Убедитесь, что установлен флажок Разработка классических приложений на C++ . В разделе необязательные компоненты установите флажок Поддержка MFC .
в этом пошаговом руководстве предполагается, что вы настроили Visual Studio для использования Параметры общей разработки. если вы используете другой параметр разработки, некоторые Visual Studio окна, используемые в этом пошаговом руководстве, могут не отображаться по умолчанию.
Создание нового приложения MFC с помощью мастера приложений MFC
эти действия зависят от используемой версии Visual Studio. Чтобы ознакомиться с документацией по предпочтительной версии Visual Studio, используйте селектор Версия. Он находится в верхней части оглавления на этой странице.
создание проекта MFC в Visual Studio 2019
В главном меню выберите Файл > Создать > Проект, чтобы открыть диалоговое окно Создание проекта.
В поле поиска вверху введите MFC , а затем выберите приложение MFC в списке результатов.
Щелкните Далее. На следующей странице введите имя проекта и при необходимости укажите расположение проекта.
После отображения мастера приложений MFC используйте следующие параметры.
Выберите Тип приложения слева. Затем выберите один документ и выберите Поддержка архитектуры документа/представления. в разделе стиль Project выберите Visual Studio и в раскрывающемся списке визуальный стиль и цвета выберите Office 2007 (синяя тема).
На панели Поддержка составных документов выберите нет.
Не вносите никаких изменений в область Свойства шаблона документа .
На панели функции интерфейса пользователя убедитесь, что выбран параметр использовать строку меню и панель инструментов . Оставьте все остальные параметры как есть.
на панели " дополнительные функции " выберите элементы управления ActiveX, манифест общего элемента управления и область навигации . Оставьте все остальное как есть. В области навигации мастер создаст панель слева от окна с CMFCShellTreeCtrl уже внедренным параметром.
Мы не будем вносить изменения в область созданные классы , поэтому нажмите кнопку Готово , чтобы создать новый проект MFC.
создание проекта MFC в Visual Studio 2017 или более ранней версии
Используйте Мастер приложений MFC для создания нового приложения MFC. Чтобы запустить мастер, в меню файл выберите пункт создать, а затем выберите Project. откроется диалоговое окно новый Project .
в диалоговом окне создание Project разверните узел Visual C++ на панели типы Project и выберите MFC. Затем в области шаблоны выберите приложение MFC. Введите имя проекта, например, MFCShellControls и нажмите кнопку ОК.
После отображения мастера приложений MFC используйте следующие параметры.
В области Тип приложения в разделе Тип приложения снимите флажок документы с вкладками . Затем выберите один документ и выберите Поддержка архитектуры документа/представления. в разделе стиль Project выберите Visual Studio и в раскрывающемся списке визуальный стиль и цвета выберите Office 2007 (синяя тема).
На панели Поддержка составных документов выберите нет.
Не вносите никаких изменений в панель строк шаблона документа .
на панели поддержка баз данных (Visual Studio 2015 и более ранних версий) выберите нет , так как приложение не использует базу данных.
На панели функции интерфейса пользователя убедитесь, что выбран параметр использовать строку меню и панель инструментов . Оставьте все остальные параметры как есть.
в области дополнительные функции в разделе дополнительные возможности выберите только ActiveX элементы управления и манифест общего элемента управления. В разделе Дополнительные области кадров выберите только параметр область навигации . Это приведет к тому, что мастер создаст панель слева от окна с CMFCShellTreeCtrl уже внедренным.
Мы не будем вносить изменения в область созданные классы , поэтому нажмите кнопку Готово , чтобы создать новый проект MFC.
Убедитесь, что приложение успешно создано путем его сборки и запуска. Чтобы выполнить сборку приложения, в меню Сборка выберите пункт построить решение. Если приложение успешно строится, запустите приложение, выбрав начать отладку в меню Отладка .
мастер автоматически создает приложение со стандартной строкой меню, стандартной панелью инструментов, стандартной строкой состояния и панелью Outlook слева от окна с представлением папок и представлением календаря .
Добавление элемента управления "список оболочек" в представление документа
В этом разделе вы добавите экземпляр CMFCShellListCtrl в представление, созданное мастером. Откройте файл заголовка представления, дважды щелкнув мфкшеллконтролсвиев. h в Обозреватель решений.
Теперь добавьте переменную-член типа CMFCShellListCtrl . Сначала необходимо указать следующий комментарий в файле заголовка:
Непосредственно над этим комментарием добавьте следующий код:
Мастер приложений MFC уже создал CMFCShellTreeCtrl объект в CMainFrame классе, но является защищенным членом. Мы будем обращаться к объекту позже, поэтому создадим для него метод доступа. Откройте файл заголовка Маинфрм. h, дважды щелкнув его в Обозреватель решений. Откройте следующий комментарий:
Непосредственно под ним добавьте следующее объявление метода:
Затем откройте исходный файл Маинфрм. cpp, дважды щелкнув его в Обозреватель решений. В нижней части этого файла добавьте следующее определение метода:
В OnCreate методе теперь создадим наш CMFCShellListCtrl объект. Найдите OnCreate Определение метода в исходном файле мфкшеллконтролсвиев. cpp и замените его реализацию следующим кодом:
Последним шагом является соединение CMFCShellTreeCtrl объектов и с CMFCShellListCtrl помощью метода Кмфкшеллтриктрл:: сетрелатедлист . После вызова CMFCShellTreeCtrl::SetRelatedList CMFCShellListCtrl компонент будет автоматически отображать содержимое элемента, выбранного в CMFCShellTreeCtrl . Мы подключим объекты в OnActivateView методе, который переопределен из CView:: онактиватевиев.
В файле заголовка Мфкшеллконтролсвиев. h внутри CMFCShellControlsView объявления класса добавьте следующее объявление метода:
Затем добавьте определение метода в исходный файл Мфкшеллконтролсвиев. cpp:
Убедитесь, что приложение успешно создано путем его сборки и запуска. Чтобы выполнить сборку приложения, в меню Сборка выберите пункт построить решение. Если приложение успешно строится, запустите его, выбрав начать отладку в меню Отладка .
Теперь вы увидите сведения об элементе, выбранном на CMFCShellTreeCtrl панели Просмотр. Если щелкнуть узел в CMFCShellTreeCtrl , CMFCShellListCtrl будет автоматически обновлен. Аналогично, если дважды щелкнуть папку в CMFCShellListCtrl , то CMFCShellTreeCtrl следует автоматически обновить.
Щелкните правой кнопкой мыши любой элемент в элементе управления "дерево" или в элементе управления "список". Вы получаете то же контекстное меню, что и при использовании реального обозревателя файлов.
Дальнейшие действия
мастер создал панель Outlook с панелью папок и областью календаря . Возможно, в окне обозревателя не имеет смысла использовать область календаря , поэтому теперь удалите эту панель.
CMFCShellListCtrl Поддерживает просмотр файлов в различных режимах, таких как крупные значки, мелкие значки, список и сведения. Обновите приложение, чтобы реализовать эту функцию. Указание. см. раздел Visual C++ Samples.
В основе приложений MFC лежит концепция document object/view window (Документ/Вид). Обычно документ представляет собой отдельный файл, который приложение способно открыть. В нем хранятся данные, управляемые приложением. Отображение данных и интерфейс работы с ними обеспечивает представление. Представление способно отображать данные документа частично и в разной форме, выполняя заданный срез документа.
Отношение между документом и представлением строится по принципу "один ко многим". То есть один документ (одно содержание) может иметь несколько представлений (несколько форм), но каждое из этих представлений отображает одни и те же данные.
Программно такая концепция реализуется механизмом SDI (Single Document Interface) - однодокументный интерфейс. Управление документом осуществляется объектом на основе производного класса от базового класса CDocument , а управление интерфейсами - на основе базового класса CView .
Основой для реализации представления является фреймовое окно, определяющее границы приложения и называемое окном-рамкой. Оно порождается классом CFrameWnd . Фреймовое окно является главным окном приложения и играет роль родительского по отношению к содержащимся в нем окнам. Неотъемлемой частью фреймового окна является его заголовок и меню. Клиентскую область фреймового окна занимают всевозможные дочерние окна, в том числе окно панели инструментов, окно строки состояния, окно представления и др.
В приложениях SDI , созданных мастером MFC Application Wizard , исходный код реализации фреймового окна (реализация класса CMainFrame ) размещается в файлах проекта MainFrm.h и MainFrm.cpp . Класс CMainFrame наследует практически все свои функциональные возможности от базового класса CFrameWnd .
Класс CDocument обеспечивает стандартное поведение объектов документа MFC -приложения. Независимо от того, создается однодокументное приложение или многодокументное, мастер AppWizard создает только один класс документа, производный от базового класса CDocument .
Классы массивов MFC
В библиотеке MFC существует несколько классов массивов для хранения различных типов данных. У всех этих классов одинаковые функциональные возможности и работают они по одному и тому же принципу. Основное различие - это тип хранимых в них данных.
Создание заготовки SDI-приложения
Создадим графическое приложение на основе однодокументного интерфейса, в котором можно будет рисовать, и сохранять нарисованное в файле с последующим восстановлением.
Создание простого диалогового приложения Windows типа Dialog Based Application с использованием библиотеки MFC ( Microsoft Foundation Classes )
Выполнение
1. Загрузить MS Visual Studio.
Подробный пример создания приложения в MS Visual Studio по шаблону Windows Forms описывается здесь .
2. Создание проекта
После загрузки MS Visual Studio надо вызвать команду
В окне, которое откроется (рис. 1), выбрать шаблон C++ а в списке типов проектов выбрать MFC Application .
Имя папки, в которой сохраняется проект, даем, например:
Текущие настройки проекта следующие.
1. Поддержка проектом многих документов – MDI Application ( MDI – Multiple Document Interface ). Это означает, что приложение может одновременно держать открытыми несколько документов, каждый из которых представлен отдельным файлом.
2. Нет поддержки баз данных.
3. Нет поддержки составленных (встроенных) документов (контейнер, мини-сервер, полный сервер документов и т.п.).
5. Внешний вид приложения такой как в MS Visual Studio 2008 .
6. Стиль типа проекта как Visual Studio (оформление панелей, открытие документов и т.п.).
Рис. 2. Опции по умолчанию
Рис. 3. Окно Application Type
Объясним некоторые поля окна.
Тип приложения ( Application Type ):
1. Single Document – поддержка SDI -приложения ( Single Document Interface – интерфейс с единым документом). Это есть интерфейс с единым документом, который разрешает в каждый момент времени иметь открытым только один документ. Например, редактор Notepad (Блокнот).
3. Dialog Based – создание приложения как простого диалогового окна, которое вообще не открывает документов. Например, программа Калькулятор из пакета Windows .
4. Multiple top level documents – поддержка многодокументного интерфейса такая же как в MDI -приложении. Только в этом случае документы группируются в разных окнах в панели задач Windows , а не в границах приложения. Например, новые версии Windows поддерживают этот режим.
В нашем случае нужно выбрать Dialog Based , как показан на рисунке 3.
Для нашего приложения пока что не имеет значения, какой вариант формирования MFC библиотеки выбирать.
Рис. 4. Выбор оформления фрейма (рамки) главного окна приложения
- Thick frame (утолщенная рамка). В этом случае границы окна есть утолщенные.
- Minimize box – кнопка минимизации окна.
- Maximize box – кнопка максимизации окна.
- System menu – системное меню, которое размещается в левому верхнем углу окна.
- Minimized – режим, при котором во время запуска окно приложения свертывается в пиктограмму.
- Maximized – режим, при котором во время запуска окно приложения разворачивается на весь экран.
Выбор опций можно установить на собственное усмотрение.
В поле Dialog Title устанавливается название приложения.
Рис. 5. Окно настройки дополнительных свойств
В окне на рисунке 5 доступны опции настройки дополнительных свойств приложения. Объясним некоторые из них.
Рис. 6. Запрос к подтверждению имен создаваемых классов
Рис. 7. Форма приложения после выполнения мастера App Wizard
Теперь можно запустить приложение на выполнение и проанализировать его работу.
3. Классы, создаваемые в приложении
В результате выполненных действий, будет создано два класса с именами CMFCApplication1App и CMFCApplication1Dlg .
Класс CMFCApplication1App унаследован от CWinApp . Этот класс есть классом приложения в целом.
Класс CMFCApplication1Dlg есть классом диалога для приложения в целом.
После создания приложения в Solution Explorer создаются файлы классов (рис. 8).
Рис. 8. Файлы приложения в Solution Explorer
В вышеприведенном листинге между директивой
реализовано предотвращение повторного использования одинаковых имен файлов заголовков, которые даже могут быть размещены в разных папках.
В вышеприведенном листинге наибольший интерес представляет функция InitInstance() .
В функции InitInstance() создается окно приложения.
Описывается переменная dlg типа окно приложения.
означает, что данное окно приложения есть главным окном среди всех окон, которые могут быть еще созданы в приложении.
Читайте также: