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

Aktuelle Zeit: Do Mär 28, 2024 18:15

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



Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: zu Vollbild wechseln
BeitragVerfasst: So Sep 20, 2015 19:06 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hallo,

ich hab bislang immer nur Anwendungen gemacht, bei denen OpenGL auf ein Panel gerendert wurde und nix mit Vollbild.
Da ich für ein neues Projekt aber auch mal im Vollbild sein will habe ich mir hier das Template nochmal angeschaut:

http://wiki.delphigl.com/index.php/Archiv:template_delphi_api

leider läuft es bei mir nicht, auch nicht die beiligende .exe


win7 64 bit.


Kann mir jemand ein lauffähriges Template geben oder sagen was an diesem geändert werden muss damit es läuft?

Danke!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mo Sep 21, 2015 14:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Sollte eigentlich laufen wenn du:
Code:
  1.  
  2. glCreateWnd(800, 600, FALSE, 32)
  3. //durch diesen Wert ersetzen
  4. glCreateWnd(800, 600, TRUE, 32)
  5.  


Ansonsten poste doch mal bitte was GetLastError nach der Funktion sagt.

Und am besten baust du dir noch so etwas wie die folgende Funktion um eine Liste der verfügbaren Auflösungen zu erhalten:
Code:
  1.  
  2. bool sys_res(unsigned int index, vidres_t * res) {
  3.     DISPLAY_DEVICE device;
  4.     DISPLAY_DEVICE monitor;
  5.     DEVMODE mode;
  6.     device.cb = sizeof(DISPLAY_DEVICE);
  7.     monitor.cb = sizeof(DISPLAY_DEVICE);
  8.     mode.dmSize = sizeof(DEVMODE);
  9.     //enumerate all display modes
  10.     for (int i = 0; EnumDisplayDevices(NULL, i, &device, 0); i++) {
  11.         if (!(device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP)) {
  12.             continue;
  13.         }
  14.         for (int mon = 0; EnumDisplayDevices(device.DeviceName, mon, &monitor, 0); mon++) { //todo: add screen-info to vidres_t
  15.             for (int mod = 0; EnumDisplaySettings(device.DeviceName, mod, &mode); mod++) {
  16.                 if (mode.dmBitsPerPel >= NUM_DEVICE_MINIMUM_BPP &&
  17.                     mode.dmPelsWidth >= NUM_DEVICE_MINIMUM_WIDTH &&
  18.                     mode.dmPelsHeight >= NUM_DEVICE_MINIMUM_HEIGHT) { //filter valid modes
  19.                     if (index--) { //decrement index while it's greater 0
  20.                         continue;
  21.                     } else {
  22.                         res->bpp = mode.dmBitsPerPel; //copy the display mode at given index
  23.                         res->width = mode.dmPelsWidth;
  24.                         res->height = mode.dmPelsHeight;
  25.                         res->freq = mode.dmDisplayFrequency;
  26.                         return true; //we found a display mode so we return true
  27.                     }
  28.                 }
  29.             }
  30.         }
  31.     }
  32.     return false; //index out of range so let's return false
  33. }
  34.  


