Вспомогательные функции каркаса приложения 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вспомогательные функции каркаса приложения



В MFC не все функции являются членами классов. Есть набор функций-утилит, существующих независимо от каких-либо классов. Они называются функциями каркаса приложения, их имена начинаются с Afx. Функции-члены классов можно вызывать только применительно к объектами этих классов, а функции каркаса приложения можно вызывать из любого места программы.

В табл. 4.1 перечислены несколько наиболее часто используемых функций AFX. AfxBeginThread упрощает создание новых исполняемых потоков. Функция AfxMessageBox является аналогом функции MessageBox из Windows API. Функции AfxGetApp и AfxGetMainWnd возвращают указатели на объект-приложение и на главное окно приложения. Они полезны, когда вы хотите вызвать функцию-член или обратиться к переменным этих объектов, но не знаете указателя на них. Функция AfxGetInstanceHandle позволяет получить дескриптор экземпляра EXE-файла для передачи его функции Windows API (в программах MFC иногда тоже приходится вызывать функции API).

 

Таблица. 4.1. Часто используемые функции семейства AFX

Имя функции Назначение
AfxAbort Безусловное завершение работы приложения (обычно при возникновении серьезной ошибки)
AfxBeginThread Создает новый поток и начинает его исполнение
AfxEndThread Завершает текущий исполняемый поток
AfxMessageBox Выводит информационное окно Windows
AfxGetApp Возвращает указатель на объект-приложение
AfxGetAppName Возвращает имя приложения
AfxGetMainWnd Возвращает указатель на главное окно приложения
AfxGetInstanceHandle Возвращает дескриптор экземпляра EXE-файла приложения
AfxRegisterWndClass Регистрирует пользовательский оконный класс WNDCLASS для использования в приложении MFC

 

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; просмотров: 409; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.22.250 (0.011 с.)