Mfc что это такое в телевизоре

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

Microsoft Foundation Classes (MFC). Иерархия классов

MFC – это библиотека классов, написанных на языке C++. MFC является оболочкой для Win32 API и содержит многоуровневую иерархию классов. Не все функции Win32 API включены в MFC . С другой стороны, эта библиотека классов охватывает большую часть функциональных возможностей Windows , и предоставляет разработчику ряд дополнительных механизмов для проектирования и создания программных продуктов.

На вершине иерархии MFC находится единственный базовый класс – CObject. Все остальные классы библиотеки MFC можно условно разбить на две группы: производные и не производные от него. Чаще всего, создание нового MFC -приложения поручается мастеру MFC Application Wizard . Мастер генерирует основной скелет приложения, который впоследствии заполняется нужным кодом, давая готовое приложение .

Из монитора.Позистор,что за деталь?

Основные классы MFC

Некоторые классы MFC порождаются непосредственно от CObject . Наиболее широко используемыми среди них являются CCmdTarget, CFile, CDC , CGDIObject и CMenu . Класс CCmdTarget предназначен для обработки сообщений. Класс CFile предназначен для работы с файлами. Класс CDC обеспечивает поддержку контекстов устройств. В этот класс включены практически все функции графики GDI.

CGDIObject является базовым классом для различных GDI-объектов, таких как перья, кисти, шрифты и другие. Класс СMenu предназначен для работы меню.

Класс CCmdTarget

От класса CCmdTarget порождается очень важный класс CWnd . Он является базовым для создания всех типов окон, включая масштабируемые («обычные») и диалоговые, а также различные элементы управления. Наиболее широко используемым производным классом является CFrameWnd . В большинстве программ главное окно создается с помощью именно этого класса. От класса CCmdTarget , через класс CWinThread , порождается единственный из наиболее важных классов, обращение к которому в MFC-программах происходит напрямую, это класс CWinApp . Это один из фундаментальных классов, поскольку предназначен для создания самого приложения. В каждой программе имеется один и только один объект этого класса. Как только он будет создан, приложение начнет выполняться.

Класс CWinApp

Класс CWinApp является базовым классом, на основе которого образуют обязательный объект – приложение Windows. Основными задачами объекта этого класса являются инициализация и создание главного окна, а затем опрос системных сообщений. Иерархия класса CWinApp : CObject -> CCmdTarget -> CWinThread -> CWinApp

Класс CFrameWnd («окна-рамки») и производные от него классы определяют окна-рамки на мониторе. Элементы управления, создаваемые при проектировании интерфейса пользователя, принадлежат семейству классов элементов управления.

Плавность и тормоза в телевизоре! ТВ приставка с AFR спасает?! Тест плавности тв! Как проверить ТВ?

Появляющиеся в процессе работы приложения диалоговые окна – это объекты классов, производных от CDialog . Классы CView, CFrameWnd, CDialog и все классы элементов управления наследуют свойства и поведение своего базового класса CWnd («окно»), определяющего, по существу, Windows-окно. Этот класс, в свою очередь, является наследником базового класса CObject («объект»). Как правило, структура приложения определяется архитектурой Document-View (документ-вид). Это означает, что приложение состоит из одного или нескольких документов – объектов, классы которых являются производными от класса CDocument (класс «документ»). С каждым из документов связаны один или несколько видов – объектов классов, производных от CView (класс «вид» ), и определяющих методы обработки объектов класса документа.

Соглашение об именах MFC

В качестве префикса, обозначающего имя класса, библиотека MFC использует заглавную букву «C» (от слова «class»), за которой идет имя, характеризующее назначение класса. Например:

  • CWinApp – класс, определяющий приложение;
  • CWnd – базовый класс для всех оконных объектов;
  • CDialog – класс диалога.

При определении имен функций-членов классов используется три варианта:

  1. Имя объединяет глагол и существительное – DrawText (нарисовать текст).
  2. Имя состоит только из существительного – DialogBox (блок диалога).
  3. Для функций, предназначенных для преобразования одного типа в другой, используются такие имена, как XtoY (из X в Y).

Для членов классов библиотеки MFC используется следующий способ назначения имен: обязательный префикс m_ (от class member – член класса), за которым идет префикс, характеризующий тип данных, и завершается все заданием содержательного имени переменной. Например, m_pMainWnd – указатель на класс главного окна. Для переменных, которые не являются членами класса, m_ не ставится.

