Code:
function CreateGlWindow(title:Pchar; width,height,bits:integer;FullScreenflag:bool):boolean stdcall;
var
Pixelformat: GLuint; // Ukl?°d?° form?°t pixel??
wc:TWndclass; // Struktura Windows Class
dwExStyle:dword; // Rozš????en?? styl okna
dwStyle:dword; // Styl okna
pfd: pixelformatdescriptor; // Nastaven?? form?°tu pixel??
dmScreenSettings: Devmode; // M??d za????zen??
h_Instance:hinst; // Instance okna
WindowRect: TRect; // Obd?©ln??k okna
begin
WindowRect.Left := 0; // Nastav?? lev?? okraj na nulu
WindowRect.Top := 0; // Nastav?? horn?? okraj na nulu
WindowRect.Right := width; // Nastav?? prav?? okraj na zadanou hodnotu
WindowRect.Bottom := height; // Nastav?? spodn?? okraj na zadanou hodnotu
h_instance:=GetModuleHandle(nil); // Z??sk?° instanci okna
FullScreen:=FullScreenflag; // Nastav?? prom?¨nnou fullscreen na spr?°vnou hodnotu
with wc do
begin
style:=CS_HREDRAW or CS_VREDRAW or CS_OWNDC; // P??ekreslen?? p??i zm?¨n?¨ velikosti a vlastn?? DC
lpfnWndProc:=@WndProc; // Definuje proceduru okna
cbClsExtra:=0; // Ž?°dn?° extra data
cbWndExtra:=0; // Ž?°dn?° extra data
hInstance:=h_Instance; // Instance
hIcon:=LoadIcon(0,IDI_WINLOGO); // Standardn?? ikona
hCursor:=LoadCursor(0,IDC_ARROW); // Standardn?? kurzor myši
hbrBackground:=0; // Pozad?? nen?? nutn?©
lpszMenuName:=nil; // Nechceme menu
lpszClassName:='OpenGl'; // Jm?©no t????dy okna
end;
if RegisterClass(wc)=0 then // Registruje t????du okna
begin
MessageBox(0,'Failed To Register The Window Class.','Error',MB_OK or MB_ICONERROR);
Result:=false; // P??i chyb?¨ vr?°t?? false
exit;
end;
if FullScreen then // Budeme ve fullscreenu?
begin
ZeroMemory( @dmScreenSettings, sizeof(dmScreenSettings) ); // Vynulov?°n?? pam?¨ti
with dmScreensettings do
begin
dmSize := sizeof(dmScreenSettings); // Velikost struktury Devmode
dmPelsWidth := width; // Š????ka okna
dmPelsHeight := height; // V??ška okna
dmBitsPerPel := bits; // Barevn?° hloubka
dmFields := DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
end;
// Pokus?? se použ??t pr?°v?¨ definovan?© nastaven??
if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN))<>DISP_CHANGE_SUCCESSFUL THEN
Begin
// Nejde-li fullscreen, m??že uživatel spustit program v okn?¨ nebo ho opustit
if MessageBox(0,'This FullScreen Mode Is Not Supported. Use Windowed Mode Instead?'
,'NeHe GL',MB_YESNO or MB_ICONEXCLAMATION)= IDYES then
FullScreen:=false // B?¨h v okn?¨
else
begin
// Zobraz?? uživateli zpr?°vu, že program bude ukon?®en
MessageBox(0,'Program Will Now Close.','Error',MB_OK or MB_ICONERROR);
Result:=false; // Vr?°t?? FALSE
exit;
end;
end;
end;
if FullScreen then // Jsme st?°le ve fullscreenu?
begin
dwExStyle:=WS_EX_APPWINDOW; // Rozš????en?? styl okna
dwStyle:=WS_POPUP or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; // Styl okna
Showcursor(false); // Skryje kurzor
end
else
begin
dwExStyle:=WS_EX_APPWINDOW or WS_EX_WINDOWEDGE; // Rozš????en?? styl okna
dwStyle:=WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN; // Styl okna
end;
AdjustWindowRectEx(WindowRect,dwStyle,false,dwExStyle); // P??izp??soben?? velikosti okna
// Vytvo??en?? okna
H_wnd:=CreateWindowEx(dwExStyle, // Rozš????en?? styl
'OpenGl', // Jm?©no t????dy
Title, // Titulek
dwStyle, // Definovan?? styl
0,0, // Pozice
WindowRect.Right-WindowRect.Left, // V??po?®et š????ky
WindowRect.Bottom-WindowRect.Top, // V??po?®et v??šky
0, // Ž?°dn?© rodi?®ovsk?© okno
0, // Bez menu
hinstance, // Instance
nil); // Nep??edat nic do WM_CREATE
if h_Wnd=0 then // Pokud se okno nepoda??ilo vytvo??it
begin
KillGlWindow(); // Zruš?? okno
MessageBox(0,'Window creation error.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Vr?°t?? chybu
exit;
end;
with pfd do // Ozn?°m??me Windows jak chceme vše nastavit
begin
nSize:= SizeOf( PIXELFORMATDESCRIPTOR ); // Velikost struktury
nVersion:= 1; // ?à??slo verze
dwFlags:= PFD_DRAW_TO_WINDOW // Podpora okna
or PFD_SUPPORT_OPENGL // Podpora OpenGL
or PFD_DOUBLEBUFFER; // Podpora Double Bufferingu
iPixelType:= PFD_TYPE_RGBA; // RGBA Format
cColorBits:= bits; // Zvol?? barevnou hloubku
cRedBits:= 0; // Bity barev ignorov?°ny
cRedShift:= 0;
cGreenBits:= 0;
cBlueBits:= 0;
cBlueShift:= 0;
cAlphaBits:= 0; // Ž?°dn?? alpha buffer
cAlphaShift:= 0; // Ignorov?°n Shift bit
cAccumBits:= 0; // Ž?°dn?? akumula?®n?? buffer
cAccumRedBits:= 0; // Akumula?®n?? bity ignorov?°ny
cAccumGreenBits:= 0;
cAccumBlueBits:= 0;
cAccumAlphaBits:= 0;
cDepthBits:= 16; // 16-bitov?? hloubkov?? buffer (Z-Buffer)
cStencilBits:= 0; // Ž?°dn?? Stencil Buffer
cAuxBuffers:= 0; // Ž?°dn?? Auxiliary Buffer
iLayerType:= PFD_MAIN_PLANE; // Hlavn?? vykreslovac?? vrstva
bReserved:= 0; // Rezervov?°no
dwLayerMask:= 0; // Maska vrstvy ignorov?°na
dwVisibleMask:= 0;
dwDamageMask:= 0;
end;
h_Dc := GetDC(h_Wnd); // Zkus?? p??ipojit kontext za????zen??
if h_Dc=0 then // Poda??ilo se p??ipojit kontext za????zen???
begin
KillGLWindow(); // Zav??e okno
MessageBox(0,'Cant''t create a GL device context.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukon?®?? program
exit;
end;
PixelFormat := ChoosePixelFormat(h_Dc, @pfd); // Zkus?? naj??t Pixel Format
if (PixelFormat=0) then // Poda??ilo se naj??t Pixel Format?
begin
KillGLWindow(); // Zav??e okno
MessageBox(0,'Cant''t Find A Suitable PixelFormat.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukon?®?? program
exit;
end;
if (not SetPixelFormat(h_Dc,PixelFormat,@pfd)) then // Poda??ilo se nastavit Pixel Format?
begin
KillGLWindow(); // Zav??e okno
MessageBox(0,'Cant''t set PixelFormat.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukon?®?? program
exit;
end;
h_Rc := wglCreateContext(h_Dc); // Poda??ilo se vytvo??it Rendering Context?
if (h_Rc=0) then
begin
KillGLWindow(); // Zav??e okno
MessageBox(0,'Cant''t create a GL rendering context.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukon?®?? program
exit;
end;
if (not wglMakeCurrent(h_Dc, h_Rc)) then // Poda??ilo se aktivovat Rendering Context?
begin
KillGLWindow(); // Zav??e okno
MessageBox(0,'Cant''t activate the GL rendering context.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukon?®?? program
exit;
end;
ShowWindow(h_Wnd,SW_SHOW); // Zobrazen?? okna
SetForegroundWindow(h_Wnd); // Do pop??ed??
SetFOcus(h_Wnd); // Zam?¨???? fokus
ReSizeGLScene(width,height); // Nastaven?? perspektivy OpenGL sc?©ny
if (not InitGl()) then // Inicializace okna
begin
KillGLWindow(); // Zav??e okno
MessageBox(0,'initialization failed.','Error',MB_OK or MB_ICONEXCLAMATION);
Result:=false; // Ukon?®?? program
exit;
end;
Result:=true; // Vše prob?¨hlo v po???°dku
end;
Bookmarks