Мегаобучалка Главная | О нас | Обратная связь


Приложение с единственным окном



2015-11-09 677 Обсуждений (0)
Приложение с единственным окном 0.00 из 5.00 0 оценок




Приложение first не имело главного окна. Для вывода сообщения на экран использовалась функция AfxMessageBox, которая очень похожа на функцию MessageBox программного интерфейса Windows.

Рассмотрим другое приложение start, оно несколько сложнее предыдущего. При запуске оно отображает на экране компьютера обычное окно, имеющее заголовок, системное меню и кнопки управления.

Точно так же, как и в приложении first, во втором приложении используется класс CWinApp в качестве главного класса приложения. Для управления окном приложения создается еще один класс, наследуемый от базового класса CFrameWnd, входящего в библиотеку MFC.

Приведем исходные тексты файлов:

Файл start.h

#include <afxwin.h>

// Класс CStartApp - главный класс приложения.

// Наследуется от базового класса CWinApp.

class CStartApp: public CWinApp

{

public:

// Переопределение метода InitInstance,

// предназначенного для инициализации приложения.

virtual BOOL InitInstance();

};

// Класс CMainWindow - представляет главное окно приложения.

// Наследуется от базового класса CFrameWnd.

class CMainWindow : public CFrameWnd

{

public:

// Конструктор класса

CMainWindow();

};

Файл start.cpp

#include <afxwin.h>

#include "start.h"

// Метод InitInstance

// Переопределение виртуального метода InitInstance класса CWinApp.

// Он вызывается каждый раз при запуске приложения.

BOOL CStartApp::InitInstance()

{

// Создание объекта класса CMainWindow

m_pMainWnd= new CMainWindow();

// Отображение окна на экране.

// Параметр m_nCmdShow определяет режим,

// в котором оно будет отображаться.

m_pMainWnd->ShowWindow(m_nCmdShow);

// Обновление содержимого окна.

m_pMainWnd->UpdateWindow();

return TRUE;

}

// Конструктор класса CMainWindow

CMainWindow::CMainWindow()

{

// Создание окна приложения

Create(NULL,"Hello");

}

// Создание объекта приложения класса CStartApp.

CStartApp theApp;

Приложение start очень простое - оно состоит из одного главного окна и не содержит ни меню, ни каких-либо других органов управления. И тем не менее главное окно приложения обладает всеми возможностями Windows-окон. Оно имеет заголовок, системное меню и кнопки управления. Можно изменить размер этого окна, увеличить его на весь экран и уменьшить до размера пиктограммы.

Так же как и в приложении first, необходимо включить в исходные тексты приложения start включаемый файл afxwin.h. Это файл включается в исходные тексты всех приложений, использующих библиотеку классов MFC.

В файле start.h определяется главный класс CStartApp приложения, который наследуется от базового класса CWinApp. При этом базовый класс указан как public. Можно вызывать методы класса CWinApp для объектов класса CStartApp и обращаться к элементам данных класса CWinApp.

В определении класса CStartApp объявлен виртуальный метод InitInstance. Он переопределяется в файле start.cpp. После объявления главного класса приложения и переопределения функции InitInstance в файле start.cpp создается объект theApp этого класса.

Второй класс, класс CMainWindow, определенный в приложении start, наследуется от базового класса CFrameWnd как public и представляет главное окно приложения. В классе главного окна определяется только конструктор.

Метод InitInstance главного класса приложения CStartApp служит для инициализации. Он вызывается автоматически каждый раз, когда запускается очередная копия приложения.

В данном приложении метод InitInstance используется для отображения на экране окна приложения. Для этого создается объект класса CMainWindow и записывается указатель на этот объект в элемент данных m_pMainWnd класса CWinThread (этот класс является базовым для класса CWinApp). Таким образом, объект приложения и объект окна приложения связываются вместе.

Для создания объекта класса CMainWindow используется оператор new. Он создает объект указанного класса, отводит память и возвращает указатель на него. При создании нового объекта оператором new для автоматически вызывается конструктор, описанный ниже.

