Fenster im zweiten Monitor öffnen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Fenster im zweiten Monitor öffnen

Beitrag von Skiller »

Hi Leute,
wollte - wie der Titel ja schon sagt - meine Anwendung in einem anderen Monitor als im Hauptmonitor starten. Soweit ich das verstanden habe, muss das X des zu öffnenden Fensters grösser sein als das DesktopWidth(1) des 1. bzw. Hauptmonitores. Hier jetzt mal das leicht veränderte Screen3DRequester.pb der PB_5.10 3D-Demos um die Sache zu testen. Eigentlich sollten die Fenster doch nun im zweiten Monitor statt wiederum im Hauptmonitor öffnen. Was habe ich übersehen?

Danke schon mal !!!! :)

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Common 3D functions
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

#WINDOW_Screen3DRequester = 0

#GADGET_FullScreen        = 1
#GADGET_Windowed          = 2
#GADGET_ScreenModesLabel  = 3
#GADGET_WindowedModes     = 4
#GADGET_Launch            = 5
#GADGET_Cancel            = 6
#GADGET_Logo              = 7
#GADGET_Frame             = 8
#GADGET_ScreenModes       = 9
#GADGET_Antialiasing      = 10
#GADGET_AntialiasingModes = 11

Global Screen3DRequester_FullScreen, Screen3DRequester_ShowStats

;-----------------------------------------------------------------------------------------------------------
; Versuch, die Fenster im 2. Monitor zu starten
;-----------------------------------------------------------------------------------------------------------
nMonitore = ExamineDesktops()
If nMonitore > 1
  nWinX = DesktopWidth(1) + 10
  MessageRequester("Es gibt " + Str(nMonitore) + "  Monitore", "Wir starten das Fenster bei X = "+Str(nWinX))
Else
  nWinX = 0
EndIf
;-----------------------------------------------------------------------------------------------------------  


UsePNGImageDecoder()