Wenn du ein bestehendes Fenster in den Vollbild wechseln willst:
Code:
  1.  
  2. if (curWndConf.width != backWndConf.width || curWndConf.height != backWndConf.height ||
  3.             curWndConf.bpp != backWndConf.bpp || curWndConf.frequency != backWndConf.frequency ||
  4.             curWndConf.fullscreen != backWndConf.fullscreen) {
  5.             DWORD oldstyle = curWndConf.dwStyle;
  6.             long left = 0;
  7.             long top = 0;
  8.             curWndConf.WindowRect.right = curWndConf.width;
  9.             curWndConf.WindowRect.bottom = curWndConf.height;
  10.             //create new window style
  11.             curWndConf.dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;
  12.             curWndConf.dwStyle = WS_OVERLAPPEDWINDOW;
  13.             //try to set the fullscreen mode
  14.             if (curWndConf.fullscreen != backWndConf.fullscreen) {
  15.                 if (curWndConf.fullscreen) { //todo: handle screen-info from vidres_t
  16.                     DEVMODE dmScreenSettings;                  
  17.                     memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));  
  18.                     dmScreenSettings.dmSize = sizeof(dmScreenSettings);    
  19.                     dmScreenSettings.dmPelsWidth = curWndConf.width;            
  20.                     dmScreenSettings.dmPelsHeight = curWndConf.height;          
  21.                     dmScreenSettings.dmBitsPerPel = curWndConf.bpp;            
  22.                     dmScreenSettings.dmDisplayFrequency = curWndConf.frequency;
  23.                     dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH |
  24.                                                 DM_PELSHEIGHT | DM_DISPLAYFREQUENCY;
  25.                     if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) == DISP_CHANGE_SUCCESSFUL) {
  26.                         curWndConf.dwExStyle = WS_EX_APPWINDOW;
  27.                         curWndConf.dwStyle = WS_POPUP;
  28.                         curWndConf.WindowRect.left = 0;
  29.                         curWndConf.WindowRect.top = 0;
  30.                     } else {
  31.                         curWndConf.fullscreen = false;
  32.                     }
  33.                        
  34.                 } else {
  35.                     ChangeDisplaySettings(NULL, 0);
  36.                 }
  37.             }
  38.             //add current position because rects are defined
  39.             //by points and not sizes
  40.             curWndConf.WindowRect.right += curWndConf.WindowRect.left;
  41.             curWndConf.WindowRect.bottom += curWndConf.WindowRect.top;
  42.             // make sure the window fits the window rect
  43.             left = curWndConf.WindowRect.left;
  44.             top = curWndConf.WindowRect.top;
  45.             AdjustWindowRectEx(&curWndConf.WindowRect, curWndConf.dwStyle, false, curWndConf.dwExStyle);
  46.             left -= curWndConf.WindowRect.left; //set back to the original position
  47.             top -= curWndConf.WindowRect.top;
  48.             if (curWndConf.hWindow) { // update style and position when we have a window
  49.                 DWORD style = GetWindowLong(curWndConf.hWindow, GWL_EXSTYLE);
  50.                 style &= ~oldstyle;
  51.                 style |= curWndConf.dwStyle;
  52.                 SetWindowLong(curWndConf.hWindow, GWL_EXSTYLE, curWndConf.dwExStyle);
  53.                 SetWindowLong(curWndConf.hWindow, GWL_STYLE, style);
  54.                 SetWindowPos(curWndConf.hWindow, HWND_TOPMOST,
  55.                              curWndConf.WindowRect.left, curWndConf.WindowRect.top,
  56.                              curWndConf.WindowRect.right - curWndConf.WindowRect.left,
  57.                              curWndConf.WindowRect.bottom - curWndConf.WindowRect.top,
  58.                              SWP_FRAMECHANGED);
  59.                 ShowWindow(curWndConf.hWindow, SW_SHOW);
  60.             }
  61.             //handle the window border
  62.             curWndConf.WindowRect.left += left;
  63.             curWndConf.WindowRect.right += left;
  64.             curWndConf.WindowRect.top += top;
  65.             curWndConf.WindowRect.bottom += top;
  66.             //config has been handled so lets reset modified
  67.             backWndConf.width = curWndConf.width;
  68.             backWndConf.height = curWndConf.height;
  69.             backWndConf.frequency = curWndConf.frequency;
  70.             backWndConf.bpp = curWndConf.bpp;
  71.             backWndConf.fullscreen = curWndConf.fullscreen;
  72.         }
  73.  

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mo Sep 21, 2015 16:07 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
So wie ich sehe programmierst du Delphi, somit sollte diese einfache Methode auch gehen.

uses Windows ist dafür nötig.

