Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Вспомогательные функции каркаса приложенияСодержание книги
Поиск на нашем сайте
В MFC не все функции являются членами классов. Есть набор функций-утилит, существующих независимо от каких-либо классов. Они называются функциями каркаса приложения, их имена начинаются с Afx. Функции-члены классов можно вызывать только применительно к объектами этих классов, а функции каркаса приложения можно вызывать из любого места программы. В табл. 4.1 перечислены несколько наиболее часто используемых функций AFX. AfxBeginThread упрощает создание новых исполняемых потоков. Функция AfxMessageBox является аналогом функции MessageBox из Windows API. Функции AfxGetApp и AfxGetMainWnd возвращают указатели на объект-приложение и на главное окно приложения. Они полезны, когда вы хотите вызвать функцию-член или обратиться к переменным этих объектов, но не знаете указателя на них. Функция AfxGetInstanceHandle позволяет получить дескриптор экземпляра EXE-файла для передачи его функции Windows API (в программах MFC иногда тоже приходится вызывать функции API).
Таблица. 4.1. Часто используемые функции семейства AFX
2. Простейшее приложение на MFC Конечно, в качестве простейшего примера рассмотрим модифицированное приложение "Hello, world" – "Hello, MFC". В нем будет продемонстрирован ряд особенностей разработки Windows-приложений на базе MFC: · наследование новых классов от MFC-классов CWinApp и CFrameWnd; · использование класса CPaintDC при обработке сообщения WM_PAINT. · применение карт сообщений. Исходный текст приложения Hello приведен в виде фрагментов программы 4.1а и 4.1б. В заголовочном файле Hello.h содержатся описания двух унаследованных классов. В Hello.cpp размещена реализация этих классов.
Фрагмент программы 4.1а. Приложение Hello – заголовочный файл Hello.h
#if!defined(__HELLO_H) # define __HELLO_H
class CMyApp: public CWinApp { public: virtual BOOL InitInstance(); };
class CMainWindow: public CFrameWnd { public: CMainWindow();
protected: afx_msg void OnPaint(); DECLARE_MESSAGE_MAP() };
#endif
Фрагмент программы 4.1б. Приложение Hello – файл реализации Hello.cpp
#include <afxwin.h> // Описание CWinApp и других классов каркаса приложения MFC #include "Hello.h"
CMyApp myApp;
// Функции-члены CMyApp BOOL CMyApp::InitInstance() { m_pMainWnd = new CMainWindow; m_pMainWnd->ShowWindow(m_nCmdShow); m_pMainWnd->UpdateWindow(); return TRUE; }
// Карта сообщений и функции-члены CMainWindow BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP()
CMainWindow::CMainWindow() { Create(NULL, "Приложение Hello"); }
void CMainWindow::OnPaint() { CPaintDC dc(this);
CRect rect; GetClientRect(&rect);
dc.DrawText("Hello, MFC", -1, &rect, DT_SINGLELINE ¦ DT_CENTER ¦ DT_VCENTER); }
Главное окно приложения Hello показано на рис. 4.1. Это окно является полноценным перекрываемым окном Windows: его можно перемещать, изменять размеры, сворачивать, разворачивать и закрывать. При любом размере окна строка "Hello, MFC" все равно выводится в центре клиентской области.
Рис. 4.1. Главное окно приложения Hello.
2.1 Объект-приложение Центральная компонента MFC-приложения – объект-приложение подкласса CWinApp. CWinApp содержит цикл обработки сообщений, в котором выполняется выборка и диспетчеризация сообщений в оконную процедуру главного окна приложения. В этом классе есть виртуальные функции, которые можно перегружать для реализации поведения конкретного приложения. В приложении MFC должен быть ТОЛЬКО ОДИН объект-приложение. Он объявляется в глобальной области видимости, чтобы создание объекта производилось сразу после запуска приложения. Класс-приложение в программе Hello называется CMyApp. Объект этого класса создается в файле Hello.cpp с помощью оператора описания переменной: CMyApp myApp; В классе CMyApp нет переменных членов и есть только одна перегруженная функция, унаследованная от CWinApp – функция-член InitInstance. Она вызывается каркасом сразу после запуска приложения. В InitInstance должно создаваться главное окно приложения. Поэтому даже самое маленькое MFC-приложение должно унаследовать класс от CWinApp и перегрузить в нем функцию InitInstance.
Функция InitInstance По умолчанию виртуальная функция CWinApp::InitInstance состоит из единственного оператора возврата: return TRUE; InitInstance предназначена для выполнения инициализации, необходимой при каждом запуске программы (как минимум, должно создаваться главное окно приложения). Возвращаемое значение InitInstance является признаком удачной/неудачной инициализации. При неудачной инициализации (значение FALSE) приложение будет завершено. В CMyApp::InitInstance главное окно приложения является объектом класса CMainWindow, адрес этого объекта сохраняется в переменной-члене CWinApp::m_pMainWnd: m_pMainWnd = new CMainWindow; После создания главного окна InitInstance выводит его на экран с помощью функций-членов класса CMainWindow: m_pMainWnd->ShowWindow(m_nCmdShow); // Вывод окна на экран m_pMainWnd->UpdateWindow(); // Обновление содержимого окна Виртуальные функции ShowWindow и UpdateWindow унаследованы от CWnd – базового класса для всех оконных классов MFC, в том числе и для CFrameWnd, от которого унаследован CMainWindow. Функция ShowWindow в качестве параметра принимает целочисленный код состояния окна: свернутое, развернутое или обычное (значение по умолчанию SW_SHOWNORMAL). Приложение Hello передает в ShowWindow значение переменной CWinApp::m_nCmdShow, в которой каркас приложения сохраняет параметр nCmdShow функции WinMain.
Виртуальные функции CWinApp Кроме InitInstance, в классе CWinApp есть и другие виртуальные функции-члены, которые можно перегружать для выполнения специфических действий приложения. В справочной системе в описании класса CWinApp вы можете увидеть более десяти виртуальных функций, например, WinHelp и ProcessWndProcException, но большинство из низ используются редко. Функцию ExitInstance можно использовать для освобождения ресурсов при завершении приложения (например, ресурсов и памяти, выделенных в InitInstance). В реализации "по умолчанию" функция ExitInstance выполняет некоторые действия по очистке, предусмотренные в каркасе приложения, поэтому при перегрузке обязательно надо вызывать ExitInstance из базового класса. Значение, возвращенное ExitInstance, является кодом выхода, возвращаемым из WinMain. Среди других полезных виртуальных функций CWinApp можно назвать OnIdle, Run и PreTranslateMessage. OnIdle удобна для выполнения некоторой фоновой обработки, вроде обновления каких-либо индикаторов. Слово "idle" переводится как "ожидание, простой". Эта функция вызывается. когда очередь сообщений потока пуста. Поэтому OnIdle является удобным механизмом выполнения фоновых задач с низким приоритетом, не требующих отдельного исполняемого потока. Функцию Run можно перегрузить с целью модификации цикла обработки сообщений, но это делается редко. Если надо выполнить некоторую специфическую предварительную обработку некоторых сообщений до их диспетчеризации, то достаточно перегрузить PreTranslateMessage и не изменять цикл обработки сообщений.
|
||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-08-01; просмотров: 447; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.132.6 (0.006 с.) |