Procedure Screen3DRequester()

  OpenPreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
    FullScreen          = ReadPreferenceLong  ("FullScreen"        , 0)
    FullScreenMode$     = ReadPreferenceString("FullScreenMode"    , "800x600")
    WindowedScreenMode$ = ReadPreferenceString("WindowedScreenMode", "800x600")
    AAMode              = ReadPreferenceLong  ("Antialiasing"      , 0)
    
  If ExamineDesktops()
    ScreenX = DesktopWidth(0)
    ScreenY = DesktopHeight(0)
    ScreenD = DesktopDepth(0)
    ScreenF = DesktopFrequency(0)
  EndIf
  
  If OpenWindow(#WINDOW_Screen3DRequester, nWinX+0, 0, 396, 230, "PureBasic - 3D Demos", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_Invisible)
    
    top = 6
    
    ImageGadget  (#GADGET_Logo, 6, top, 0, 0, LoadImage(0,"../Data/PureBasic3DLogo.png"), #PB_Image_Border) : top+76
    
    Frame3DGadget(#GADGET_Frame, 6, top, 384, 105, "", 0) : top+20
    
    OptionGadget(#GADGET_FullScreen, 70, top, 100, 20, "Fullscreen")        : top+25
    OptionGadget(#GADGET_Windowed  , 70, top, 100, 20, "Windowed")          : top+25
    TextGadget(#GADGET_Antialiasing, 70, top+5, 100, 20, "Antialiasing mode") : top - 50 
    
    ComboBoxGadget (#GADGET_ScreenModes  , 190, top, 150, 21)     : top+25
    ComboBoxGadget (#GADGET_WindowedModes, 190, top, 150, 21)     : top+25
    ComboBoxGadget (#GADGET_AntialiasingModes, 190, top, 150, 21) : top+45
   
    ButtonGadget (#GADGET_Launch,   6, top, 180, 25, "Launch", #PB_Button_Default)
    ButtonGadget (#GADGET_Cancel, 200, top, 190, 25, "Cancel")
      
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"None")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x2")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x4")
    AddGadgetItem(#GADGET_AntialiasingModes,-1,"FSAA x6")
  
    SetGadgetState(#GADGET_AntialiasingModes,AAMode)
    
    If ExamineScreenModes()
      
      Position = 0
      While NextScreenMode()
        
        Position + 1
        width       = ScreenModeWidth()
        height      = ScreenModeHeight()
        depth       = ScreenModeDepth()
        RefreshRate = ScreenModeRefreshRate()
        
        If depth > 8
          AddGadgetItem(#GADGET_ScreenModes, -1, Str(width)+"x"+Str(height)+"x"+Str(depth)+"@"+Str(RefreshRate))
          If ScreenX = width And ScreenY = height And ScreenD = depth And ScreenF = RefreshRate
            SetGadgetState(#GADGET_ScreenModes, Position)
            FullScreenMode$ = Str(width)+"x"+Str(height)+"x"+Str(depth)+"@"+Str(RefreshRate)
          EndIf  
        EndIf
       
      Wend        
      
    EndIf
    
    ExamineDesktops()
    NbScreenModes = 7
    
    Restore WindowedScreenDimensions

    Repeat      
      Read.l CurrentWidth
      Read.l CurrentHeight
      
      If CurrentWidth < DesktopWidth(0) And CurrentHeight < DesktopHeight(0)
        AddGadgetItem(#GADGET_WindowedModes, -1, Str(CurrentWidth)+ "x"+Str(CurrentHeight))
        NbScreenModes - 1
      Else
        NbScreenModes = 0
      EndIf
      
    Until NbScreenModes = 0
    
    SetGadgetState(#GADGET_FullScreen, FullScreen)
    SetGadgetState(#GADGET_Windowed  , 1-FullScreen)

    SetGadgetText (#GADGET_ScreenModes  , FullScreenMode$)
    SetGadgetText (#GADGET_WindowedModes, WindowedScreenMode$)
    
    DisableGadget (#GADGET_ScreenModes  , 1-FullScreen)
    DisableGadget (#GADGET_WindowedModes, FullScreen)
    
    HideWindow(#WINDOW_Screen3DRequester, 0)
    
    Repeat
      
      Event = WaitWindowEvent()
      
      Select Event
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
          
        Case #GADGET_Launch
          Quit = 2
          
        Case #GADGET_Cancel
          Quit = 1
          
        Case #GADGET_FullScreen
          DisableGadget(#GADGET_ScreenModes  , 0)
          DisableGadget(#GADGET_WindowedModes, 1)
        
        Case #GADGET_Windowed
          DisableGadget(#GADGET_ScreenModes  , 1)
          DisableGadget(#GADGET_WindowedModes, 0)
                 
        EndSelect
        
      Case #PB_Event_CloseWindow
        Quit = 1
        
      EndSelect
      
    Until Quit > 0
    
    FullScreen          = GetGadgetState(#GADGET_FullScreen)
    FullScreenMode$     = GetGadgetText (#GADGET_ScreenModes)
    WindowedScreenMode$ = GetGadgetText (#GADGET_WindowedModes)
    AAMode              = GetGadgetState(#GADGET_AntialiasingModes)
    
    CloseWindow(#WINDOW_Screen3DRequester)
      
  EndIf
  
  If Quit = 2 ; Launch button has been pressed
  
    CreatePreferences(GetHomeDirectory()+"PureBasicDemos3D.prefs")
      WritePreferenceLong  ("FullScreen"        , FullScreen)          
      WritePreferenceString("FullScreenMode"    , FullScreenMode$)     
      WritePreferenceString("WindowedScreenMode", WindowedScreenMode$) 
      WritePreferenceLong  ("Antialiasing"      , AAMode)  
      
    If FullScreen
      ScreenMode$ = FullScreenMode$
    Else
      ScreenMode$ = WindowedScreenMode$
    EndIf
    
    RefreshRate = Val(StringField(ScreenMode$, 2, "@"))
    
    ScreenMode$ = StringField(ScreenMode$, 1, "@") ; Remove the refresh rate info, so we can parse it easily
    
    ScreenWidth  = Val(StringField(ScreenMode$, 1, "x"))
    ScreenHeight = Val(StringField(ScreenMode$, 2, "x"))
    ScreenDepth  = Val(StringField(ScreenMode$, 3, "x"))
    
    Screen3DRequester_FullScreen = FullScreen ; Global variable, for the Screen3DEvents
    
    Select AAMode
      Case 0:
        AntialiasingMode(#PB_AntialiasingMode_None)
      Case 1:
        AntialiasingMode(#PB_AntialiasingMode_x2)
      Case 2:
        AntialiasingMode(#PB_AntialiasingMode_x4)
      Case 3:
        AntialiasingMode(#PB_AntialiasingMode_x6)
    EndSelect
    
    If FullScreen
      result = OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "3D Demos", #PB_Screen_WaitSynchronization, RefreshRate)
    Else
      If OpenWindow(0, nWinX+0, 0, ScreenWidth, ScreenHeight+MenuHeight(), "PureBasic - 3D Demos", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
      
        CreateMenu(0, WindowID(#WINDOW_Screen3DRequester))
          MenuTitle("Project")
          MenuItem(0, "Quit")
    
          MenuTitle("About")
          MenuItem(1, "About...")
              
        result = OpenWindowedScreen(WindowID(#WINDOW_Screen3DRequester), nWinX+0, 0, ScreenWidth, ScreenHeight, 0, 0, 0)
      EndIf
    EndIf
    

    
    
  EndIf
     
  ProcedureReturn result
EndProcedure


Procedure Screen3DEvents()

  If Screen3DRequester_FullScreen = 0 ; Handle all the events relatives to the window..
  
    Repeat
      Event = WindowEvent()
      
      Select Event
      
        Case #PB_Event_Menu
          Select EventMenu()
          
            Case 0
              Quit = 1
          
            Case 2
              MessageRequester("Info", "Windowed 3D in PureBasic !", 0)
              
          EndSelect
             
        Case #PB_Event_CloseWindow
          Quit = 1
        
      EndSelect
      
      If Quit = 1 : End : EndIf  ; Quit the app immediately
    Until Event = 0
    
  EndIf
  
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_F1)
      Screen3DRequester_ShowStats = 1-Screen3DRequester_ShowStats ; Switch the ShowStats on/off
    EndIf
  EndIf
          
EndProcedure


Procedure Screen3DStats()
  If Screen3DRequester_ShowStats
    ; Nothing printed for now
  EndIf
EndProcedure


DataSection
  WindowedScreenDimensions:
    Data.l  320, 240
    Data.l  512, 384      
    Data.l  640, 480
    Data.l  800, 600     
    Data.l 1024, 768
    Data.l 1280, 1024
    Data.l 1600, 1200
EndDataSection
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Fenster im zweiten Monitor öffnen

Beitrag von ts-soft »

Wie wäre es mit EnableExplicit? Vermeidet solche dummen Fehler!

Ohne zu testen, aber nWinX sollte in keiner der Proceduren bekannt sein und wird somit wohl nicht genutzt,
bzw. immer 0 bleiben :wink:

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Skiller
Beiträge: 151
Registriert: 04.02.2005 22:26

Re: Fenster im zweiten Monitor öffnen

Beitrag von Skiller »

Hallo Thomas,

ich hoffe, Du hast die Sonne auch ein bischen genossen. :D
Danke erst mal für Deine schnelle Antwort. Du hattest wieder mal recht :oops: , nWinX war tatsächlich 0..Hätte ich natürlich direkt am openwindow checken müssen (bin wohl in letzter Zeit etwas durch den Wind, da ich wieder längere PB-Pause hatte, sorry). Nachdem ich aber nWinX Global gesetzt hatte und #PB_Window_ScreenCentered herausgenommen habe ( ich dachte er centert im 2 Moni automatisch) sind die Fenster -oh Wunder - tatsächlich im zweiten Monitor aufgetaucht. Allerdings sind keine 3D-Demos zu sehen, genauer gesagt nur das leere Fenster. Übrigens, OpenScreen() funzt hier nur im Hauptmonitor.

Ist es vielleicht gar nicht möglich, im 2. Moni 3D mit PB darzustellen?

Wenn doch, wäre ein kleines PBchen - bitte auch mit OpenScreen() - sehr hilfreich!! :praise:

Gruß Skiller
Antworten