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

Создание окна

На вашем месте у меня возникло бы желание увидеть те самые пресловутые окна, из-за которых столько шума. Окно в Windows создается функцией CreateWindow. Вот ее прототип:

HWND CreateWindow(LPCTSTR lpClassName,

LPCTSTR lpWindowName,

DWORD wStyle,

int x,

int y,

int nWidth,

int nHeight,

HWND hWndParent,

HMENU hMenu,

HINSTANCE hInstance,

LPVOID lpParam);

Как видите, у функции множество параметров:

  • LPCTSTR lpClassName – имя класса для создаваемого окна (это имя использовалось при регистрации класса).

  • LPCTSTR lpWindowName – имя окна.

  • DWORD dwStyle – стиль окна.

  • int x – позиция по горизонтали верхнего левого угла окна.

  • int y – позиция по вертикали.

  • int nWidth – ширина окна.

  • int nHeight – высота окна.

  • HWND hWndParent – используется для создания «дочернего окна» («child window»). Сюда передается описатель «родительского окна» («parent window»).

  • HMENU hMenu – описатель меню (если hMenu равно нулю, используется меню класса, указанного в lpClassName).

  • HINSTANCE hInstance – экземпляр приложения.

  • LPVOID lpParam – указатель на пользовательский параметр окна. Этот указатель со всеми остальными параметрами функции CreateWindow будет занесен в структуру CREATESTRUCT. В сообщениях WM_CREATE или WM_NCCREATE параметр lParam будет содержать указатель на эту структуру.

Функция CreateWindow возвращает уникальный описатель окна HWND. Если функция вернула ноль, значит, во время создания окна произошла ошибка. Какая именно, можно узнать, вызвав функцию GetLastError.

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

Назначением функции WndProc является обработка сообщений, получаемых приложением. Обработка таких сообщений обычно реализуется путем использования функции Switch.

Для начала реализуем обработку сообщения WM_PAINT. Приложение получает это сообщение, когда возникает необходимость в обновлении какой-либо области окна приложения. При создании окна данное сообщение передается для указания на необходимость обновления всего окна.

При обработке сообщения WM_PAINT сперва необходимо вызвать функцию BeginPaint, а в завершение следует вызвать функциюEndPaint. Между вызовами этих двух функций обрабатывается логика по отображению текста, кнопок и других элементов управления в окне. Данное приложение отображает в окне строку "Hello, World!". Для отображения текста следует использовать функциюTextOut.

Обычно приложение обрабатывает множество других сообщений, таких как WM_CREATE и WM_DESTROY. Ниже приведен код простой, но полноценной функции WndProc:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc;

TCHAR greeting[] = _T("Hello, World!");

switch (message)

{

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

TextOut(hdc,

5, 5,

greeting, _tcslen(greeting));

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

break;

}

return 0;

}

Итак, сейчас упрощенно, что же произойдет, если щелкнуть по окну левой кнопкой мыши.

  1. Пользователь нажимает левую кнопку мыши в то время когда курсор мыши находится над рабочей областью окна.

  2. Windows помещает сообщение WM_LBUTTONDOWN в очередь потока.

  3. Цикл обработки сообщения должен вынуть сообщение с помощью функции GetMessage и передать его на обработку функции DispatchMessage.

  4. Функция DispatchMessage находит окно, которому предназначено сообщение и помещает сообщение в его очередь.

  5. Функция окна обрабатывает сообщение WM_LBUTTONDOWN и возвращает результат.

  6. Тело цикла заканчивается, и управление снова передается функции GetMessage для ожидания новых сообщений.

Пример рабочего кода для вышеописанного алгоритма можно посмотреть в приложении 1.