Ресурсы в традиционном приложении Windows

Страницы работы

Содержание работы

Ресурсы в традиционном приложении Windows

Каждому разработчику необходимо иметь представление о структуре и принципах функционирования традиционного Windows-приложения, созданного с помощью функций API (Application Programming Interface).

Все Windows-приложения являются программами, управляемыми событиями (event-driven applications). Последовательность обработки сообщений о событиях в системе определяется не программой, а самой системой. Все сообщения попадают в общую очередь. Некоторые из них система передает в очередь сообщений приложения. Приложение выполняет цикл ожидания сообщений. Как только придет сообщение, адресованное приложению, оно будет передано оконной процедуре. Все сообщения Windows имеют стандартные имена, многие из которых начинаются с префикса WM_ (Windows Message). Например, WM_PAINT именует сообщение о том, что необходимо перерисовать содержимое окна того приложения, которое получило это сообщение. Идентификатор сообщения WM_PAINT — это символьная константа, обозначающая некое число.

Эта модель выработки и прохождения сообщений объясняет структуру, принятую для всех Windows-приложений. Простейшее приложение состоит как минимум из двух функций:

¨  Функция WinMain (имя резервировано), которая содержит цикл выборки сообщений и выполняется первой в любом приложении;

¨  Оконная процедура, которую вызывает система, направляя ей соответствующие сообщения.

Имя оконной процедуры выбирается произвольно. Система Windows регистрирует это имя, связывая его с вашим приложением.

Проект Win32 Application

Создайте новый проект типа 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, избавляя нас от рутинной работы.

Похожие материалы

Информация о работе