Seite 1 von 1

Fenster im zweiten Monitor öffnen

Verfasst: 05.03.2013 15:14
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

Re: Fenster im zweiten Monitor öffnen

Verfasst: 05.03.2013 15:59
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

Re: Fenster im zweiten Monitor öffnen

Verfasst: 05.03.2013 18:11
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