Spostare o ridimensionare una finestra di un MessageBox
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, un MessageBox può essere spostato individualmente solo se non è generato dal codice del nostro applicativo Gambas. Se per esempio creiamo un programmino che compie un errore - ad esempio una divisione per zero -, quando la procedura incontra tale richiesta di divisione, essa solleverà un errore facendo apparire un MessageBox. In questo caso sarà possibile effettuare lo spostamento.
Se un programma Gambas prevede che venga mostrato ad esempio un Message.Info, sarà impossibile spostare tale MessageBox o modificarne le dimensioni.
Sarà, invece, possibile chiudere con il codice Gambas anche una finestra di un MessageBox, sia se generato dal codice da un applicativo Gambas, sia
Prenderemo in considerazione, dunque, solo il caso di MessageBox generati da programmi esterni. Per ridimensionare e spostare tali finestrine, si potranno adoperare sia funzioni di Gambas, sia comandi bash.
Indice
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, che, qualora non sia possibile spostare un particolare MessageBox (come abbiamo visto nei paragrafi precedenti), allora lo si possa rinchiudere.
In buona sostanza, dunque, otterremo lo spostamento del MessageBox inglobandolo all'interno dell'oggetto Embedder, che sarà stato posto all'interno del nostro programmino.
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