Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой (ОС).docx
Скачиваний:
13
Добавлен:
11.06.2015
Размер:
226.75 Кб
Скачать

2. Интерфейс программирования приложенийWin32

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

Как известно, любое приложение на языках C и C++ должно иметь функцию main. Эта функция является начальной точкой для приложения. Подобным же образом любое приложение Win32 должно иметь функцию WinMain. Синтаксис функции WinMain выглядит следующим образом:

int WINAPI WinMain

(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow);

  • HINSTANCE hInstance – дескриптор экземпляра приложения. Этот дескриптор содержит адрес начала кода программы в ее адресном пространстве. Дескриптор hInstance чаще всего требуется функциям, работающим с ресурсами программы.

  • HINSTANCE hPrevInstance – дескриптор предыдущего экземпляра приложения. Этот дескриптор остался от старых версий Windows - скорее всего, вам он никогда не пригодится.

  • LPSTR lpCmdLine – указатель на начало командной строки, введенной при запуске программы.

  • int nCmdShow – это значение содержит желаемый вид окна (например, свернутый или развернутый)

Значение, которое возвращается функцией WinMain (тип int) – код завершения программы. Принято, что если программа завершила свое выполнение без ошибок, возвращается 0.

Функция WinMain – первая функция, которая выполнятся в программе (ее еще называют «точка входа» или «entry point»). С нее все начинается, и ею (желательно) все должно закончиться.

Наряду с функцией WinMain, в каждом приложении Win32 также должна быть определена еще одна функция, обычно называемая WndProc и представляющая собой оконную процедуру. Синтаксис функции WndProc выглядит следующим образом:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

При вызове этой функции ей передаются следующие параметры:

  • HWND hWnd – описатель окна, от которого пришло сообщение.

  • UINT message – идентификатор сообщения.

  • WPARAM wParam и LPARAM lParam – параметры сообщения.

Назначением этой функции является обработка сообщений, получаемых приложением от операционной системы. В каком случае приложение получает сообщения от операционной системы? Оно получает их постоянно! Например, представим, что было создано диалоговое окно с кнопкой ОК. Когда пользователь нажимает кнопку, операционная система посылает приложению сообщение, оповещающее о нажатии кнопки. Функция WndProc отвечает за реагирование на это событие. В этом примере соответствующей реакцией на это событие может быть закрытие диалогового окна.

2.1 Расширение функциональности WinMain.

Для начала создайте внутри функции WinMain структуру класса окна типа WNDCLASSEX. Эта структура содержит информацию об окне, такую как используемые в приложении значки, цвет фона окна, отображаемое в заголовке окна название, имя функции процедуры окна и т.д. Типичная структураWNDCLASSEX выглядит следующим образом:

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = NULL;

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));

После того как класс окна будет создан, необходимо зарегистрировать его. Воспользуйтесь функцией RegisterClassEx, которой следует передать структуру класса окна в качестве аргумента:

if (!RegisterClassEx(&wcex))

{

MessageBox(NULL,

_T("Call to RegisterClassEx failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

После того как класс будет зарегистрирован, можно приступать к созданию окна. Используйте функцию CreateWindow, как показано ниже:

static TCHAR szWindowClass[] = _T("win32app");

static TCHAR szTitle[] = _T("Win32 Guided Tour Application");

// Параметры CreateWindow обозначают:

// szWindowClass: имя класса окна

// szTitle: текст, который будет отображаться в титуле

// WS_OVERLAPPEDWINDOW: тип создаваемого окна

// CW_USEDEFAULT, CW_USEDEFAULT: начальные позиции (x, y)

// 500, 100: размеры окна (width, length)

// NULL: предки окна

// NULL: это окно не будет иметь меню

// hInstance: первый параметр для WinMain

// NULL: не используется в этом приложении

HWND hWnd = CreateWindow(

szWindowClass,

szTitle,

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

500, 100,

NULL,

NULL,

hInstance,

NULL

);

if (!hWnd)

{

MessageBox(NULL,

_T("Call to CreateWindow failed!"),

_T("Win32 Guided Tour"),

NULL);

return 1;

}

Эта функция возвращает объект HWND, являющийся дескриптором окна.