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

Aktuelle Zeit: Do Jul 17, 2025 05:29

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Jul 25, 2011 19:03 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Kann mir jemand sagen wie ich das OpenGL Fenster auf dem Secondary Monitor auf Fullscreen schalte?

Problem:
1. Monitor 1920 x 1080 Punkte
2. Monitor 1024 x 800 Punkte (rechts vom 1. Monitor)
Application läuft auf dem 2. Monitor und soll auch dort als Full Screen laufen

Ich nutze in etwa den Code von NeHe - dieser funktioniert auf dem 1. Monitor auch hervorragend - aber nicht auf dem 2.
http://nehe.gamedev.net/tutorial/creating_an_opengl_window_win32/13001/

Code:
  1.  
  2.   fMonitor:= mainform.Monitor;
  3.   Result:= glCreateWnd(fMonitor.Left, fMonitor.Top, fMonitor.Width, fMonitor.Height, BitsPerPel, FHwnd);
  4.   ...
  5.  
  6. function glCreateWnd(Left, Top, Width, Height: Integer; PixelDepth: Integer; var FHwnd: HWND): Boolean;
  7. ...
  8.   //Grab An Instance For Our Window
  9.   h_Instance:= GetModuleHandle(nil);
  10.   // Clear the window class structure
  11.   ZeroMemory(@wndClass, SizeOf(wndClass));
  12.   // Set up the window class
  13.   with wndClass do begin
  14.     Style:= CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
  15.     lpfnWndProc:= @FS_WndProc;
  16.     cbClsExtra:= 0;
  17.     cbWndExtra:= 0;
  18.     HInstance:= h_Instance;
  19.     hIcon:= LoadIcon(HInstance, 'MAINICON');
  20.     hCursor:= LoadCursor(0, IDC_ARROW);
  21.     hbrBackground:= 0;
  22.     lpszMenuName:= nil;
  23.     lpszClassName:= PChar(MainSoftwareName);
  24.   end;
  25.   // Attemp to register the window class
  26.   if (Windows.RegisterClass(wndClass) = 0) then begin
  27.     DLGError_UnableToSwitchToFullScreen;
  28.     Result:= False;
  29.     Exit;
  30.   end;
  31.   DestroyIcon(wndClass.hIcon);
  32.   // Set parameters for the screen setting
  33.   ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  34.   dmScreenSettings.dmSize:= SizeOf(dmScreenSettings);
  35.   EnumDisplaySettings(nil, Cardinal(-1), dmScreenSettings);
  36.   Frequency:= dmScreenSettings.dmDisplayFrequency;
  37.   ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));
  38.   dmScreenSettings.dmSize:= SizeOf(dmScreenSettings);
  39.   //Imporove: search a perfect mode (if possible)
  40.   with dmScreenSettings do begin // Set parameters for the screen setting
  41.     dmSize:= SizeOf(dmScreenSettings);
  42.     dmPelsWidth:= Width; // Window width
  43.     dmPelsHeight:= Height; // Window height
  44.     dmBitsPerPel:= PixelDepth; // Window color depth
  45.     dmDisplayFrequency:= Frequency;
  46.     dmFields:= DM_PELSWIDTH or DM_PELSHEIGHT or DM_BITSPERPEL or DM_DISPLAYFREQUENCY;
  47.   end;
  48.   // Try to change screen mode to fullscreen
  49.   if (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) then begin
  50.     DLGError_UnableToSwitchToFullScreen;
  51.     Result:= False;
  52.     Exit;
  53.   end;


Das Problem tritt wohl bei ChangeDisplaySettings auf. Danach schaltet die Auflösung des primären Monitors auf die des 2. Monitors um (irgendwie will der Full Screen gehen). Mein Programm wird dann auf dem 2. Monitor nur teilweise dargestellt, da scheinbar der 1. Monitor in den Fullscreen geschaltet wurde (somit stimmt die Koordinate Left vom 2. Monitor nicht mehr - das der 1. Monitor ja die Auflösung umgeschlatet hat).

Wie aber kann ich den 2. Monitor in Full Screen schalten?
Irgendwie scheint es mir dass dies gar nicht geht - man ihn aber irgendwie zum primären Monitor machen kann und dann umschalten.

Aie aber geht das und stört das andere Anwendungen?
Hoffe ihr könnt mir weiterhelfen...

User69


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Jul 25, 2011 22:22 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Reicht es nicht den BorderStyle vom Formular auf bsNone zu setzen und die Höhe und Breite auf die des Monitors?
Oder willst du die Auflösung des zweiten Monitors auch ändern?

Bei ChangeDisplaySettings gibt es auch einen Parameter um die Nummer des Monitors, der beeinflusst werden soll, festzulegen. (siehe http://msdn.microsoft.com/en-us/library/dd183411%28v=vs.85%29.aspx)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 29, 2011 09:39 
Offline
DGL Member

Registriert: Fr Okt 24, 2003 22:26
Beiträge: 120
Wohnort: Mannheim
Programmiersprache: Delphi
Danke, der Hinweis die Auflösung gar nicht zu ändern war gut. So funktioniert das dann.

Einzige Frage:
Was bewirkt das flag CDS_FULLSCREEN denn überhaupt in ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN ...) ? Es geht ja ohne echt gut - ich hatte das verwendet, da ich es immer wirder in dem Zusammenhang im Internet fand und dacht sonst gibt es Probleme, wenn ich nicht CDS_FULLSCREEN setze.

User69


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 29, 2011 15:27 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Könnte mir vorstellen, dass CDS_FULLSCREEN als Hint verwendet wird, um z.B. dinge wie Taskleiste auszublenden.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jul 29, 2011 15:35 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Ja, die Beschreibung ist ein bischen verwirrend (zumindest für mich), weshalb ich erstmal nachschauen musste wie ich das bei mir mache.
Jedenfalls ist das Schlüsselwort "temporär". Wenn du die Auflösung änderst und dann das Programm beendest, wird die Auflösung automatisch wieder auf den Ursprung zurückgesetzt (was ganz praktisch ist). Hingegen sollte beim Parameter CDS_GLOBAL die Auflösung auch nach Programmende so bleiben.
Außerdem seh ich da grad' es gibt auch CDS_SET_PRIMARY mit dem man den primären Monitor festlegen kann (wahrscheinlich zusammen mit dem Wert in dmPosition).


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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 ]