Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ИГС / IGS_2014-2015 / Lab_04 / glopen01 / glopen01
.cpp
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <gl\gl.h>
#include <gl\glu.h>
#include <stdio.h>
//имя класса главного окна программы
char const szClassName[] = "OpenGL";
//заголовок окна
char const szWindowTitle[] = "Korneev V. Graphics by OpenGL";
//прототипы функций
BOOL RegisterApp(HINSTANCE);
HWND CreateApp(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void DestroyOpenGL();
void DrawOpenGL(HWND);
//главная функция
int PASCAL WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)
{
MSG msg; //структура для работы с сообщениями
//регистрация класса главного окна программы
if(!RegisterApp(hInstance))
return FALSE;
//создание главного окна программы
if(!CreateApp(hInstance,nCmdShow))
return FALSE;
//цикл обработки сообщений
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
//регистрация класса главного окна программы
BOOL RegisterApp(HINSTANCE hInstance)
{
WNDCLASS wc; //структура для регистрации класса главного окна программы
wc.style = CS_HREDRAW | CS_VREDRAW; //стиль окна
wc.lpfnWndProc = WndProc; //имя оконной процедуры
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance; //дескриптор программы
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockBrush(LTGRAY_BRUSH);
wc.lpszMenuName = "GLMENU"; //имя меню главного окна программы
wc.lpszClassName = szClassName; //имя класса главного окна программы
return RegisterClass(&wc);
}
//создание главного окна программы
HWND CreateApp(HINSTANCE hInstance, int nCmdShow)
{
HWND hwnd; //дескриптор главного окна программы
hwnd = CreateWindow(szClassName, //имя класса окна
szWindowTitle, //заголовок окна
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN
| WS_CLIPSIBLINGS, //стиль окна
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_COMMAND: //сообщение для работы с меню
switch(wParam)
{
case 200:
InvalidateRect(hwnd,NULL,TRUE); //очищаем окно
break;
case 202:
DrawOpenGL(hwnd); //рисуем графические объекты
break;
case 201:
DestroyWindow(hwnd); //завершает работу окна
break;
}
break;
case WM_DESTROY:
DestroyOpenGL();
break;
default:
return DefWindowProc(hwnd,msg,wParam,lParam);
}
return 0L;
}
//завершение работы программы
void DestroyOpenGL()
{
PostQuitMessage(0); //окончание цикла сообщений
}
//рисуем графические объекты
void DrawOpenGL(HWND hwnd)
{
HDC hdc = GetDC(hwnd); //получаем контест окна
//рисуем прямоугольник используя GDI
Rectangle(hdc,100,200,500,250);
//П О Д К Л Ю Ч А Е М OpenGL
//структура описания формата пикселя
PIXELFORMATDESCRIPTOR pfd;
//зануляем все поля структуры pfd
memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
//заполняем некоторые поля структуры
pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 24;
//выбираем наиболее подходящий формат пикселей
int iPixelFormat = ChoosePixelFormat(hdc, &pfd);
//устанавливаем найденный формат пикселей в контектсте окна
SetPixelFormat(hdc, iPixelFormat, &pfd);
//получаем контекст отображения OpenGL
HGLRC hglrc = wglCreateContext(hdc);
//устанавливаем текущий контекст отображения OpenGL
wglMakeCurrent(hdc, hglrc);
//устанавливаем двухмерную ортогональную область просмотра
gluOrtho2D(-400, 400, -300, 300);
//устанавливаем текущий цвет
glColor3f(0.0, 1.0, 0.0);
//рисуем треугольник
glBegin(GL_TRIANGLES);
glVertex2f(-100, -100);
glVertex2f(0, 100);
glVertex2f(100, -100);
glEnd();
//устанавливаем текущий цвет
glColor3f(1.0, 0.0, 0.0);
//толщина линий - 6 пикселей
glLineWidth(6.0);
//рисуем связанную группу отрезков
glBegin(GL_LINE_STRIP);
glVertex2f(0, 150);
glVertex2f(150, -130);
glVertex2f(-150, -130);
glVertex2f(0, 150);
glEnd();
//ожидает завершения всех предыдущих команд OpenGL
glFinish();
//завершаем работу с текущим контекстом отображения
wglMakeCurrent(NULL, NULL);
//освобождаем контекст отображения OpenGL
wglDeleteContext(hglrc);
//OpenGL О Т К Л Ю Ч Е Н
//рисуем прямоугольник используя GDI
Rectangle(hdc,50,220,450,270);
//освобождаем контекст окна
ReleaseDC(hwnd,hdc);
}