Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИГС / IGS_2014-2015 / Lab_04 / glopen01 / glopen01

.cpp
Скачиваний:
5
Добавлен:
17.04.2018
Размер:
5.14 Кб
Скачать


#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);
}





Соседние файлы в папке glopen01
  • #
    17.04.20185.14 Кб5glopen01.cpp
  • #
    17.04.20184.06 Кб5glopen01.dsp
  • #
    17.04.2018539 б5glopen01.dsw
  • #
    17.04.201841.98 Кб5glopen01.ncb
  • #
    17.04.201848.64 Кб6glopen01.opt
  • #
    17.04.2018250 б6glopen01.plg