
- •Министерство образования и науки российской федерации
- •Введение
- •1.WindowsApi. Определение и задачи.
- •2. Интерфейс программирования приложенийWin32
- •2.1 Расширение функциональности WinMain.
- •2.2 Класс окна
- •2.3 Создание окна
- •2.4 Расширение функциональности WndProc
- •3. С чего начать? Переход от Win32 к Win64
- •3.1 Операционная система x64
- •4.1 Как сделать код совместимым с Win64
- •4.2 Отладка
- •Заключение
- •5. Приложения
- •5.1 Приложение 1.
- •5.2 Приложение 2.
- •Литература
2.4 Расширение функциональности 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;
}
Итак, сейчас упрощенно, что же произойдет, если щелкнуть по окну левой кнопкой мыши.
Пользователь нажимает левую кнопку мыши в то время когда курсор мыши находится над рабочей областью окна.
Windows помещает сообщение WM_LBUTTONDOWN в очередь потока.
Цикл обработки сообщения должен вынуть сообщение с помощью функции GetMessage и передать его на обработку функции DispatchMessage.
Функция DispatchMessage находит окно, которому предназначено сообщение и помещает сообщение в его очередь.
Функция окна обрабатывает сообщение WM_LBUTTONDOWN и возвращает результат.
Тело цикла заканчивается, и управление снова передается функции GetMessage для ожидания новых сообщений.
Пример рабочего кода для вышеописанного алгоритма можно посмотреть в приложении 1.
3. С чего начать? Переход от Win32 к Win64
Приятная особенность Win64 и процессорной архитектуры x64 заключается в том, что они достаточно сильно отличаются от своих предшественников - как раз настолько, чтобы вызывать интерес, в то же время не требуя основательного переобучения. Хотя мы, предпочитаем считать, будто при переходе на платформу x64 удастся отделаться простой перекомпиляцией своих программ, реальность такова, что нам все равно придется долго возиться с ними в отладчике. И здесь хорошее понимание новой программно-аппаратной платформы будет важным подспорьем.
Системы x64 хороши еще и тем, что они - в отличие от систем на основе процессоров Itanium - позволяют использовать либо Win32, либо Win64 на одном компьютере без серьезных потерь в производительности. И несмотря на некоторые, весьма туманные различия между реализациями x64 от Intel и AMD x64-совместимая версия Windows должна работать с любой из них. Вам не понадобятся отдельные сборки Windows для x64-процессоров AMD и Intel.