Kod:
#define WIN32_LEAN_AND_MEAN
/////////////////////
//Pliki nazgłówkowe//
/////////////////////
#include<windows.h>
#include<gl/gl.h>
#include<gl/glu.h>
#include<gl/glaux.h>
////////////////////
//Zmienne globalne//
////////////////////
bool fullScreen = true; //aplikacja rozpocznie sie w trybie pelnoekranowym
float angle=0.0f;
HDC g_HDC; //kontekst urządzenia
///////////////////////////////////////////////////////////////
//funkcja okreslająca format pikseli dla kontekstu urządzenia//
///////////////////////////////////////////////////////////////
void SetupPixelFormat(HDC hDC)
{
int nPixelFormat;
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), //rozmiar struktury
1, //domyslna wersja
PFD_DRAW_TO_WINDOW| //grafika w oknie
PFD_SUPPORT_OPENGL| //grafika w Opengl
PFD_DOUBLEBUFFER, //podwójne buforowanie
PFD_TYPE_RGBA, //tryb kolorów RGBA
32, //32-bitowy opsi kolorów
0, 0, 0, 0, 0, 0, //nie specyfikuje bitów kolorów
0, //bez bufora alfa
0, //ignoruje bit przesuniecia
0, //bez bufora akumulacji
0, 0, 0, 0, //ignoruje bity akumulacji
16, //16-bitowy bufor Z
0, //bez bufora powielania
0, //bez buforów pomocniczych
PFD_MAIN_PLANE, //główna płaszczyzna rysowania
0, //zarezerwowane
0, 0, 0,}; //ignoruje maski warstw
//wybiera najodpowiedniejszy format pixeli
nPixelFormat = ChoosePixelFormat(hDC, &pfd);
//okresla format pixeli dla kontekstu urządzenia
SetPixelFormat(hDC, nPixelFormat, &pfd);
}
//////////////////////
//procedura okinkowa//
//////////////////////
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC; //kontekst tworzenia grafiki
static HDC hDC; //kontekst urzadzenia
int width, height; //szerokosc i wysokos okna
switch(message)
{
case WM_CREATE: //okno jest tworzone
hDC = GetDC(hwnd); //pobiera kontekst urządzenia dla okna
g_HDC = hDC;
SetupPixelFormat(hDC); //wywołuje funkcję okreslająca format pixeli
//tworzy kontekst tworzenia grafiki i czyni go bieżącym
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
return 0;
break;
case WM_CLOSE: //okno jest zamykane
//dezaktywuje bieżący kontekst i usuwa go
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC);
//wstaiwa komunikat WM_QUIT do kolejki
PostQuitMessage(0);
return 0;
break;
case WM_SIZE:
height = HIWORD(lParam); //pobiera nową wysokosc i szerokos okna
width = LOWORD(lParam);
if (height==0){height =1;}
//nadaje nowe wymiary oknu OpenGl
glViewport(0, 0, width, height);
//okresla macierz rzutowania
glMatrixMode(GL_PROJECTION);
//resetuje macierz rzutowania
glLoadIdentity();
//wyznacza proporcje obrazu
gluPerspective(45,(GLfloat)width/(GLfloat)height,1,1000);
glMatrixMode(GL_MODELVIEW); //okresla macierz widoku modelu
glLoadIdentity();
return 0;
break;
default:
break;
}
return (DefWindowProc(hwnd, message, wParam, lParam));
}
///////////////////////////////////////////////////////
//punkt w którym rozpoczyna sie wykonwyanie aplikacji//
///////////////////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX windowClass; //klasa okien
HWND hwnd; //uchwyt okna
MSG msg; //komunikat
bool done; //znacznik zakonczenia aplikacji
//definicja klasy okna
windowClass.cbSize= sizeof(WNDCLASSEX);
windowClass.style= CS_HREDRAW | CS_VREDRAW;
windowClass.lpfnWndProc= WndProc;
windowClass.cbClsExtra= 0;
windowClass.cbWndExtra= 0;
windowClass.hInstance= hInstance;
windowClass.hIcon= LoadIcon(NULL, IDI_APPLICATION);//domyslna ikona
windowClass.hCursor= LoadCursor(NULL, IDC_ARROW); //domyslny kursor
windowClass.hbrBackground= NULL; //bez tła
windowClass.lpszMenuName= NULL; //bez menu
windowClass.lpszClassName= "Moja Klasa";
windowClass.hIconSm= LoadIcon(NULL, IDI_WINLOGO); //logo windows
//rejestruje klasę okna
if(!RegisterClassEx(&windowClass))
return 0;
//tworzy okno
hwnd = CreateWindowEx(NULL, //rozszerzony styl okna
"Moja Klasa", //nazwa klasy
"Aplikacja OpenGl", //nazwa aplikacji
WS_OVERLAPPEDWINDOW | WS_VISIBLE |
WS_SYSMENU | WS_CLIPCHILDREN|
WS_CLIPSIBLINGS, //styl
100, 100, //współrzędne x,y
600, 600, //szerokosc i wysokosc
NULL, //uchwyt okna nadrzędnego
NULL, //uchwyt menu
hInstance, //instancja aplikacji
NULL); //bez dodatkowych parametrów
//sprawdza czy utworzenie okna nie powiodło się w przeciwnym razie hwnd ma wartosc NULL
if (!hwnd)
return 0;
ShowWindow(hwnd, SW_SHOW); //wyswietla okno
UpdateWindow(hwnd); //aktualizuje onko
done=false; //inicjuje zmienna warunku wykonania pętli
//petla przetwarzania komunikatów
while(!done)
{
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT) //otrzymano komunikat WM_QUIT?
{
done = true;
}
else
{
/////////////////////////////////////
//tworzy grafike/////////////////////
//zeruje bufor ekranu i bufor głębi//
/////////////////////////////////////
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity(); //resetuje macierz widoku modelu
angle = angle+1.1f;
if (angle >=360)
angle =0.0f;
glTranslatef(0,0,-5);
glRotatef(angle,0,0,1);
glColor3f(1,0,0);
glBegin(GL_TRIANGLES);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glVertex3f(1,1,0);
glEnd();
SwapBuffers(g_HDC); //przełącza bufory
TranslateMessage(&msg); //tłumaczy komunikat i wysyła go do systemu
DispatchMessage(&msg);
}
}
return msg.wParam;
}