Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Jul 14, 2025 04:43

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: AccessViolation bei Vollbild
BeitragVerfasst: Fr Feb 25, 2005 14:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 21, 2005 21:59
Beiträge: 33
hi Leute hab ein großes Problem.

Hab nen template für opengl12_api mit nem template für opengl15_vcl "gemischt" (Frankstein lässt grüßen :wink: )
wenn ich mein prog im fenstermodus laufen lasse funktioniert alles wunderbar nur wenn ich das im Vollbild haben will gibts ne Access Violation.
Ich glaube der Fehler wird bei CreateWndEx erzeugt, weil kein wert an h_wnd übergeben wird.
Nur ich hab keinen Plan wieso...
hier mal der Code von glCreateWnd:
Code:
  1. function glCreateWnd(Width, Height : Integer; Fullscreen : Boolean; PixelDepth : Integer) : Boolean;
  2. var
  3.   wndClass : TWndClass;         // Fenster Klasse
  4.   dwStyle : DWORD;              // Fenster Stil
  5.   dwExStyle : DWORD;            // Erweiterter Fenster Stil
  6.   dmScreenSettings : DEVMODE;   // Bildschirm Einstellungen (fullscreen, etc...)
  7.   PixelFormat : GLuint;         // OpenGL Einstellungen (Pixelformat)
  8.   h_Instance : HINST;           // aktuelle Instanz
  9.   pfd : TPIXELFORMATDESCRIPTOR;  // Einstellungen für das OpenGL Fenster
  10. begin
  11.   h_Instance := GetModuleHandle(nil);       // Instanz für's Fenster holen
  12.   ZeroMemory(@wndClass, SizeOf(wndClass));  // Daten in wndClass löschen
  13.  
  14.   with wndClass do                    // Setup der Fenster Klasse
  15.   begin
  16.     style         := CS_HREDRAW or    // Neuzeichenen wenn Fenster-Breite geändert
  17.                      CS_VREDRAW or    // Neuzeichenen wenn Fenster-Höhe geändert
  18.                      CS_OWNDC;        // Device Context exlusiv
  19.     lpfnWndProc   := @WndProc;        // WndProc wird als Window Procedure gesetzt
  20.     hInstance     := h_Instance;
  21.     hCursor       := LoadCursor(0, IDC_ARROW);
  22.     lpszClassName := 'OpenGL';
  23.   end;
  24.  
  25.   if (RegisterClass(wndClass) = 0) then  // Fenster Klasse registrieren
  26.   begin
  27.     MessageBox(0, 'Failed to register the window class!', 'Error', MB_OK or MB_ICONERROR);
  28.     Result := False;
  29.     Exit
  30.   end;
  31.  
  32.   // Vollbild wenn Parameter Fullscreen = true
  33.   if Fullscreen then
  34.   begin
  35.     ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  36.     with dmScreenSettings do begin              // Bildschirm Einstellungen werden festgelegt
  37.       dmSize       := SizeOf(dmScreenSettings);
  38.       dmPelsWidth  := Width;                    // Fenster Breite
  39.       dmPelsHeight := Height;                   // Fenster Höhe
  40.       dmBitsPerPel := PixelDepth;               // Farbtiefe (32bit etc)
  41.       dmFields     := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL;
  42.     end;
  43.  
  44.     // Bilschirm Modus auf Vollbild setzen
  45.     if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then
  46.     begin
  47.       MessageBox(0, 'Unable to switch to fullscreen!', 'Error', MB_OK or MB_ICONERROR);
  48.       Fullscreen := False;
  49.     end;
  50.   end;
  51.  
  52.   // Wenn wir immer noch im Vollbildmodus sind....
  53.   if (Fullscreen) then
  54.   begin
  55.     dwStyle := WS_POPUP or                // Popup Fenster Stil
  56.                WS_CLIPCHILDREN            // Kein Zeichnen in Child Fenstern
  57.                or WS_CLIPSIBLINGS;        // Kein Zeichnen in Sibling Fenstern
  58.     dwExStyle := WS_EX_APPWINDOW;         // Fenster im Vordergrund
  59.     ShowCursor(False);                    // Mauszeiger verstecken
  60.   end
  61.   else // Für Normale Fenster
  62.   begin
  63.     dwStyle := WS_OVERLAPPEDWINDOW or     // Überschneidung zulassen
  64.                WS_CLIPCHILDREN or         // Kein Zeichnen in Child Fenstern
  65.                WS_CLIPSIBLINGS;           // Kein Zeichnen in Sibling Fenstern
  66.     dwExStyle := WS_EX_APPWINDOW or       // Fenster im Fordergrund
  67.                  WS_EX_WINDOWEDGE;        // Erhobener Rand
  68.   end;
  69.  
  70.   // Das oben definierte Fenster wird erstellt
  71.   h_Wnd := CreateWindowEx(dwExStyle,      // Erweiterter Fenster Stil
  72.                           'OpenGL',       // Name der Klasse
  73.                           WND_TITLE,      // Fenster Titel (caption)
  74.                           dwStyle,        // Fenster Stil
  75.                           0, 0,           // Fenster Position
  76.                           Width, Height,  // Größe des Fensters
  77.                           0,              // Keine Paren-Windows
  78.                           0,              // Kein Menü
  79.                           h_Instance,     // die Instanz
  80.                           nil);           // Kein Parameter für WM_CREATE
  81.   if h_Wnd = 0 then
  82.   begin
  83.     glKillWnd(Fullscreen);
  84.     MessageBox(0, 'Unable to create window!', 'Error', MB_OK or MB_ICONERROR);
  85.     Result := False;
  86.     Exit;
  87.   end;
  88.  
  89.   // Den Device Kontext unseres Fensters besorgen
  90.   h_DC := GetDC(h_Wnd);
  91.   if (h_DC = 0) then
  92.   begin
  93.     glKillWnd(Fullscreen);
  94.     MessageBox(0, 'Unable to get a device context!', 'Error', MB_OK or MB_ICONERROR);
  95.     Result := False;
  96.     Exit;
  97.   end;
  98.  
  99. // Ab hier kommt alles aus dem VCL Template: //
  100.  
  101.   InitOpenGL;
  102.   // Renderkontext erstellen (32 Bit Farbtiefe, 24 Bit Tiefenpuffer, Doublebuffering)
  103.   h_RC := CreateRenderingContext(h_DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  104.   // Erstellten Renderkontext aktivieren
  105.   ActivateRenderingContext(h_DC, h_RC);
  106.   // Tiefenpuffer aktivieren
  107.   glEnable(GL_DEPTH_TEST);
  108.   // Nur Fragmente mit niedrigerem Z-Wert (näher an Betrachter) \"durchlassen\"
  109.   glDepthFunc(GL_LESS);
  110.   // Löschfarbe für Farbpuffer setzen
  111.   glClearColor(0,0,0,0);
  112.  
  113.   // Initialisierung des Timers zur FPS-Berechnung
  114.   SetTimer(h_Wnd, FPS_TIMER, FPS_INTERVAL, nil);
  115.  
  116.   // Das Fenster wird in Vordergrund gebracht
  117.   ShowWindow(h_Wnd, SW_SHOW);
  118.   SetForegroundWindow(h_Wnd);
  119.   SetFocus(h_Wnd);
  120.  
  121.   // Das Fenster bekommt nochmal die Größe zugewiesen um OpenGl richtig zu initialisieren
  122.   glResizeWnd(Width, Height);
  123.   LoadTextures;
  124.   Result := True;
  125. end;


Der erste Teil stammt aus dem Template für die Api und der Letze aus dem für die VCL
Wenn sich jemand fragt, wie ich auf die leichtsinnige idee komme die zu mischen:
Im Api-Template war die Initgl- funktion von der dglOpenGl unit nicht vorhanden. Im anderen template schon :roll:

Hat jemand ne Ahnung warum da ne Violation kommt?

Danke euch!

Leo

moderiert von Lossy eX: Code durch Pascaltags ersetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 14:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hab das mit den Tags mal geändert. Aber sniper_w hat recht. Diese Frage kam in letzter Zeit ziemlich häufig.
Siehe hier.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 25, 2005 15:59 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Feb 21, 2005 21:59
Beiträge: 33
Oh, sorry! :cry:
Dachte ich wäre der Einzige der auf so verückte idee kommt...
Danke für den Link!
Das problem ist weg.

Bei nächsten mal werd ich erstmal suchen, versprochen!

Danke euch und noch sry

Leo


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]