Программирование графики в Windows.
Программирование графики в Windows имеет свои особенности. Во-первых, в составе Windows имеются графические функции, которые любая программа может использовать для создания изображений. Поэтому компиляторы, создающие программы под Windows, обычно не имеют собственных графических библиотек, а используют функции, которые им предоставляет система Windows.
Операционная система Windows имеет набор библиотечных функций для разработки приложений. Эти функции обеспечивают широкую поддержку программирования приложений Windows и в совокупности называются интерфейс API (Application Program Interface –интерфейс прикладного программирования). Графические функции из состава API Windows объединены в отдельную группу – подсистему GDI (Graphic Device Interface – интерфейс графических устройств). В литературе эти функции называют – графические функции API Windows или функции GDI Windows.
Во-вторых, работающая программа взаимодействует с операционной системой Windows с помощью механизма передачи сообщений. Все свои действия программа производит в ответ на последовательность сообщений. Все время пока программа работает, Windows посылает ей сообщения. Сообщение возникает, если что-то происходит в системе, например нажатие клавиши, движение мыши и т.д. Эти сообщения помещаются в очередь. Очередь может хранить несколько сообщений. Программа обращается к очереди и извлекает первое из сообщений. Затем программа или обрабатывает это сообщение или переходит к следующему сообщению. Рассмотрим некоторые из этих сообщений.
Сообщение WM_PAINT отправляется, если существует необходимость нарисовать или перерисовать окно программы.
Сообщение WM_COMMAND отправляется, если пользователь выбирает команду меню.
Сообщение WM_DESTROY отправляется перед тем, как окно уничтожается и программа прекращает работу.
В-третьих, программа работает в оконном режиме. При запуске программы создается окно, в котором выводятся результаты работы программы. Приведем код программы создающей рабочее окно. Пусть код находится в файле OnlyWin.cpp
#define STRICT
#include <windows.h>
#include <windowsx.h>
//имя класса окна
char const szClassName[] = "LineClass";
//заголовок окна
char const szWindowTitle[] = "Korneev V. Graphics to Windows";
//прототипы функций
BOOL RegisterApp(HINSTANCE hInst);
HWND CreateApp(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void Line_OnDestroy(HWND);
//Главная функция - точка входа в программу
#pragma argsused
int PASCAL WinMain(HINSTANCE hInst,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow) .
{
MSG msg; //структура для работы с сообщениями
if(!RegisterApp(hInst)) //регистрация приложения
return FALSE;
if(!CreateApp(hInst,nCmdShow)) //создание окна приложения
return FALSE;
while(GetMessage(&msg,NULL,0,0)) //цикл обработки сообщений
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//Регистрация класса окна
BOOL RegisterApp(HINSTANCE hInst)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockBrush(GRAY_BRUSH);
wc.lpszMenuName = "APP_MENU";
wc.lpszClassName = szClassName;
return RegisterClass(&wc);
}
//Создание окна приложения (рисование окна)
HWND CreateApp(HINSTANCE hInstance, int nCmdShow)
{
HWND hwnd; //идентификатор окна приложения
hwnd = CreateWindow(szClassName,
szWindowTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
if(hwnd = = NULL)
return hwnd;
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
return hwnd;
}
//оконная процедура, обрабатывающая сообщения
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
Line_OnDestroy(hwnd);
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0L;
}
//функция обрабатывающая сообщение WM_DESTROY
#pragma argsused
void Line_OnDestroy(HWND hwnd)
{
PostQuitMessage(0); //закрываем окно
}
Вот и все что нужно для создания рабочего окна в Windows. Отметим самое главное. Все Windows программы состоят из трех частей: регистрация приложения, создание окна приложения и цикла обработки сообщений приложением.
Рассмотрим функцию регистрации приложения.
Поля структуры WNDCLASS регистрации класса окна заполняются следующим образом
style - стиль окна. В нашем случае окно перерисовывается, при изменении горизонтальных или вертикальных размеров окна
lpfnWndProc - имя оконной процедуры
cbClsExtra - дополнительные данные об окне
cbWndExtra - дополнительные данные об окне
hInstance - дескриптор(номер) приложения
hIcon – пиктограмма окна (иконка)
hCursor – форма курсора, в нашем случае это стрелка
hbrBackground – цвет окна
lpszMenuName - имя меню окна
lpszClassName - имя класса окна
Рассмотрим функцию создания окна.
Функция CreateWindow определяет свойства конкретного окна.
У этой функции 11 параметров
имя класса окна
заголовок окна
вид окна.
x – координата окна
y – координата окна
ширина окна
высота окна
дескриптор предка окна
дескриптор меню дочернего окна
дескриптор экземпляра предложения
адрес оконных данных
Теперь необходимо компилировать и компоновать программу OnlyWin.
Установки компилятора BC++ 3.1 под Windows .
Компилятор BC++ 3.1 позволяет создавать 16 - битные Windows приложения. Для задач нашего курса этого вполне достаточно. Если же возникнет необходимость в 32 – битных Windows приложениях, то их можно создать, используя BC++ 5.02 или MS Visual C++ .
Откройте основное меню IDE . Выберете пункт меню Options , и пройдитесь по цепочке: Options – Compiler - Code generation и поставьте точку перед Model Large . Затем пройдитесь по другой цепочке: Options – Compiler - Entry/Exit Code и поставьте точку перед Windows all functions exportable . Следующая цепочка это Options – Linker – Settings где надо поставить точку перед Windows EXE . В этом случае подключать графическую библиотеку Borland C не имеет смысла, так как Windows программы используют графические функции системы Windows. Поэтому, создав Windows программу в IDE BC++ 3.1 и проведя отладку (компиляция и компоновка), надо выйти из этой среды и запускать EXE файл из Windows среды. Сохраните установки компилятора следующей цепочкой Options – Save.
Компиляция WIN32 –программ с помощью VISUAL C++ 6.0
Пусть код программы находится в файле OnlyWin.cpp в каталоге PROG .
Запустим VISUAL C++ и в главном меню в пункте File пройдем по цепочке: File – New – Project , где выбираем пункт Win32Application . В окне Location указываем путь ..\PROG , в окне Project name набираем OnlyWint . Нажимаем OK .
Далее выбираем An empty project , нажимаем Finish и нажимаем OK .
В главном меню слева появляется окно (Workspace) у которого внизу две надписи Class View и File View . Выбираем File View и вверху слева щелкаем по плюсу +. Подводим мышку к надписи Source files и щелкаем правой кнопкой. В появившемся маленьком меню выбираем пункт Add Files to Folder . Укажите путь к файлу OnlyWin.cpp , в нашем случае это ..\PROG\ OnlyWin.cpp . У пункта Source files появится плюс +. Щелкните по плюсу левой кнопкой. Откройте файл OnlyWin.cpp в главном меню (двойной щелчок левой кнопкой).
Теперь, чтобы компилировать код, в пункте Build выберете Compile OnlyWin.cpp . Если компиляция прошла успешно, то в пункте Build выберете Build OnlyWin.exe и создайте exe-файл OnlyWin.exe .
После компиляции и компоновки получаем исполняемый файл OnlyWin.exe . Запускаем программу. На Рис.5 приведен результат работы программы.
Рис.5
