Spostare o ridimensionare una finestra di un MessageBox

Da Gambas-it.org - Wikipedia.

Prenderemo in considerazione sia il caso di un MessageBox generato dal codice di un programma Gambas (come ad esempio un Message.Info() ), sia il caso di quello generato da un programma esterno.

Bisogna premettere che anche le finestrine di un qualunque MessageBox sono normali finestre, e che, pertanto, anch'esse posseggono un proprio PID.

Dagli esperimenti attualmente compiuti, è risultato che un MessageBox in talune circostanze - probabilmente legate al tipo di ambiente desktop grafico e/o al tema - non può essere spostato. In altri casi, quando il MessageBox viene generato dal codice Gambas, esso può essere spostato solo insieme con la finestra del programma padre.

E', invece, risultato possibile chiudere con il codice Gambas una finestra di un MessageBox comunque generato.

Prenderemo in considerazione, dunque, solo il caso di MessageBox che possono essere spostati e/o ridimensionati. Essi solitamente sono MessageBox generati da programmi esterni. Per ridimensionare e spostare le finestre di tali MessageBox, si potranno adoperare sia funzioni di Gambas che comandi bash.

Uso delle sole funzioni di Gambas

Faremo uso della Classe DesktopWindow e dei suoi metodi: potremo in modo particolare spostare e/o ridimensionare oppure chiudere la finestra del MessageBox.


Public Sub Button1_Click()  
 
 Dim dw As DesktopWindow  
 Dim i As Integer  
 
  With Desktop
' Si porrà il numero di "indice" della finestra del "MessageBox",
' per poter individuare il suo PID:
    i = .Windows[num_index].Id  
  End With  
 
  dw = New DesktopWindow(i)  
 
  With dw  
    .Move(x, y, w, h)
' ...ma si potranno anche usare:
  ' .Resize(w, h)  
  ' .Close
  End With  
 
End


Uso del comando xprop

Si potrà anche usare il comando bash "xprop" per individuare, in particolare, il PID della finestra del "MessageBox":

Private i As Integer


Public Sub Form_Open()    
  
 Dim pr As Process    
 Dim s As String  
 
 pr = Shell "xprop | grep XKLAVIER_STATE" For Read  
 
 While Not Eof(pr)      
   Input #pr, s  
' Individua il valore decimale della finestra del "MessageBox":
   If Eof(pr) Then i = CInt(s)  
 Wend  
 
End


Public Sub Button1_Click()  
 
 Dim dw As DesktopWindow  
 
 
 dw = New DesktopWindow(i)  
 
  With dw  
    .Move(x, y, w, h)
' ...ma si potranno anche usare:
  ' .Resize(w, h)  
  ' .Close
  End With
 
End


Spostare il MessageBox mediante Embedder

Un MessageBox, come qualsiasi altra finestra, potrà essere inglobato nell'oggetto Embedder.

Questa soluzione, dalle prove effettuate, consente, fra l'altro, di rinchiudere altrove un MessageBox, qualora non sia possibile spostarlo (come si è detto all'inizio).

In buona sostanza, dunque, otterremo lo spostamento del MessageBox inglobandolo all'interno dell'oggetto Embedder, che sarà stato posto nel Form del nostro programma.

Uso della Classe Desktop

Si potrà usare la Classe Desktop, attivando il componente gb.desktop. Ovviamente, si inserirà un oggetto Embedder sul Form dell'applicativo:

Public Sub Button1_Click()  
     
 Dim i As Integer  
     
   With Desktop  
' Qui va inserito il numero dell'indice della finestra del "MessageBox":
      i = .Windows[num_index].Id  
   End With  
     
      Embedder1.Embed(i)  
     
End  


Uso del comando xprop

Se si intende individuare manualmente la finestra del MessageBox da inglobare, si utilizzerà il comando xprop. Anche in questo caso, ovviamente, si inserirà un oggetto Embedder sul Form dell'applicativo:

Private i As Integer      
   
   
Public Sub Form_Open()      
   
 Dim pr As Process      
 Dim s As String    
   
  pr = Shell "xprop | grep XKLAVIER_STATE" For Read    
  
  While Not Eof(pr)        
    Input #pr, s    
' Individua il valore decimale della finestra del "MessageBox":
    If Eof(pr) Then i = CInt(s)    
  Wend    
  
End
 
 
Public Sub Button1_Click()  
 
   Embedder1.Embed(i)
 
End