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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

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

Message 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
Dernière modification par GallyHC le jeu. 12/mai/2016 21:09, modifié 4 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

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

Message 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.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message par microdevweb »

Merci Gally,

Ce code me sera très utilise pour SpeeDev
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

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

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre