1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183:
| function glCreateWnd(Width, Height : Integer; Fullscreen : Boolean; PixelDepth : Integer) : Boolean; var wndClass : TWndClass; // Fenster Klasse dwStyle : DWORD; // Fenster Stil dwExStyle : DWORD; // Erweiterter Fenster Stil dmScreenSettings : DEVMODE; // Bildschirm Einstellungen (fullscreen, etc...) PixelFormat : GLuint; // OpenGL Einstellungen (Pixelformat) h_Instance : HINST; // aktuelle Instanz pfd : TPIXELFORMATDESCRIPTOR; // Einstellungen für das OpenGL Fenster begin h_Instance := GetModuleHandle(nil); // Instanz für's Fenster holen ZeroMemory(@wndClass, SizeOf(wndClass)); // Daten in wndClass löschen
with wndClass do // Setup der Fenster Klasse begin style := CS_HREDRAW or // Neuzeichenen wenn Fenster-Breite geändert CS_VREDRAW or // Neuzeichenen wenn Fenster-Höhe geändert CS_OWNDC; // Device Context exlusiv lpfnWndProc := @WndProc; // WndProc wird als Window Procedure gesetzt hInstance := h_Instance; hCursor := LoadCursor(0, IDC_ARROW); lpszClassName := 'OpenGL'; end;
if (RegisterClass(wndClass) = 0) then // Fenster Klasse registrieren begin MessageBox(0, 'Failed to register the window class!', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit end;
// Vollbild wenn Parameter Fullscreen = true if Fullscreen then begin ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings)); with dmScreenSettings do begin // Bildschirm Einstellungen werden festgelegt dmSize := SizeOf(dmScreenSettings); dmPelsWidth := Width; // Fenster Breite dmPelsHeight := Height; // Fenster Höhe dmBitsPerPel := PixelDepth; // Farbtiefe (32bit etc) dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL; end;
// Bilschirm Modus auf Vollbild setzen if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then begin MessageBox(0, 'Unable to switch to fullscreen!', 'Error', MB_OK or MB_ICONERROR); Fullscreen := False; end; end;
// Wenn wir immer noch im Vollbildmodus sind.... if (Fullscreen) then begin dwStyle := WS_POPUP or // Popup Fenster Stil WS_CLIPCHILDREN // Kein Zeichnen in Child Fenstern or WS_CLIPSIBLINGS; // Kein Zeichnen in Sibling Fenstern dwExStyle := WS_EX_APPWINDOW; // Fenster im Vordergrund ShowCursor(False); // Mauszeiger verstecken end else // Für Normale Fenster begin dwStyle := WS_OVERLAPPEDWINDOW or // Überschneidung zulassen WS_CLIPCHILDREN or // Kein Zeichnen in Child Fenstern WS_CLIPSIBLINGS; // Kein Zeichnen in Sibling Fenstern dwExStyle := WS_EX_APPWINDOW or // Fenster im Fordergrund WS_EX_WINDOWEDGE; // Erhobener Rand end;
// Das oben definierte Fenster wird erstellt h_Wnd := CreateWindowEx(dwExStyle, // Erweiterter Fenster Stil 'OpenGL', // Name der Klasse WND_TITLE, // Fenster Titel (caption) dwStyle, // Fenster Stil 0, 0, // Fenster Position Width, Height, // Größe des Fensters 0, // Keine Paren-Windows 0, // Kein Menü h_Instance, // die Instanz nil); // Kein Parameter für WM_CREATE if h_Wnd = 0 then begin glKillWnd(Fullscreen); MessageBox(0, 'Unable to create window!', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit; end;
// Den Device Kontext unseres Fensters besorgen h_DC := GetDC(h_Wnd); if (h_DC = 0) then begin glKillWnd(Fullscreen); MessageBox(0, 'Unable to get a device context!', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit; end;
// Das Pixelformat einstellen with pfd do begin nSize := SizeOf(TPIXELFORMATDESCRIPTOR); // Größe des Pixel Format Descriptor nVersion := 1; // Version des Daten Structs dwFlags := PFD_DRAW_TO_WINDOW // Buffer erlaubt zeichenen auf Fenster or PFD_SUPPORT_OPENGL // Buffer unterstützt OpenGL drawing or PFD_DOUBLEBUFFER; // Double Buffering benutzen iPixelType := PFD_TYPE_RGBA; // RGBA Farbformat cColorBits := PixelDepth; // OpenGL Farbtiefe cRedBits := 0; cRedShift := 0; cGreenBits := 0; cGreenShift := 0; cBlueBits := 0; cBlueShift := 0; cAlphaBits := 0; // Not supported cAlphaShift := 0; // Not supported cAccumBits := 0; // Kein Accumulation Buffer cAccumRedBits := 0; cAccumGreenBits := 0; cAccumBlueBits := 0; cAccumAlphaBits := 0; cDepthBits := 16; // Genauigkeit des Depht-Buffers cStencilBits := 0; // Stencil Buffer ausschalten cAuxBuffers := 0; // Not supported iLayerType := PFD_MAIN_PLANE; // Wird Ignoriert! bReserved := 0; // Anzahl der Overlay und Underlay Planes dwLayerMask := 0; // Wird Ignoriert! dwVisibleMask := 0; // Transparente Farbe der Underlay Plane dwDamageMask := 0; // Wird Ignoriert! end;
// Gibt ein unterstützes Pixelformat zurück das dem geforderten so gut wie möglich enspricht PixelFormat := ChoosePixelFormat(h_DC, @pfd); if (PixelFormat = 0) then begin glKillWnd(Fullscreen); MessageBox(0, 'Unable to find a suitable pixel format', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit; end;
// Das Pixelformat unseres Device Kontexts wird durch das neue ersetzt if (not SetPixelFormat(h_DC, PixelFormat, @pfd)) then begin glKillWnd(Fullscreen); MessageBox(0, 'Unable to set the pixel format', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit; end;
// OpenGL Rendering Context wird erstellt h_RC := wglCreateContext(h_DC); if (h_RC = 0) then begin glKillWnd(Fullscreen); MessageBox(0, 'Unable to create an OpenGL rendering context', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit; end;
// Der OpenGL Rendering Context wird aktiviert if (not wglMakeCurrent(h_DC, h_RC)) then begin glKillWnd(Fullscreen); MessageBox(0, 'Unable to activate OpenGL rendering context', 'Error', MB_OK or MB_ICONERROR); Result := False; Exit; end;
// Initialisierung des Timers zur FPS-Berechnung SetTimer(h_Wnd, FPS_TIMER, FPS_INTERVAL, nil);
// Das Fenster wird in Vordergrund gebracht ShowWindow(h_Wnd, SW_SHOW); SetForegroundWindow(h_Wnd); SetFocus(h_Wnd);
// Das Fenster bekommt nochmal die Größe zugewiesen um OpenGl richtig zu initialisieren glResizeWnd(Width, Height); glInit();
Result := True; end; |