#define WIN32_LEAN_AND_MEAN // "odchudza" aplikacjê Windows
/*******************************************************************
* Rozdzia³ 11, czcionka rastrowa
* Autor: Kevin Hawkins
* Wyœwietla tekst poœrodku okna za pomoc¹ czcionki rastrowej.
********************************************************************/
////// Pliki nag³ówkowe
#include <windows.h> // standardowy plik nag³ówkowy Windows
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gl/gl.h> // standardowy plik nag³ówkowy OpenGL
#include <gl/glu.h> // plik nag³ówkowy biblioteki GLU
#include <gl/glaux.h>
#include "font.h"
////// Zmienne globalne
HDC g_HDC; // globalny kontekst urz¹dzenia
bool fullScreen = false; // true = tryb pe³noekranowy;
//false = tryb okienkowy
bool keyPressed[256]; // tablica przyciœniêæ klawiszy
Font font;
float xe=100;
float ye=100;
// Initialize
// opis: inicjuje OpenGL
void Initialize()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // t³o w kolorze czarnym
glShadeModel(GL_SMOOTH); // cieniowanie g³adkie
glEnable(GL_DEPTH_TEST); // usuwanie przes³onietych powierzchni
font.Initialize(g_HDC);
font.SetResolutionData(1600,900);
}
// Render
// opis: rysuje scenê
void Render()
{
// opró¿nia bufory ekranu i g³êbi
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//glRasterPos3f(-0.99f, -0.55f, -0.1f);
//glRasterPos3f(0.99f, 0.5f, -0.1f);
//glRasterPos2i(1000,1);
/*if (keyPressed[VK_UP])
ye+=1;
if (keyPressed[VK_DOWN])
ye-=1;
if (keyPressed[VK_LEFT])
xe-=1;
if (keyPressed[VK_RIGHT])
xe+=1;*/
font.SetColor(0,1,0);
font.Text("test",800,450);
glFlush();
SwapBuffers(g_HDC); // prze³¹cza bufory
}
// funkcja okreœlaj¹ca format pikseli
void SetupPixelFormat(HDC hDC)
{
int nPixelFormat; // indeks formatu pikseli
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // rozmiar struktury
1, // domyœlna wersja
PFD_DRAW_TO_WINDOW | // grafika w oknie
PFD_SUPPORT_OPENGL | // grafika OpenGL
PFD_DOUBLEBUFFER, // podwójne buforowanie
PFD_TYPE_RGBA, // tryb kolorów RGBA
32, // 32-bitowy opis kolorów
0, 0, 0, 0, 0, 0, // nie specyfikuje bitów kolorów
0, // bez buforu alfa
0, // nie specyfikuje bitu przesuniêcia
0, // bez bufora akumulacji
0, 0, 0, 0, // ignoruje bity akumulacji
64, // 16-bit 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
nPixelFormat = ChoosePixelFormat(hDC, &pfd); // wybiera najbardziej zgodny format pikseli
SetPixelFormat(hDC, nPixelFormat, &pfd); // okreœla format pikseli dla danego kontekstu urz¹dzenia
}
// procedura okienkowa
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HGLRC hRC; // kontekst tworzenia grafiki
static HDC hDC; // kontekst urz¹dzenia
int width, height; // szerokoϾ i wysokoϾ 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ê okreœlaj¹c¹ format pikseli
// tworzy kontekst tworzenia grafiki i czyni go bie¿¹cym
hRC = wglCreateContext(hDC);
wglMakeCurrent(hDC, hRC);
return 0;
break;
case WM_CLOSE: // okno jest zamykane
// deaktywuje bie¿¹cy kontekst tworzenia grafiki i usuwa go
wglMakeCurrent(hDC, NULL);
wglDeleteContext(hRC);
// wstawia komunikat WM_QUIT do kolejki
PostQuitMessage(0);
return 0;
break;
case WM_SIZE:
height = HIWORD(lParam); // pobiera nowe rozmiary okna
width = LOWORD(lParam);
if (height==0) // unika dzielenie przez 0
{
height=1;
}
glViewport(0, 0, width, height); // nadaje nowe wymiary oknu OpenGL
glMatrixMode(GL_PROJECTION); // wybiera macierz rzutowania
glLoadIdentity(); // resetuje macierz rzutowania
// wyznacza proporcje obrazu
gluPerspective(54.0f,(GLfloat)width/(GLfloat)height,1.0f,1000.0f);
glMatrixMode(GL_MODELVIEW); // wybiera macierz modelowania
glLoadIdentity(); // resetuje macierz modelowania
return 0;
break;
case WM_KEYDOWN: // u¿ytkownik nacisn¹³ klawisz?
keyPressed[wParam] = true;
return 0;
break;
case WM_KEYUP:
keyPressed[wParam] = false;
return 0;
break;
default:
break;
}
return (DefWindowProc(hwnd, message, wParam, lParam));
}
// punkt, w którym rozpoczyna siê wykonywanie aplikacji
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
WNDCLASSEX windowClass; // klasa okna
HWND hwnd; // uchwyt okna
MSG msg; // komunikat
bool done; // znacznik zakoñczenia aplikacji
DWORD dwExStyle; // rozszerzony styl okna
DWORD dwStyle; // styl okna
RECT windowRect;
// zmienne pomocnicze
int width = 1600;
int height = 900;
int bits = 32;
fullScreen = TRUE;
windowRect.left=(long)0; // struktura okreœlaj¹ca rozmiary okna
windowRect.right=(long)width;
windowRect.top=(long)0;
windowRect.bottom=(long)height;
// 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); // domyœlna ikona
windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // domyœlny kursor
windowClass.hbrBackground = NULL; // bez t³a
windowClass.lpszMenuName = NULL; // bez menu
windowClass.lpszClassName = "MojaKlasa";
windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // logo Windows
// rejestruje klasê okna
if (!RegisterClassEx(&windowClass))
return 0;
if (fullScreen) // tryb pe³noekranowy?
{
DEVMODE dmScreenSettings; // tryb urz¹dzenia
memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
dmScreenSettings.dmSize = sizeof(dmScreenSettings);
dmScreenSettings.dmPelsWidth = width; // szerokoϾ ekranu
dmScreenSettings.dmPelsHeight = height; // wysokoϾ ekranu
dmScreenSettings.dmBitsPerPel = bits; // bitów na piksel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
//
if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
{
// prze³¹czenie trybu nie powiod³o siê, z powrotem tryb okienkowy
MessageBox(NULL, "Prze³¹czenie trybu wyœwietlania nie powiod³o siê", NULL, MB_OK);
fullScreen=FALSE;
}
}
if (fullScreen) // tryb pe³noekranowy?
{
dwExStyle=WS_EX_APPWINDOW; // rozszerzony styl okna
dwStyle=WS_POPUP; // styl okna
ShowCursor(FALSE); // ukrywa kursor myszy
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // definicja klasy okna
dwStyle=WS_OVERLAPPEDWINDOW; // styl okna
}
AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle); // koryguje rozmiar okna
// tworzy okno
hwnd = CreateWindowEx(NULL, // rozszerzony styl okna
"MojaKlasa", // nazwa klasy
"Wyœwietlanie tekstu, przyk³ad pierwszy: czcionka rastrowa", // nazwa aplikacji
dwStyle | WS_CLIPCHILDREN |
WS_CLIPSIBLINGS,
0, 0, // wspó³rzêdne x,y
windowRect.right - windowRect.left,
windowRect.bottom - windowRect.top, // szerokoϾ, wysokoϾ
NULL, // uchwyt okna nadrzêdnego
NULL, // uchwyt menu
hInstance, // instancja aplikacji
NULL); // bez dodatkowych parametrów
// sprawdza, czy utworzenie okna nie powiod³o siê (wtedy wartoœæ hwnd równa NULL)
if (!hwnd)
return 0;
ShowWindow(hwnd, SW_SHOW); // wyœwietla okno
UpdateWindow(hwnd); // aktualizuje okno
done = false; // inicjuje zmienn¹ warunku pêtli
Initialize(); // inicjuje OpenGL
// pêtla przetwarzania komunikatów
while (!done)
{
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT) // aplikacja otrzyma³a komunikat WM_QUIT?
{
done = true; // jeœli tak, to koñczy dzia³anie
}
else
{
if (keyPressed[VK_ESCAPE])
done = true;
else
{
Render();
TranslateMessage(&msg); // t³umaczy komunikat i wysy³a do systemu
DispatchMessage(&msg);
}
}
}
font.CleanUp();
if (fullScreen)
{
ChangeDisplaySettings(NULL,0); // przywraca pulpit
ShowCursor(TRUE); // i wskaŸnik myszy
}
return msg.wParam;
}