Традиционная структура Windows-приложения, созданного на основе функций API

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

18 страниц (Word-файл)

Фрагмент текста работы

Традиционное Windows-приложение

Цель настоящего занатия:

¨  Показать традиционную структуру Windows-приложения, созданного на основе функций API;

¨  Продемонстрировать некоторые функции API, использующие графические объекты подсистемы GDI (Graphic Driver Interface) для вывода простых изображений в контекст устройства.

Проект Win32 Application

Создайте новый проект типа Win32 Application. Для этого:

¨  В меню File4New выберите команду Project., в диалоге New Project, (окно Project Types) раскройте узел дерева под именем Visual C++ Projects, а в окне Templates выберите тип проекта Win 32 Project.

¨  В поле Name задайте имя проекта API, а в поле Location задайте или оставьте без изменения файловый путь для новой папки с файлами решения.

¨  Нажмите OK, и в появившемся окне мастера Win32 Application Wizard раскройте страницу Application Settings. Установите флажок Empty Project, просмотрите предлагаемые по умолчанию настройки проекта и нажмите кнопку Finish.

¨  Добавьте к проекту новый файл API.cpp и введите в него коды стартовой заготовки.

#include <windows.h>   // Файл заголовков для Windows приложений

//======== Оконная процедура

LRESULT WINAPI WndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch(msg)         // Переход по сообщению

{

case WM_DESTROY:

  PostQuitMessage(0);  // Сообщаем системе, что поток (thread) требует закрытия

  break;

default:        // Процедура по умолчанию

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

}

return 0L;

}

//======== Главная функция. С нее начинается выполнение Windows приложения

int WINAPI WinMain (HINSTANCE hInst, HINSTANCE, LPSTR, int nCmdShow)

{

WNDCLASS w;             // Структура атрибутов класса обслуживания

ZeroMemory(&w,sizeof(w)); // Обнуляем все поля структуры:

w.lpszClassName = "My Class"; // Имя класса окна

w.hInstance = hInst;        // Описатель экземпляра приложения

w.lpfnWndProc = WndProc; // Указатель на оконную процедуру

w.style  = CS_HREDRAW | CS_VREDRAW; // Набор битов, описывающих стиль класса

if (!RegisterClass (&w))  // Попытка зарегистрировать класс обслуживания

  return FALSE;        // Уход в случае неудачи

HWND hWnd = CreateWindow(w.lpszClassName, "Min Window",

  WS_VISIBLE | WS_OVERLAPPEDWINDOW,0,0,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInst,0);

MSG msg;            // Структура, содержащая описание сообщений

while (GetMessage(&msg, 0, 0, 0))    // Цикл ожидания сообщений

{

  TranslateMessage(&msg);  // Трансляция сообщения (виртуальные коды в символы)

  DispatchMessage(&msg); // Поиск обработчика (оконной процедуры)

}

return int(msg.wParam);      // Дополнительная информация о сообщении

}

Запустите стартовую заготовку (Ctrl+F5) и убедитесь, что она создает окно довольно странного вида. Возьмите наше дефективное окно за заголовок и "встряхните" его, резко перемещая вверх-вниз и влево-вправо. Наблюдайте за трансформацией клиентской области окна. Попробуем разобраться в том, что происходит.

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

¨  Мы оформляем заказ на класс окна (читай: обслуживания, см. WNDCLASS), указывая необходимые атрибуты приложения (lpfnWndProc — адрес процедуры, которая должна обрабатывать события, hInst — адрес нашего модуля в виртуальном пространстве процесса, style — набор битов стиля класса окна).

¨  Просим зарегистрировать сформированный нами класс окна.

¨  Если регистрация прошла, то создаем окно (см. вызов CreateWindow, указывая его атрибуты.

Странный вид окна (цвет фона, курсор) объясняется тем, что в заготовке при оформлении заказа на класс обслуживания (WNDCLASS) преследовалась цель — создать окно с минимумом усилий. Поэтому мы не указали нескольких важных атрибутов класса обслуживания:

¨  Цвет клиентской области окна, точнее, кисть для ее закрашивания.

¨  Вид курсора, который система должна использовать при попадании в него мышиного фокуса.

¨  Вид иконки, сопутствующей нашему приложению.

Цвет фона определяется одним из полей структуры WNDCLASS. Если вы заполните поле hbrBackground описателем кисти Windows, то система будет знать что делать

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

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