Code:
  1. procedure GoToFullScreen(Form: TForm; pWidth, pHeight, pBPP, pFrequency: word);
  2. var
  3.   dmScreenSettings: DevMode;
  4. begin
  5.   // Fenster vor Vollbild vorbereiten
  6.   Form.WindowState := wsMaximized;
  7.   Form.BorderStyle := bsNone;
  8.   ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  9.   with dmScreenSettings do begin
  10.     dmSize := SizeOf(dmScreenSettings);
  11.     dmPelsWidth := pWidth;                    // Breite
  12.     dmPelsHeight := pHeight;                  // Höhe
  13.     dmBitsPerPel := pBPP;                     // Farbtiefe
  14.     dmDisplayFrequency := pFrequency;         // Bildwiederholfrequenz
  15.     dmFields := DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  16.   end;
  17.   if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then begin
  18.     MessageBox(0, 'Konnte Vollbildmodus nicht aktivieren!', 'Error', MB_OK or MB_ICONERROR);
  19.     exit;
  20.   end;
  21. end;    

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mo Sep 21, 2015 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
@Mathias Ahhh da sehe ich schon gleich etwas das mir Bauchschmerzen macht. ChangeDisplaySettings hat mehrere Rückgabewerte halt je nachdem welchen Fehler
es gibt. Wenn du es kurz machen willst überprüfe lieber nach DISP_CHANGE_SUCCESSFUL. Ansonsten hier einmal die Werte die es geben kann:

DISP_CHANGE_SUCCESSFUL: The settings change was successful.
DISP_CHANGE_BADDUALVIEW: The settings change was unsuccessful because the system is DualView capable.
DISP_CHANGE_BADFLAGS: An invalid set of flags was passed in.
DISP_CHANGE_BADMODE: The graphics mode is not supported.
DISP_CHANGE_BADPARAM: An invalid parameter was passed in. This can include an invalid flag or combination of flags.
DISP_CHANGE_FAILED: The display driver failed the specified graphics mode.
DISP_CHANGE_NOTUPDATED: Unable to write settings to the registry.
DISP_CHANGE_RESTART: The computer must be restarted for the graphics mode to work.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mo Sep 21, 2015 18:57 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1276
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Somit ist die Template hier auch schon falsch, von dort hatte ich es kopiert.
viewtopic.php?f=10&t=6432&p=53197&hilit=DISP_CHANGE_FAILED#p53197


Was noch interessant wäre, wen es so etwas auch Plattform übergreifend gibt.

_________________
OpenGL


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mo Sep 21, 2015 19:01 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Gibt es, sind die easySDL samples aus dem SDK. Ist nur etwas *äh* veraltet.
Da wird einfach SDL genommen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mo Sep 21, 2015 22:38 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hallo,

erstmal danke für die Antworten..

Also das Template stürzt mit penetranter Wiederholgenauigkeit mit einer Access Violation bei 00000 00000 ab.
Auch wenn ich wie yunharla beschreibt das FALSE in TRUE ändere. Dann ändert sich vor dem Absturz nur kurz die Auflösung in vermutlich 800x600 dann kommt die access violation.

wenn ich mit Einzelschritten an den Fehler springe, dann sieht es in der VariablenListe zu dem Zeitpunkt seltsam aus:

Bild

die selben chinesischen Zeichen stehen auch nochmal bei dmFormName...

der eigentliche Absturz kommt dann beim Aufruf von beispielsweise
Code:
  1. glViewport(0, 0, Width, Height);    // Setzt den Viewport für das OpenGL Fenster

ich habe 2 Bildschirme aber auch wenn ich einen in Windows deaktiviere kommt es zum Absturz im Template.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Di Sep 22, 2015 07:49 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Sagmal, hast du Unicode im Projekt definiert?

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Di Sep 22, 2015 07:53 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
yunharla hat geschrieben:
Sagmal, hast du Unicode im Projekt definiert?


nein, ich hab an dem Template nichts geändert. Es ist frisch vom Download.
Wie definiere ich denn Unicode?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Di Sep 22, 2015 09:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Müsste irgendwo in den Projektoptionen sein. Am besten mal schauen wie Bedingte Compelierung bei dir funktioniert.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mi Sep 23, 2015 07:37 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Also ich steh mit dem Template total auf dem Schlauch,
in den Projekteinstellungen habe ich paar Sachen ausprobiert, aber das hat alles nichts genutzt.
Also dachte ich, vielleicht liegts an Delphi XE und habe ein altes Turbo Delphi ausgegraben, aber auch damit kommt die Access Violation..

Normalerweise bedeutet eine Access Violation bei 0000 doch das versucht wird auf etwas zuzugreifen, was noch nicht erstellt wurde.. Aber ich find die Ursache nicht.