Еще по теме:  Почему телевизор сел на диету загадка

Включаемые файлы

AFXWIN.H – содержит описание основных классов библиотеки и сводит воедино все включаемые файлы, необходимые для работы MFC.

AFX.H – содержит описания классов общего назначения, макросы, базовые типы данных MFC.

AFXRES.H – подключает стандартные идентификаторы ресурсов.

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

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

Карта сообщений

Для создания стандартного окна в приложении должен наследоваться класс от CFrameWnd . Он содержит конструктор и макрос DECLARE_MESSAGE_MAP() . Макрос декларирует карту сообщений, которая определяет, какая член-функция класса должна вызываться в ответ на сообщение Windows. Этот макрос применяется для любого окна, в котором обрабатываются сообщения. Он должен быть последним в декларировании класса, использующего карту сообщений. В конце программы помещается реализация карты сообщений:

BEGIN_MESSAGE_MAP(CMainWnd /*класс окна*/, CFrameWnd /* класс-предок */) END_MESSAGE_MAP()

Первый макрос всегда имеет два параметра, первый – класс окна, второй – класс, от которого порожден класс окна. В данном примере карта сообщений пустая, то есть все сообщения обрабатывает MFC.

В библиотеке MFC все возможные сообщения разделены на три основные категории:

  1. сообщения Windows;
  2. извещения элементов управления;
  3. командные сообщения (команды).

В первую категорию входят сообщения, имена которых начинаются с префикса WM_ , за исключением WM_COMMAND . Во вторую категорию входят извещения ( notification messages ) от элементов управления и дочерних окон, направляемых родительским окнам. Третья категория охватывает все сообщения WM_COMMAND , называемых командами (командными сообщениями), от объектов интерфейса пользователя, который включает меню, кнопки панелей инструментов и акселераторы.

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

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

Включение макрокоманд в карту сообщений

Чтобы программа могла ответить на сообщение, в карту сообщений должна быть включена соответствующая макрокоманда. Названия макрокоманд соответствуют именам стандартных сообщений Windows, но дополнительно имеют префикс ON_ и заканчиваются парой круглых скобок. Из этого правила есть исключение: сообщению WM_COMMAND соответствует макрокоманда ON_COMMAND(. ) . Причина в том, что это сообщение обрабатывается особым образом. Чтобы включить макрокоманду в очередь сообщений, необходимо поместить ее между командами BEGIN_MESSAGE_MAP(…) и END_MESSAGE_MAP() . Например, если необходимо обработать в программе сообщение WM_CHAR , то очередь должна выглядеть так:

BEGIN_MESSAGE_MAP(CMainWnd, CFrameWnd) ON_WM_CHAR() END_MESSAGE_MAP()

В очереди может находиться более одной макрокоманды. Сообщение WM_CHAR генерируется при нажатии алфавитно-цифровой клавиши на клавиатуре.

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

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

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

Class CMainWnd: public CFrameWnd

Спецификатор afx_msg означает объявление обработчика сообщения. На данный момент он не используется и представляет собой пустой макрос. Но в будущем возможны расширения. Поэтому использование спецификатора нужно считать обязательным. Для каждого обработчика должна быть описана его реализация.

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

Сообщение WM_PAINT

Операционная система Windows устроена таким образом, что за обновление содержимого окна отвечает программа. Например, если часть окна была перекрыта другим окном, а затем вновь открыта, или минимизированное окно было восстановлено, то окну посылается сообщение WM_PAINT . В ответ на него окно должно обновить свою клиентскую область. Прототип обработчика WM_PAINT следующий:

afx_msg void OnPaint();

Макрокоманда называется ON_WM_PAINT() .

Для примера создадим обработчик, который выводит строку «Использование OnPaint()» в клиентскую область по координатам x = 25, y = 25:

afx_msg void CMainWnd::OnPaint()

В обработчике WM_PAINT нужно всегда пользоваться классом CPaintDC , который представляет собой класс клиентской области, но предназначенный для использования именно с этим сообщением. Это обусловлено архитектурой самой Windows. Функция TextOut(…) предназначена для вывода текста в контекст устройства (в данном случае – в окно).