Само окно появится на экране только после того, как будет вызван метод ShowWindow. В качестве параметра методу ShowWindow передается значение m_nCmdShow. Переменная m_nCmdShow является элементом класса CWinApp. Его назначение соответствует параметру nCmdShow функции WinMain, то есть определяет, как должно отображаться главное окно приложения сразу после его запуска.

После появления окна на экране ему передается сообщение WM_PAINT при помощи вызова метода UpdateWindow. По этому сообщению приложение должно обновить содержимое окна.

В конце метода InitInstance вызывается оператор return и возвращается значение TRUE, означающее, что инициализация приложения завершилась успешно и можно приступать к обработке очереди сообщений.

Если метод InitInstance вернет значение FALSE, приложение немедленно завершится. Эта возможность использовалась в приложении first.

Для создания окна приложения start создается объект класса CMainWindow. Такой объект - это не окно, которое пользователь видит на экране компьютера. Этот объект является внутренним представлением окна. Для создания окна предназначается метод Create, определенный в классе CFrameWnd. Он создает окно и связывает его с объектом C++, в случае приложения start - с объектом класса CMainWindow. Метод Create вызывается в конструкторе класса CMainWindow.

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

Работа операционной системы Windows основана на обработке сообщений. Когда пользователь работает с устройствами ввода/вывода (например, клавиатурой или мышью), создаются сообщения, описывающие его действия.

Сообщения сначала попадают в системную очередь сообщений операционной системы. Из нее сообщения передаются приложениям, которым они предназначены, и записываются в очередь приложений. Каждое приложение имеет собственную очередь сообщений (на самом деле существуют очереди для отдельных потоков приложения).

Приложение в цикле, который называется циклом обработки сообщений, получает сообщения из очереди приложения и направляет их соответствующей функции окна, которая и выполняет обработку сообщения. Цикл обработки сообщений в Windows API обычно состоял из оператора while, в котором циклически вызывались функции GetMessage и DispatchMessage:

MSG msg;

while(GetMessage(&msg,0,0,0))

{

DispatchMessage(&msg);

}

Для более сложных приложений цикл обработки сообщений содержал вызовы других функций (TranslateMessage, TranslateAccelerator). Они обеспечивали предварительную обработку сообщений.

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

Функция обработки сообщения проверяет, какое именно сообщение поступило для обработки, и выполняет соответствующие действия. Пример типичной функции окна:

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg,

WPARAM wParam, LPARAM lParam)

{

HDC hDC;

PAINTSTRUCT ps;

RECT rect;

switch(message)

{

case WM_PAINT:

hDC=BeginPaint(hWnd,&ps);

GetClientRect(hWnd,&rect);

DrawText(hDC,"Text string",-1,&rect,DT_SINGLELINE|DT_CENTER);

EndPaint(hWnd,&ps);

break;

case WM_DESTROY:

PostQuiMessage(0);

break;

default:

return DefWindowProc(hWnd,message,wParam,lParam);

}

return TRUE;

}

Если при создании приложения используется библиотека классов MFC, то за обработку сообщений отвечают классы. Любой класс, наследованный от базового класса CCmdTarget, может обрабатывать сообщения. Чтобы класс смог обрабатывать сообщения, необходимо, чтобы он имел таблицу сообщений класса. В этой таблице для каждого сообщения указан метод класса, предназначенный для его обработки.

Группы сообщений

Сообщения, которые могут обрабатываться приложением, построенным с использованием библиотеки классов MFC, делятся на 3 группы.

Оконные сообщения.

Эта группа включает сообщения, предназначенные для обработки функцией окна. Практически все сообщения, идентификаторы которых начинаются префиксом WM_, за исключением WM_COMMAND,. относятся к этой группе.

Оконные сообщения предназначаются для обработки объектами, представляющими окна. Это могут быть практически любые объекты класса CWnd или классов, наследованных от него (CFrameWnd, CMDIFrameWnd, CMDIChildWnd, CView, CDialog). Характерной чертой этих классов является то, что они включают идентификатор окна.

Большинство этих сообщений имеют параметры, детально характеризующие сообщение.



2015-11-09 677 Обсуждений (0)
Приложение с единственным окном 0.00 из 5.00 0 оценок









Обсуждение в статье: Приложение с единственным окном

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (677)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)