Bekommt denn von euch jemand das Template zum laufen? Ich meine bei mir läuft ja nichtmal die beiliegende .exe


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mi Sep 23, 2015 08:36 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Die OpenGL-Initialisierung schlägt fehl. glViewport ist ein Funktionspointer und wird 0 sein. Kannst du mal in der Richtung schauen?
Versuch mal das Template auf die dglOpenGL.pas umzubauen. Diese müsste sich die Funktionspointer nach der Erstellung des Fensters holen. Leider kann ich dir da aber nicht weiterhelfen :(

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mi Sep 23, 2015 09:36 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Nov 08, 2010 18:41
Beiträge: 769
Programmiersprache: Gestern
Ja genau was i0n0s sagte. Wobei es halt nur fuer die neueren Sachen gilt, das du erst nach dem Fenster laden darfst. Die alten 1.x Funktionen kannst
du jederzeit laden. Stell dir die ganzen OpenGL Funktionen am besten als Variablen vor die zur Laufzeit aus der DLL gezogen werden. Meine
Vermutung wäre halt gewesen das er irgendwie die ANSI und Unicode bei den entsprechenden Windows Funktionen hier vermischt. So zwecks
Buchstabensalat usw.

Du kannst ja aber mal probieren ob du per Hand rankommst:

Code:
  1.  
  2.  
  3. HINSTANCE ogl = LoadLibrary("opengl32.dll"); //wenn ogl NULL ist existiert die DLL nicht auf deinen Rechner ... wie auch immer du das geschafft hast
  4. void* test = GetProcAddress(ogl,"glClear"); //wenn test NULL hast du ein Problem, denn dann existiert OpenGL aber du bekommst keine Funktionen
  5. //alternativ geht auch
  6. void* testb = wglGetProcAddress("glClear");
  7. FreeLibrary(ogl);
  8. //beachte das LoadLibrary und GetProcAddress nur Macros auf die eigentlichen Funktionen sind. Falls Encoding Probleme macht hier noch einmal die
  9. //speziellen Versionen dafuer.
  10. LoadLibraryW //Unicode
  11. LoadLibraryA //Ansi
  12.  
  13. GetProcAddressW//Unicode
  14. GetProcAddressA//Ansi
  15.  


So wie ich das sehe müsste aber OpenGL fest in Delphi enthalten sein. Von daher kannst du ja noch einmal das folgende Form ausprobieren:
http://edn.embarcadero.com/article/26401

Sind ja nur Wrapper fuer den Windows Kram, man kann es also noch einmal umbauen so das du ne richtige EventLoop usw. bekommst.

_________________
Meine Homepage


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mi Sep 23, 2015 18:11 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
yunharla hat geschrieben:
So wie ich das sehe müsste aber OpenGL fest in Delphi enthalten sein. Von daher kannst du ja noch einmal das folgende Form ausprobieren:
http://edn.embarcadero.com/article/26401



Also das Beispiel läuft bei mir einwandfrei is ja aber nur fenster und nicht fullscreen. Und Fenster bzw auf Panel rumrendern funktioniert ja sowieso schon in meinen anderen Projekten... nur Fullscreen hab ich bislang nichts hinbekommen.
ich denke das Template ausm Wiki funktioniert einfach nicht, hast du mal die exe ausprobiert?

[EDIT]
Das "Einwandfrei" stimmt so dann doch nicht, hab grad gemerkt das es mit
Code:
  1. uses OpenGL,...
funktioniert aber wenn ich das ersetze durch
Code:
  1. uses dglOpenGL,...
bekomme ich eine Access Violation bei 000000....


Zuletzt geändert von Wölfchen am Mi Sep 23, 2015 18:35, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: zu Vollbild wechseln
BeitragVerfasst: Mi Sep 23, 2015 18:20 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
Wölfchen hat geschrieben:
ich denke das Template ausm Wiki funktioniert einfach nicht, hast du mal die exe ausprobiert?

Gib mal bitte einen Link zur Exe. Ich habe da keine gesehen.

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.081s | 19 Queries | GZIP : On ]