Цель настоящего занатия:
¨ Показать традиционную структуру Windows-приложения, созданного на основе функций API;
¨ Продемонстрировать некоторые функции API, использующие графические объекты подсистемы GDI (Graphic Driver Interface) для вывода простых изображений в контекст устройства.
Создайте новый проект типа 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, то система будет знать что делать
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.