?? init.cpp
字號:
//////////////////////////////////////////////////////////////////////
// init.cpp - obsahuje funkcie pre vytvorenie okna, ktore bude pracovat
// s OpenGL
// Vazba na ostatne je iba cez init.h a instanciu triedy scene
//////////////////////////////////////////////////////////////////////
#include "scene.h"
HDC hDC=NULL; // priv醫ny GDI Device Context
HGLRC hRC=NULL; // Rendering Context
HWND hWnd=NULL; // Handle na okno
HINSTANCE hInstance; // In歵alacia programu
char MenoApplikacie[]="030_Particle_system";
bool keys[256]; // pole - pr醕a s klavesnicou
bool fullscreen=1; // indik醫or pre fullscreen
bool active=1; // indikator aktivy (negacia priznaku minimalizacie)
int error=0; // ak je 1 nastala chyba a program sa ma ukoncit
int screen_x=800; // horizontalne rozlisenie
int screen_y=600; // vertikalne rozlisenie
int screen_bit=16; // pocet bitov na 1 pixel
int english=1;
scene *scene_=NULL;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // deklar醕ia WndProc
void KillGLWindow(void); // deklaracia KillGLWindow
int Nastav_rozlisenia();
//////////////////////////////////////////////////////////////////////
/* Parametry pri tvorbe OpenGL okna *
* title - titulek okna *
* width - sirka okna *
* height - vyska okna *
* bits - pocet bitu na pixel */
BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreen_)
{
GLuint PixelFormat;
WNDCLASSEX wc; // miesto pre strukturu pouzitu na registraciu triedy okna
DWORD dwExStyle;
DWORD dwStyle;
RECT WindowRect; // miesto pre velkost okna
WindowRect.left=(long)0;
WindowRect.right=(long)width;
WindowRect.top=(long)0;
WindowRect.bottom=(long)height;
fullscreen=fullscreen_;
wc.cbSize = sizeof(WNDCLASSEX); //velkost struktury WINDOWCLASSEX
wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; /*nastavenie stylu okna
CS_HREDRAW - prekreslenie okna pri zmene horizontalne velkosti okna
CS_VREDRAW - -----------""-------------- vertikalnej ------""-----
CS_OWNDC - vyhradi jedinecny kontext zariadenia pre kazde okno */
wc.lpfnWndProc = (WNDPROC) WndProc; //smernika na funkciu na spracovanie sprav
wc.cbClsExtra = 0; //specifikuje pocet extra bytov na konci struktury triedy okien na ukladanie informacii
wc.cbWndExtra = 0; //-------""--------------------, ktore sa maju vyhradit po vyskyte okna
wc.hInstance = hInstance; //handle (ukazovatel) na instalaciu (paremeter z WinMain)
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINLOGO)); //handle ikony ktora sa ma pouzit pre danu truedu okien
wc.hCursor = LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)); // LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR_MAIN)); //handle kurzora ktory ----------------""----------------
wc.hbrBackground = NULL; //handle stetca pouziteho na vyfarbenie pozadia okna
wc.lpszMenuName = NULL; //ukazovatel na sz(StringZero) v ktorom je nazov pre menu (!)triedy
wc.lpszClassName = "OpenGL"; //ukaz na sz, ktory obsahuje nazov triedy. Tento nazov sa pouzie v parametry lpClassName vo funkcii CreateWindowEx
wc.hIconSm = NULL; //LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TITLE)); //handle k ikone, ktora sa ma pouzit v titulkovom pruhu okien, vytvorenych touto triedou. Ak je NULL pouzije sa hIcon
if(!RegisterClassEx(&wc)) //registracia novej tiredy okna, pouzivanych na vytavaranie okien
{ MessageBox(NULL,"Chyba pri registracii triedy okna.","ERROR",MB_OK|MB_ICONEXCLAMATION);return 0;}
if(fullscreen) //ZMENA DO FULLSCREEN
{
DEVMODE dmScreenSettings; //struktura popisujuca graficky mod
memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); //vynuluje dmScreenSettings
dmScreenSettings.dmSize=sizeof(dmScreenSettings); //nastavy velkost
dmScreenSettings.dmPelsWidth = width; //vertikalne roazlisenie
dmScreenSettings.dmPelsHeight = height; //horizontalne rozlisenie
dmScreenSettings.dmBitsPerPel = bits; //pocet bitov na pixel
dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; //specifikuje ktore polozky v strukture su menene ??
/**** zmena modu !!! ****/
{ int mod;
mod=ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN);
if(mod!=DISP_CHANGE_SUCCESSFUL)
{
switch(mod)
{
case(DISP_CHANGE_RESTART):MessageBox(NULL,"The computer must be restarted in order for the graphics mode to work.","Chyba pri inicializacii grafickeho rezimu",MB_ICONERROR);break;
case(DISP_CHANGE_BADFLAGS):MessageBox(NULL,"An invalid set of flags was passed in.","Chyba pri inicializacii grafickeho rezimu",MB_ICONERROR);break;
case(DISP_CHANGE_FAILED):MessageBox(NULL,"The display driver failed the specified graphics mode.","Chyba pri inicializacii grafickeho rezimu",MB_ICONERROR);break;
case(DISP_CHANGE_BADMODE):MessageBox(NULL,"The graphics mode is not supported.","Chyba pri inicializacii grafickeho rezimu",MB_ICONERROR);break;
}
if(MessageBox(NULL,"Chyba pri inicializacii grafickeho rezimu. Chcete pokracovat v okne?","Chyba",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)
{ fullscreen=0;} //pokracovanie v okne
else
{ MessageBox(NULL,"Program se uzavrie.","ERROR",MB_OK|MB_ICONSTOP);return FALSE;}
}
}
}
if (fullscreen)
{
dwExStyle=WS_EX_APPWINDOW; //Forces a top-level window onto the taskbar when the window is minimized.
dwStyle=WS_POPUP; //vytvara prekryte okno
}
else
{
dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; //okno ktore ma ohranicenie s vyvysenou hranou (WS_EX_WINDOWEDGE)
dwStyle=WS_OVERLAPPEDWINDOW; //vytvara okno s titulkovym pruhom, ohranicenim, okno je ohraniceny tenkou ciarov
}
AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); //vypocitava velkost okna
/*vytvara okno, generuje: WM_GETMINMAXINFO,WM_NCCREATE,WM_NCCALCSIZE,WM_CREATA,WM_SHOWWINDOW */
hWnd = CreateWindowEx( dwExStyle, //rozsireny styl okna
"OpenGL", //ukazovatel na sz obsahujuci platny nazov triedy pre okno (registrovanej triedy)
title, //ukazovatel na sz obsahujuci meno okna (zobrazuje sa titulkovom pruhu)
dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, //...
0, 0, //pozicia okna na obrazovke (x,y)
WindowRect.right-WindowRect.left, //sirka okna
WindowRect.bottom-WindowRect.top, //vyska okna
NULL, //handle k rodicovskemu oknu
NULL, //handle k menu okna. Ak sa ma pouzit trieda menu pouzite hodnotu NULL
hInstance, //handle vyskytu aplikacie, ktora vytvara okno
NULL); //ukazovatel na data ktora budu odovzdane oko lParam spravy WM_CREATE
if (!hWnd) //ak sa okno nepodarilo vytvorit koniec
{
KillGLWindow();MessageBox(NULL,"Chyba pri tvorbe okna.","ERROR",MB_OK|MB_ICONEXCLAMATION);return FALSE;
}
/*Abychom mohli pracovat s OpenGL mus韒e premostit vykreslov醤
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -