⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 init.cpp

📁 030_Particle_system using opengl
💻 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 + -