Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програмирование - Лекции.pdf
Скачиваний:
163
Добавлен:
03.06.2015
Размер:
687.59 Кб
Скачать

Лекция 14. API-функции. Использование системных методов.

(см. слайды П_1_14_API)

Windows API

Windows API — общее наименование целого набора базовых функций интерфейсов программирования приложений операционных систем семейств Microsoft Windows корпорации «Майкрософт» и совместимой с ними свободной бесплатной операционной системы ReactOS.

Windows API был изначально спроектирован для использования в программах, написанных на языке Си/C++. Работа через Windows API — это наиболее близкий к системе способ взаимодействия с ней из прикладных программ. Более низкий уровень доступа, необходимый только для драйверов устройств, в текущих версиях Windows предоставляется черезWindows Driver Model.

Примеры

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)

{

MessageBox(NULL, "Сказала собака баскервилей.", "Ну, здравствуй, Герасим.", MB_OK| MB_ICONEXCLAMATION);

return 0;

}

Начнем с параметров главной функции. Кстати, это САМАЯ главная функция. Функция WndProc (о которой позже) является главной оконной процедурой.

Итак, параметры… HINSTANCE вообще интересный тип. Это своего рода дескриптор объекта (HANDLE).

В первом случае (hInstance) он указывает на тот исполняемый модуль, на основе которого запущен процесс данного кода. Проще говоря, указывает на файл “NoWindow.exe”.

Второй параметр (hPrevInstance) – пережиток Win16. В 32-разрядных приложениях не используется. Раньше обозначал предыдущий запущенный экземпляр данного приложения.

Третий (lpszCmdParam) – строка параметров, которые были посланы программе при запуске. Если их не было, то строка пуста.

Четвертый (nCmdShow) – число, обозначающее вид окна при запуске. Например, свернутое, развернутое, нормальное.

За одно, разберем параметры вызова MessageBox.

Первый – дескриптор окна, к которому принадлежит сообщение. Это нужно для того, что бы Windows знала, какое окно его вызвало и, соответственно, сделать его неактивным, пока вы не ответите в нем нажатием какой-нибудь кнопки.

Второй и третий – строки. Соответственно, текста сообщения и текста заголовка сообщения.

Четвертый – самый интересный. В нем указывается стиль сообщения. Они находятся в файле <WinUser.h>

#include <windows.h> #include <windowsx.h>

#define SimWnd_DefProc DefWindowProc

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)

;

BOOL Register(HINSTANCE hInstance);

HWND Create(HINSTANCE hInstance, int nCmdShow); static char szAppName[] = "SimWnd";

static HWND hMainWindow;

void SimWnd_OnDestroy(HWND hwnd);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpszCmdParam, int nCmdShow)

{

MSG Msg;

if (!Register(hInstance)) return FALSE;

if (!Create(hInstance, nCmdShow)) return FALSE;

while (GetMessage(&Msg, NULL, 0, 0))

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

return Msg.wParam;

}

BOOL Register(HINSTANCE hInstance)

{

WNDCLASS WndClass;

WndClass.style

=

CS_HREDRAW | CS_VREDRAW;

WndClass.lpfnWndProc

=

WndProc;

WndClass.cbClsExtra

=

0;

WndClass.cbWndExtra

=

0;

WndClass.hInstance

=

hInstance;

WndClass.hIcon

=

LoadIcon(NULL, IDI_APPLICATION);

WndClass.hCursor

=

LoadCursor(NULL, IDC_ARROW);

WndClass.hbrBackground

=

(HBRUSH)(COLOR_BTNFACE+1);

WndClass.lpszMenuName

=

NULL;

WndClass.lpszClassName

=

szAppName;

return (RegisterClass(&WndClass) != 0);

}

HWND Create(HINSTANCE hInstance, int nCmdShow)

{

HWND hwnd = CreateWindow(szAppName, szAppName, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInstance, NULL); if (hwnd == NULL)

return FALSE; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);

return hwnd;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message,

WPARAM wParam, LPARAM lParam)

{

switch (Message)

{

HANDLE_MSG(hwnd, WM_DESTROY, SimWnd_OnDestroy); default:

return SimWnd_DefProc(hwnd, Message, wParam, lParam);

}

}

void SimWnd_OnDestroy(HWND hwnd)

{

PostQuitMessage(0);

}

Три шага создания окна:

1)Регистрация. (Register())

2)Создание. (Create())

3)Обработка сообщений. (WndProc())

Когда мы создаем оконное приложение, мы как бы делаем подкласс объекта «окно» благодаря этим трем шагам. При создании кнопки (класс “button”) , регистрацию и обработку сообщений выполняет система, а создание – программист. Программист также может создать свой класс кнопки и сделать ей любые свойства такие, как подсветка или градиент.

При регистрации, мы сообщаем системе, в основном, название нового класса и процедуру обработки его сообщений, ну и некоторые элементы внешнего вида и другие параметры.

Создание окна – тут все просто. Вызов функции CreateWindow(). А при создании нового окна, после этой вызываются ShowWindow() и UpdateWindow(). Они призваны соответственно показать и обновить окно.

Самое сложное и обычно наиболее емкое по коды – это обработка сообщений. Есть такая штука – DefWindowProc – стандартная оконная процедура. Все наше окно полностью работает за счет этой процедуры.

Сообщения.

Все функционирование в Windows основано на сообщениях. Даже то, что вы передвигаете мышь. Точнее её перерисовка. А как их получает оконная процедура? Все начинается тут:

while (GetMessage(&Msg, NULL, 0, 0))

{

TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

А продолжается тут:

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message,

WPARAM wParam, LPARAM lParam)

{

switch (Message)

{

HANDLE_MSG(hwnd, WM_DESTROY, SimWnd_OnDestroy); default:

return SimWnd_DefProc(hwnd, Message, wParam, lParam);

}

}

Функция GetMessage получает сообщение от системы и пересылает его оконной процедуре. Там программист обрабатывает его так, как хочет. Если он этого не делает или ему этого не нужно, то оно обрабатывается стандартной процедурой. Сообщений очень много и приводить их здесь нецелесообразно – займет пару страниц. Скажу только то, что когда я не знал, как называется сообщение, то открывал файл <WinUser.h> искал WM_NULL и смотрел далее сообщения, а по названию определял назначение, далее по справке и, в конце-концов, можно найти.

Рассмотрим параметры в функции WndProc:

1)Дескриптор окна, к которому относится сообщение.

2)Само сообщение.

3)Параметр сообщения.

4) Параметр сообщения.

Использование системных методов

Операционная система windows является объектно-ориентированной. Все элементы управления (объекты) являются окнами в том или ином виде. Каждый такой элемент имеет свои параметры состояния, входные и выходные сообщения. Традиционно при написании программ с использованием чистого winapi применяются методы структурного и объектноориентированного программирования.