Page 1 sur 1

Savoir sur qu'elle ecran est une fenêtre et basculement.

Publié : jeu. 12/mai/2016 13:56
par GallyHC
Bonjour,

Prérequis : Il faut avoir au mini deux écrans en mode étendu.

Voilà, un petit code qui permet de savoir sur quel écran se trouve une fenêtre. Ce code permet de « balancer » aussi la fenêtre d’un écran à un autre avec un simple bouton. Il y a u petit exemple pour montrer comment cela fonctionne.

Le code :

Code : Tout sélectionner

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

DisableASM
EnableExplicit

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
;
; INITIALISATION STRUCTURE, VARIABLES...
;

#MONITOR_MAX_SUPPORTED           = 6

Structure desktops
  number.l
  bmonitor.b
  DesktopWidth.i [#MONITOR_MAX_SUPPORTED]
  DesktopHeight.i[#MONITOR_MAX_SUPPORTED]
EndStructure

Global sysdesktops.desktops

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
;
; INITIALISATION ET RECHERCHE DES ECRANS.
;

Procedure WindowMonitorScan()
;
; ROUTINE DE RECHERCHE DES ECRANS (DESKTOP).
;
  Protected.i i
  
  sysdesktops\number    = ExamineDesktops()
  sysdesktops\bmonitor  = #False
  If sysdesktops\number > 0
    If sysdesktops\number > 1
      sysdesktops\bmonitor = #True
    EndIf
    If sysdesktops\number > #MONITOR_MAX_SUPPORTED
      sysdesktops\number = #MONITOR_MAX_SUPPORTED
    EndIf
    For i=0 To sysdesktops\number - 1
      sysdesktops\DesktopWidth[i]   = DesktopWidth(i)
      sysdesktops\DesktopHeight[i]  = DesktopHeight(i)
    Next i
  EndIf

EndProcedure

Procedure WindowMonitorFind(window.i)
;
; ROUTINE DE RECHERCE DE LA FENETRE SUR L'ECRAN.
;
  Protected.i i, fullresx, fullwinx, number = 1
  Protected.i borderx = (WindowWidth(window, #PB_Window_FrameCoordinate) - WindowWidth(window, #PB_Window_InnerCoordinate))
  ;
  If GetWindowState(window) = #PB_Window_Maximize
    fullwinx = WindowX(window) + borderx
  Else
    fullwinx = WindowX(window)
  EndIf
  ;
  If sysdesktops\number > 1
    If fullwinx > sysdesktops\DesktopWidth[0]
      For i=0 To sysdesktops\number - 1
        fullresx + sysdesktops\DesktopWidth[i]
        If fullwinx - fullresx > 0
          number = sysdesktops\number - i
        EndIf
      Next i
    EndIf
  EndIf
  ProcedureReturn number

EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
;
; ROUTINE POUR BASCULER LES FENÊTRES.
;

Procedure WindowMonitorChange(window.i)
;
; ROUTINE DE DEPLACEMENT LA FENÊTRE VERS L'ECRAN. 
;
  Protected.i i, mx, px
  Protected.i max = GetWindowState(window)
  Protected.i win = WindowMonitorFind(window)
  Protected.i wmv = WindowMonitorFind(window) % sysdesktops\number
  ;
  If sysdesktops\number > 1
    For i=0 To win - 2
      mx + sysdesktops\DesktopWidth[i]
    Next i
    For i=0 To wmv - 1
      px + sysdesktops\DesktopWidth[i]
    Next i
    ;
    ResizeWindow(window, px + (WindowX(window) - mx), #PB_Ignore, #PB_Ignore, #PB_Ignore)
    ;
    If max = #PB_Window_Maximize
      SetWindowState(window, #PB_Window_Maximize)  
    EndIf
  EndIf
    
EndProcedure

WindowMonitorScan()

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
;
; 'MAIN', ROUTINE D'EXEMPLE DU PROGRAMME.
;

If OpenWindow(0, 0, 0, 220, 100, "Exemple...",  #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  Define.i event, bClose   = ButtonGadget(#PB_Any, 0, 0, 40, 20, "change")
  ;
  ;
  Debug WindowMonitorFind(0) ; sur qu'elle ecran?
  ;
  ;
  Repeat
    event = WaitWindowEvent()
    Select event
      Case #PB_Event_Gadget
        If EventGadget() =  bClose
          WindowMonitorChange(0)
          Debug WindowMonitorFind(0)
        EndIf    
      Case #PB_Event_MoveWindow
        Debug WindowMonitorFind(0) ; sur qu'elle ecran, vu que l'on a bouge la fenêtre?
    EndSelect
  Until event = #PB_Event_CloseWindow
EndIf
Cordialement,
GallyHC

Re: Savoir sur qu'elle ecran est une fenêtre et basculer.

Publié : jeu. 12/mai/2016 13:59
par falsam
Très intéressant ce code pour savoir sur quel moniteur l'application se trouve et redimensionner le full screen d'une application par exemple. Merci beaucoup Gally et bravo pour ce code.

Re: Savoir sur qu'elle ecran est une fenêtre et basculement.

Publié : sam. 14/mai/2016 9:39
par microdevweb
Merci Gally,

Ce code me sera très utilise pour SpeeDev

Re: Savoir sur qu'elle ecran est une fenêtre et basculement.

Publié : sam. 14/mai/2016 15:31
par Kwai chang caine
Je n'ai actuellement qu'un ecran, mais c'est vrai que ce peut être un code très utile, merci du partage 8)