Еще по теме:  Телевизор Huawei vision отзывы

При ее использовании, по умолчанию первые два параметра определяют координаты верхнего левого угла текстовой строки. По умолчанию координаты представляют собой реальные пиксели, ось x направлена слева направо, ось y – сверху вниз. Эта функция перегруженная, наиболее удобный для нас вариант – когда третий параметр имеет тип CString . Этот класс входит в MFC и является очень удобной заменой для строк, завершаемых нулем. Большинство реальных окон (за исключением диалогов) должны обрабатывать сообщение WM_PAINT . Более того, если Вы хотите написать корректную программу, то весь вывод в окно должен осуществляться только в обработчике WM_PAINT . В случае получения контекста из обработчика WM_PAINT с помощью класса CPaintDC , Windows гарантирует наличие свободного контекста.

Источник: intuit.ru

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)

На самом деле 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. Да, забавный факт, но там нет понятия всеми любимых радио-кнопок.

Шаг 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 я перевёл в общий стандарт и опубликовал по ссылке ниже. Скорее всего, данный репозиторий будет со временем пополняться. Надеюсь, кому-то данная библиотека решений сократит пару десятков часов.

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

DIT_MFC: По вашему заявлению было принято решение – что это

juicepost.ru

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

Смс DIT_MFC По вашему заявлению было принято решение

Почему Вам пришло сообщение от DIT_MFC

Сначала разберемся с аббревиатурой.
DIT – департамент информационных технологий г. Москвы, одной из функций организации является внедрение сервисов для перевода муниципальных услуг в электронный вид.
MFC – многофункциональный центр занимающийся оказанием местных и государственных услуг населению по принципу «одного окна». Выдача справок, выписок, сертификатов, свидетельств, загранпаспортов и прочих документов.

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

“Мои документы” – это бренд MFC

Перечень большой: это выдача загранпаспорта старого и нового образца, сертификата на материнский капитал, полисов ОМС, архивных документов (справок, выписок, копий), выдача или замена российского паспорта, госрегистрация прав на недвижимое имущество, предоставление сведений из ЕГРН и т.д.
Такой подход позволил значительно сократить сроки принятия решения по заявлению, получение происходит быстрее.
Рассылка смс делается для оповещения гражданина о ходе дела по его документам.

Что это за смс от DIT_MFC

Если Вам пришла смс от DIT_MFC с текстом “По вашему заявлению было принято решение” – это значит, что Вы обращались в МФЦ с запросом на выдачу каких-то официальных бумаг. Сделать это можно двумя способами – лично прийти в центр или дистанционно через портал государственных услуг РФ.

Подать заявление можно на ресурсе госуслуг

Вы подаете заявку в МФЦ, ей присваивается номер для внесения в базу. Это и есть номер, который указан в смс. После обработки запроса и принятия решения по Вашему заявлению приходит сообщение о готовности документа, можно идти в центр для получения.

Не подвали заявление, а уведомление от МФЦ пришло

Если возникли вопросы о полученном сообщении Вы можете уточнить информацию в местном центре или позвонить по общему телефону 8-800-550-50-30. Свяжитесь с оператором и выясните о каком документе идет речь, Вы могли забыть, что запрашивали какие-то выписки.

Не припомните что подвали заявление – возможно смс пришла по ошибке. Кто-то неправильно указал свой телефон или в рассылке произошли сбои.

Это можно выяснить несколькими способами.

– В смс указан номер заявления по которому было вынесено решение, а также контактный телефон для обратной связи. Позвоните по нему и назовите идентификатор документа из сообщения.

– Проверить на сайте МФЦ статус готовности. Перед этим нужно пройти регистрацию на ресурсе или авторизоваться, если уже создавали там свою учетную запись.

– Позвонить по телефону горячей линии МФЦ 8-800-550-50-30. Это номер для проверки состоянии обращения и предварительной записи.

– Узнать информацию в группах МФЦ в социальных сетях. В группе VK в правом нижнем углу есть кнопка Dit Robot для связи с поддержкой. Вас попросят указать номер Вашего телефона и номер заявления, указанный в смс.

Пришла смс DIT_MFC – уточните информацию на странице центра в VK

Кнопка Dit Robot для связи с поддержкой DIT_MFC в соц. сети VK

Источник: juicepost.ru

Оцените статью
Добавить комментарий