Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Labs 2004 / LABOR1 / LABOR_1.DOC
Скачиваний:
36
Добавлен:
16.04.2013
Размер:
391 Кб
Скачать

Программирование графики в Windows.

Программирование графики в Windows имеет свои особенности. Во-первых, в составе Windows имеются графические функции, которые любая программа может использовать для создания изображений. Поэтому компиляторы, создающие программы под Windows, обычно не имеют собственных графических библиотек, а используют функции, которые им предоставляет система Windows.

Операционная система Windows имеет набор библиотечных функций для разработки приложений. Эти функции обеспечивают широкую поддержку программирования приложений Windows и в совокупности называются интерфейс API (Application Program Interface –интерфейс прикладного программирова­ния). Графические функции из состава API Windows объединены в отдельную группу – подсистему GDI (Graphic Device Interface – интерфейс графических устройств). В литературе эти функции называют – графические функции API Windows или функции GDI Windows.

Во-вторых, работающая программа взаимодействует с операционной системой Windows с помощью механизма передачи сообщений. Все свои действия программа производит в ответ на последовательность сообщений. Все время пока программа работает, Windows посылает ей сообщения. Сообщение возникает, если что-то происходит в системе, например нажатие клавиши, движение мыши и т.д. Эти сообщения помещаются в очередь. Очередь может хранить несколько сообщений. Программа обращается к очереди и извлекает первое из сообщений. Затем программа или обрабатывает это сообщение или переходит к следующему сообщению. Рассмотрим некоторые из этих сообщений.

  1. Сообщение WM_PAINT отправляется, если существует необходимость нарисовать или перерисовать окно программы.

  2. Сообщение WM_COMMAND отправляется, если пользователь выбирает команду меню.

  3. Сообщение 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 регистрации класса окна заполняются следующим образом

  1. style - стиль окна. В нашем случае окно перерисовывается, при изменении горизонтальных или вертикальных размеров окна

  2. lpfnWndProc - имя оконной процедуры

  3. cbClsExtra - дополнительные данные об окне

  4. cbWndExtra - дополнительные данные об окне

  5. hInstance - дескриптор(номер) приложения

  6. hIcon – пиктограмма окна (иконка)

  7. hCursor – форма курсора, в нашем случае это стрелка

  8. hbrBackground – цвет окна

  9. lpszMenuName - имя меню окна

  10. lpszClassName - имя класса окна

Рассмотрим функцию создания окна.

Функция CreateWindow определяет свойства конкретного окна.

У этой функции 11 параметров

  1. имя класса окна

  2. заголовок окна

  3. вид окна.

  4. x – координата окна

  5. y – координата окна

  6. ширина окна

  7. высота окна

  8. дескриптор предка окна

  9. дескриптор меню дочернего окна

  10. дескриптор экземпляра предложения

  11. адрес оконных данных

Теперь необходимо компилировать и компоновать программу OnlyWin.

Установки компилятора BC++ 3.1 под Windows .

Компилятор BC++ 3.1 позволяет создавать 16 - битные Windows приложения. Для задач нашего курса этого вполне достаточно. Если же возникнет необходимость в 32 – битных Windows приложениях, то их можно создать, используя BC++ 5.02 или MS Visual C++ .

Откройте основное меню IDE . Выберете пункт меню Options , и пройдитесь по цепочке: OptionsCompiler - Code generation и поставьте точку перед Model Large . Затем пройдитесь по другой цепочке: OptionsCompiler - Entry/Exit Code и поставьте точку перед Windows all functions exportable . Следующая цепочка это OptionsLinkerSettings где надо поставить точку перед Windows EXE . В этом случае подключать графическую библиотеку Borland C не имеет смысла, так как Windows программы используют графические функции системы Windows. Поэтому, создав Windows программу в IDE BC++ 3.1 и проведя отладку (компиляция и компоновка), надо выйти из этой среды и запускать EXE файл из Windows среды. Сохраните установки компилятора следующей цепочкой OptionsSave.

Компиляция WIN32 –программ с помощью VISUAL C++ 6.0

Пусть код программы находится в файле OnlyWin.cpp в каталоге PROG .

Запустим VISUAL C++ и в главном меню в пункте File пройдем по цепочке: FileNewProject , где выбираем пункт 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

Соседние файлы в папке LABOR1