Добавил:
nyan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:ИГС / IGS_2014-2015 / Lab_04 / glopen06 / glopen06
.cpp
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <gl\gl.h>
#include <gl\glu.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); //получаем контест окна
//структура описания формата пикселя
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);
// Т О Ч К И
//размер точки
glPointSize(10);
glBegin(GL_POINTS);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-300, 200);
glColor3f(1.0, 0.5, 0.0);
glVertex2f(-200, 200);
glColor3f(1.0f, 0.8f, 0.0f);
glVertex2f(-100, 200);
glEnd();
// О Т Р Е З К И
//текущий цвет
glColor3f(0, 0, 0);
//толщина линии
glLineWidth(2.0f);
glBegin(GL_LINES);
glVertex2f(-350, 0);
glVertex2f(350, 0);
glVertex2f(0, -250);
glVertex2f(0, 250);
glEnd();
// С В Я З А Н Н Ы Е О Т Р Е З К И
glLineWidth(4.0f);
glBegin(GL_LINE_STRIP);
glColor3f(0, 1, 0.25);
glVertex2f(-350, 50);
glColor3f(1, 0.25, 0.5);
glVertex2f(-300, 100);
glColor3f(1, 0.25, 0.75);
glVertex2f(-250, 50);
glColor3f(1, 0.25, 1);
glVertex2f(-200, 100);
glEnd();
// З А М К Н У Т А Я Л И Н И Я
glLineWidth(4.0f);
glBegin(GL_LINE_LOOP);
glColor3f(0, 1, 0.25);
glVertex2f(-200, 50);
glColor3f(1, 0.25, 0.5);
glVertex2f(-150, 100);
glColor3f(1, 0.25, 0.75);
glVertex2f(-100, 50);
glColor3f(1, 0.25, 1);
glVertex2f(-50, 100);
glEnd();
// Т Р Е У Г О Л Ь Н И К И
glBegin(GL_TRIANGLES);
glColor3f(0, 1, 0);
glVertex2f(10, 200);
glVertex2f(70, 200);
glVertex2f(40, 250);
glColor3f(0, 1, 0.75);
glVertex2f(80, 200);
glVertex2f(140, 200);
glVertex2f(110, 250);
glEnd();
// Ч Е Т Ы Р Е Х У Г О Л Ь Н И К
glColor3f(0, 0, 1);
glBegin(GL_QUADS);
glVertex2f(100, 150);
glVertex2f(200, 200);
glVertex2f(300, 150);
glVertex2f(200, 100);
glEnd();
// В Ы П У К Л Ы Й П О Л И Г О Н
glColor3f(0, 1, 1);
glBegin(GL_POLYGON);
glVertex2f(-300, -150);
glVertex2f(-200, -70);
glVertex2f(0, -70);
glVertex2f(200, -200);
glVertex2f(-100, -250);
glEnd();
//завершаем работу с текущим контекстом отображения
wglMakeCurrent(NULL, NULL);
//освобождаем контекст отображения OpenGL
wglDeleteContext(hglrc);
//освобождаем контекст окна
ReleaseDC(hwnd,hdc);
}