Mfc что за программа

Пакет Microsoft Foundation Classes (MFC) — библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путём использования богатого набора библиотечных классов.

  • 1 Принцип действия
  • 1.1 Добавление кода в каркас приложения

Принцип действия [ ]

Кроме того, MFC предоставляет объектно-ориентированный слой Шаблон:Lang-en ) над множеством функций Windows API, делающий несколько более удобной работу с ними. Этот слой представляет множество встроенных в систему объектов (окна, Добавление кода в каркас приложения [ ]

Добавление кода приложения к каркасу реализовано двумя способами. Первый использует механизм Шаблон:Lang-en ), содержащие пары «ID сообщения — указатель на обработчик». При добавлении/удалении обработчика мастер вносит изменения в соответствующую карту сообщений.

История [ ]

Первая версия MFC была выпущена вместе с седьмой версией 16-разрядного компилятора языка C/C++ компании Microsoft в 1992 году. Для тех, кто занимался разработкой приложений с использованием [1] . В MFC включалась поддержка нового интерфейса Ribbon и несколько других усовершенствований, связанных с улучшенными интерфейсными элементами управления. После выпущенного пакета обновления для Visual Studio 2008 данные классы стали неотъемлемой частью MFC.

Программирование на С++ / MFC . Часть 1. Калькулятор — начало.

Версии [ ]

    Примечания [ ]

См. также [ ]

  • Иерархия классов MFC
  • Шаблон:Инструментарии виджетов

Источник: microsoft.fandom.com

MFC В 2022

Как бы мне не хотелось ответить на этот вопрос. Но ответа я не знаю. На рабочем проекте была задача написать редактор на MFC. Да, да. На MFC. Для тех, кто не знает, MFC — графическая библиотека от Microsoft, на которой стояли Microsoft Office и Visual Studio до 2010 года и выглядит примерно вот так:

Документация

Хоть и компания Microsoft любит делать подробную документацию для своих творений, но с MFC ситуация оказалась иная. Хоть он и имеет в районе 100 страниц на msdn (я знаю, что сайт переехал, но привычки не меняются), но это только на первый взгляд. Как только вам приходится делать что-то серьёзное, касаемо самих контролов, можете о ней забыть. Придётся выкачивать символы и исходный код данной библиотеки и разбираться в отладчике, вникая в аспекты UI библиотеки построенной на событиях. Ладно, у меня слишком много накипело и вводную я могу писать вечно, так что перейдём к сути.

Убийца #1 — Visual Manager

Если кто-то заходил дальше диалоговых окон, то знает что есть режимы SDI и MDI, которые представляют собой полноценное окно с табами(и без них). И их визуализацией занимается как раз таки Visual Manager (нет), у которого даже есть множество тем, начиная с WinXP и заканчивая Windows 7. (+VS и MSOffice)

Читайте также:
Gnuplot что это за программа

Изучаем С++ MFC Часть 1

На самом деле VisualManager выполняет весьма скудную роль в этом деле. Он контролирует Ribbon, PropertyGrid, MDI Tabs, Toolbar (который CMFCToolbar. Их там несколько, ребят), Header и Caption Bar. Но если же вы хотите сделать нечто следующее:

То вам придётся знакомится с событиями WM_PAINT, WM_CLRCTL (а ещё и иногда с *_NC_ аналогами этих событий) и перегружать все наши любимые кнопки, текстбоксы и статики. Помимо этого, добавлять в DocablePane функции, которые будут указывать для DC цвет текста и фона для CTreeCtrl.

Убийца #2 — PropertyGrid

Думаю, всем известно, что пропы это весьма обширная UI часть и везде нам не нравится их реализация. Помните, я говорил, что Visual Manager отвечает за их отрисовку? В данном случае, лучше бы он этого не делал. Почему? Представьте что вам нужен кастомный проп, в котором должна быть кнопка, или несколько.

Но. У пропа всего 1 hwnd, что не позволяет вам быстрой перегрузкой докинуть кнопку в его содержимое. И тут уже идёт магия с созданием алгоритмов просчёта позиции.

