Каждому разработчику необходимо иметь представление о структуре и принципах функционирования традиционного Windows-приложения, созданного с помощью функций API (Application Programming Interface).
Все Windows-приложения являются программами, управляемыми событиями (event-driven applications). Последовательность обработки сообщений о событиях в системе определяется не программой, а самой системой. Все сообщения попадают в общую очередь. Некоторые из них система передает в очередь сообщений приложения. Приложение выполняет цикл ожидания сообщений. Как только придет сообщение, адресованное приложению, оно будет передано оконной процедуре. Все сообщения Windows имеют стандартные имена, многие из которых начинаются с префикса WM_ (Windows Message). Например, WM_PAINT именует сообщение о том, что необходимо перерисовать содержимое окна того приложения, которое получило это сообщение. Идентификатор сообщения WM_PAINT — это символьная константа, обозначающая некое число.
Эта модель выработки и прохождения сообщений объясняет структуру, принятую для всех Windows-приложений. Простейшее приложение состоит как минимум из двух функций:
¨ Функция WinMain (имя резервировано), которая содержит цикл выборки сообщений и выполняется первой в любом приложении;
¨ Оконная процедура, которую вызывает система, направляя ей соответствующие сообщения.
Имя оконной процедуры выбирается произвольно. Система Windows регистрирует это имя, связывая его с вашим приложением.
Создайте новый проект типа Win32 Application. Для этого:
1. Выберите команду File | New | Project.
2. Выберите тип проекта: Win32 Application, имя проекта: API, а также удобное для вас местоположение папки с проектом.
3. Согласитесь с выбором An empty project.
4. Выберите команду File | New. В появившемся диалоговом окне выберите страницу File.
5. Выберите тип файла: C++ Source File, имя файла: API. Не забудьте установить флажок: Add to project.
6. Создайте функцию WinMain и оконную процедуру, тексты которых приведены ниже.
Главной целью функцииWinMainявляется регистрация оконного класса, создание окна и запуск цикла ожидания сообщений. Несмотря на обилие кода, она выполняет только эти три действия.
#include <windows.h> // Файл заголовков для Windows приложений
#include "resource.h"
LRESULT APIENTRY WndProc (HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)
{
char *sReg = "Строка регистрации";
MSG msg; // Структура, содержащая описание сообщений
WNDCLASS w; // Структура атрибутов класса окна
ZeroMemory(&w, sizeof(w));
w.lpszClassName = sReg; // Имя класса окна
w.hInstance = hInst; // Описатель экземпляра приложения
w.lpfnWndProc = WndProc; // Указатель на оконную процедуру
if (!RegisterClass (&w)) // Попытка зарегистрировать оконный класс
return FALSE; // Уход в случае неудач
// Создаем окно и запоминаем его описатель
HWND hWnd = CreateWindow(sReg,"My First Window",
WS_VISIBLE | WS_OVERLAPPEDWINDOW,
0,0,CW_USEDEFAULT,CW_USEDEFAULT,0,0, hInst,0);
while (GetMessage(&msg,0,0,0)) // Цикл ожидания сообщений
{
TranslateMessage(&msg); // Трансляция сообщения (виртуальные коды в символы)
DispatchMessage(&msg); // Пересылка оконной процедуре
}
return (msg.wParam);
}
// ======== Оконная процедура ========//
LRESULT APIENTRY WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
static DWORD size = MAX_COMPUTERNAME_LENGTH + 1;
static char *sName = new char [size];
HDC hdc;
PAINTSTRUCT ps;
char buf[128];
switch(msg) // Переход по сообщению
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
GetComputerName(sName,&size);
strcat(strcpy(buf,"Computer Name: "), sName);
TextOut(hdc, 20, 20, buf, strlen(buf));
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default: // Процедура по умолчанию
return DefWindowProc(hWnd,msg,wParam,lParam);
}
return 0L;
}
После ввода текста программы запустите приложение (Ctrl+F5). Вы должны увидеть окно с заголовком "My First Window", со значком, данным нам по умолчанию и загруженным из исполняемого кода приложения (файла API.exe), с системным меню, присутствующим по умолчанию. Понятие класс окон появилось до того, как появились классы C++. Поэтому структура WNDCLASS не имеет ничего общего с классами MFC. Она является типом структур языка С. Каждое Windows-приложение должно зарегистрировать свои атрибуты, а регистрация опирается на поля структуры WNDCLASS. Она своими полями определяет некий шаблон или модель поведения для всех окон данного класса. В полях структуры вы указываете эти атрибуты: имя ресурса меню, набор битов для описания стиля окна, где взять изображения курсора и значка, адрес исполняемого модуля приложения, адрес оконной процедуры и т. д.
Эту «неинтересную» работу и выполняет большая часть кодов функции WinMain. Программируя с помощью библиотеки MFC, требуется значительно меньше усилий для создания окна, так как в этом случае используется один из пяти уже зарегистрированных классов окна. Пример проливает свет на то, что делают методы классов MFC, избавляя нас от рутинной работы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.