Ситуация 2: Диалоговые окна.
К несчастью, при использовании CMFCPropertyGridCtrl в диалоговых окнах, можно встретить неправильный width:

Данная проблема решается перегрузкой класса следующим образом:

class CDialogPropertyGridControl : public CMFCPropertyGridCtrl < public: CDialogPropertyGridControl() < m_nLeftColumnWidth = 100; >void make_fixed_header() < HDITEM hdItem = < 0 >; hdItem.mask = HDI_FORMAT; GetHeaderCtrl().GetItem(0, hdItem.fmt |= HDF_FIXEDWIDTH; GetHeaderCtrl().SetItem(0, > void SetLeftColumnWidth(int cx) < m_nLeftColumnWidth = cx; AdjustLayout(); >void OnSize(UINT f, int cx, int cy) < EndEditItem(); if (cx >50) m_nLeftColumnWidth = cx — 50; // DECLARE_MESSAGE_MAP() >;

Честно говоря, быстрее выйдет написать свой PropertyGrid, если Вам придётся часто с ним работать. Т.к. если не брать в расчёт предыдущие аспекты, сам по себе он вызывает очень громоздкий код, который придётся обвешивать get/set на каждый чих. За два вечера я смог написать базовый проп под свои нужды, который работает напрямую с передаваемой переменной и имеет тот же функционал:

Убийца #3 — RibbonBar

Честно говоря, Ribbon в MFC весьма прогрессивнее в плане работы, чем все остальные компоненты. Даже его внутренность построенная на xml, в отличии от тех же диалоговых окон. Но, я так думал, пока не пришлось добавлять на него кастомный элемент. И как было бы не смешно, им оказался RadioBtn. Да, забавный факт, но там нет понятия всеми любимых радио-кнопок.

Читайте также:
Ant plugins что это за программа на Андроид

Шаг 1 — Новый класс для Ribbon

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

BOOL XRibbonBar::LoadFromResource(LPCTSTR lpszXMLResID, LPCTSTR lpszResType /*= RT_RIBBON*/, HINSTANCE hInstance /*= NULL*/) < ASSERT_VALID(this); CMFCRibbonInfo info; CMFCRibbonInfoLoader loader(info); if (!loader.Load(lpszXMLResID, lpszResType, hInstance)) < TRACE0(«Cannot load ribbon from resourcen»); return FALSE; >XRibbonConstructor constr(info); constr.ConstructRibbonBar(*this); return TRUE; >

Шаг 2 — Конструктор

А тут уже объясняем, в чём не прав стандартный конструктор MFC

CMFCRibbonBaseElement* XRibbonConstructor::CreateElement(const CMFCRibbonInfo::XElement if (info.GetElementType() == CMFCRibbonInfo::e_TypeButton_Check) < const CMFCRibbonInfo::XElementButtonCheck)info; // RadioBox if (strstr(info.m_strKeys, «RB»)) < // Make friends list string TryStr = info.m_strKeys.operator LPCSTR(); TryStr = TryStr.substr(2); int pNewElement = new XRibbonRadioBox(infoElement.m_ID.m_Value, infoElement.m_strText); ConstructBaseElement(*pNewElement, info); return pNewElement; >> return CMFCRibbonConstructor::CreateElement(info); >

strstr(info.m_strKeys, «RB») — Это флаг в визуальном редакторе, благодаря которому мы можем впихнуть кучу UserInfo

P.S.

Хочется сказать большое спасибо людям с CodeProject и StackOverflow за огромное количество подсказок при глубокой работе с данным UI API.

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

  • C++
  • Visual Studio
  • Разработка под Windows

Источник: habr.com

mfc учебник
Начало работы с mfc

Классы Microsoft Foundation или MFC — это библиотека, которая предоставляет объектно-ориентированную оболочку вокруг API Win32. Инкапсулируя «необработанный» API Win32 в C ++-классах, MFC значительно упрощает создание графических приложений и управление ресурсами.

MFC существует очень долгое время. Он был впервые представлен в 1992 году с версии 7 компилятора Microsoft C / C ++. В это время разработка C ++ только начала взлетать. Последующие версии Visual Studio поставляются со значительно улучшенными версиями MFC. Он по-прежнему включен в последнюю версию Visual Studio 2015.

Но его устаревшие корни, к сожалению, довольно заметны. Поскольку большинство из них было разработано до стандартизации языка C ++, классы MFC не используют в полной мере современные возможности C ++, такие как шаблоны, предоставляют собственные пользовательские реализации других стандартных функций C ++, таких как RTTI, и используют множество нестандартных идиом , Эти факты делают почти невозможным компиляцию приложения MFC с любым компилятором, отличным от Microsoft. С другой стороны, MFC хорошо интегрирована в Visual Studio, что значительно облегчает процесс разработки.

Во время ранней разработки библиотека называлась расширением Application Framework (сокращенно AFX). Затем отдел маркетинга изменил свое имя на MFC, но было слишком поздно менять какой-либо код, поэтому большая часть кода по-прежнему ссылается на «Afx» вместо «Mfc». Заметным примером является стандартный предварительно скомпилированный заголовочный файл, который автоматически генерируется Visual Studio: он называется StdAfx.h .

Читайте также:
Клавиатура swiftkey что это за программа на Андроид и нужна ли она

7 апреля 2008 г. Microsoft выпустила обновление для классов MFC в качестве внеполосного обновления для Visual Studio 2008 и MFC 9. В обновлении реализованы новые конструкции пользовательского интерфейса, в том числе ленты (аналогичные лентам Microsoft Office 2007) и связанные с ним виджеты пользовательского интерфейса, полностью настраиваемые панели инструментов, стыковочные панели (например, Visual Studio 2005), которые могут свободно размещаться или состыковываться с любой стороны и вкладками документов. Новые функции предоставляются в новых классах, так что старые приложения продолжают работать. Это обновление основано на BCGSoft в BCGControlBar Library Professional Edition и было названо MFC Feature Pack .

Итак, теперь MFC состоит из двух библиотек с разными подходами:

  • Классический MFC (обертка для Win32 API).
  • MFC Feature Pack (смешанный набор из элементов управления Win32 API и новые элементы управления самонастраиванием, такие как лента).

Смотрите также:

  • Приложения для настольных компьютеров MFC (обзор)
  • Ссылка MFC (ссылка на API)
  • MFC Feature Pack (обзор)
  • Справочник по набору компонентов MFC (ссылка API Feature Pack)
  • Образцы пакета MFC Feature Pack

Основная программа MFC

// Include the MFC header: // (you do not need to and should not include the standard Windows headers, e.g. // Windows.h) #include // MFC core and standard components // The following header defines resource constants, such as dialog and control IDs: #include «resource.h» // The basic element of an MFC application is a class that inherits from CWinApp. class CMyApp : public CWinApp < // This gets called as the application gets initialized. virtual BOOL InitInstance() < // Initialize a CDialog object to show in a moment. CDialog dlg(IDD_DIALOG1); // Display the dialog box as a modal dialog box. dlg.DoModal(); // Return FALSE from this method to exit the application. return FALSE; >>; // The one and only application object. CMyWinApp theApp;

Резюме:

IDD_DIALOG1 должен быть идентификатором диалогового окна, определенного в файле ресурсов проекта, созданном редактором ресурсов, например, встроенным в Visual Studio. (Файл ресурсов обычно имеет расширение .rc.) Чтобы настроить поведение диалогового окна, вы можете получить новый класс из CDialog.

Модальное диалоговое окно запускает собственный цикл сообщений. Вызов «dlg.DoModal ();» не возвращается, пока пользователь не закроет диалог.

Если бы мы вернули TRUE из InitInstance (), он запустил цикл сообщений приложения. Это используется, когда у вас более сложное приложение, не связанное с диалогом.

Источник: learntutorials.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru