Newsgroup: it.comp.lang.visual-basic
Titolo: Come ottenere una finestra "Always on Top" con Visual Basic 5.0 (quindi anche 6 probabilmente)

Salve a tutti! Non ho mai scritto su questo newsgroup, perchè ho cominciato
a usare il Visual Basic da un paio di settimane (però avendo già una certa
pratica con altri linguaggi ho acquisito rapidamente gli elementi del
linguaggio: è molto semplice dopotutto :D).
Volevo mettere in comune con tutti una cosa che mi ha fatto penare per due
giorni: cioè come ottenere una finestra "Always on Top" (cioè che rimane a
Zorder 0 (in foreground insomma) anche se è disattivata).
In Visual Basic non c'è una flag "nativa" impostabile (che io sappia
almeno), però è possibile dare al form la proprietà always on top in questo
modo:
in questo esempio (preso da un mio programma realizzato e funzionante), il
form si chiama MainForm
Questa parte va nelle dichiarazioni:
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long,
ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As
Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const WS_EX_TOPMOST = &H8&
Const HWND_TOPMOST = -1
Bisogna importare dalla user32 (Win32API) la API SetWindowPS, che prende
come argomento finale ByVal wFlags, che è un indicatore di stile. A noi
serve lo stile WS_EX_TOPMOST (cioè "Always on top") e infatti va importata
la costante (questi valori sono tutti trovati con l'API Text Viewer di VB 5
Enterprise, non so cosa ci sia nelle altre versioni) relativa proveniente
dalle API.
Inoltre ci serve HWND_TOPMOST, che va messo quale valore per
hWndInsertAfter. Dato che SetWindowPos vuole sapere _dove_ va messa la
finestra, noi gli diremo -1, per piazzarla a uno Zorder cmq "più in
foreground" degli altri (dato che il minimo per le non-topmost è 0).
E questo per le dichiarazioni.
Poi, nell'evento Load del Form, chiamate SetWindowPos così:
Public Sub Form_Load()
If SetWindowPos(MainForm.hwnd, HWND_TOPMOST, MainForm.ScaleTop,
MainForm.ScaleLeft, MainForm.ScaleWidth, MainForm.ScaleHeight,
WS_EX_TOPMOST) <> 0 Then
    Dim ex As Byte
    ex = 1
End If
la variabile ex è un contenitore per controllare gli errori, dato che
SetWindowPos restituisce 0 se non è riuscita a lavorare, <> 0 se ha avuto
successo (e in condizioni normali, ha sempre successo, quindi non ha bisogno
di gestori d'errore). L'ho dichiarata byte perchè così è solo una banale var
locale piccolissima.
Accertatevi, nelle Form Properties, di impostare lo ScaleMode a 3, ovvero
pixel (altrimenti rischiate che SetWindowPos vi disegni una finestra
enorme).
Con queste poche righe (e farle funzionare non è stato facile, grazie agli
help molto poco friendly per queste cose) potrete ottenere una finestra
"Always on Top" anche in Visual Basic.
Spero sia utile a qualcuno.
Ninja

Zorder 0 (in foreground insomma) anche se è disattivata).
[...]
Grazie per l'ottimo proposito di condividere i tuoi sforzi.
Il modo migliore per farlo in maniera "permanente" è di inviare il codice
utile al webmaster del sito comune.
Controlla sempre però che non ci sia già pubblicata una funzione analoga.
Ciao
Il sito comune di it.comp.lang.visual-basic
http://www.murialdo.it/it_lang_vb/
P.S. prima di impazzire ancora per sviluppare una routine cercala partendo
dai links sul mio sito: qualcuno probabilmente l'ha già fatta! :-)
---
--
-
MIX (VB5SP3)
170 links a siti VB
http://www.tempolibero.com/user/mix/
http://space.tin.it/computer/gaais/
-
--
---

Zorder 0 (in foreground insomma) anche se è disattivata).
Senza toglierti nulla... ma se andavi sul sito comune sezione "piccole
perle", c'era scritto come fare :-)
(sopratutto risparmiavi un po' di prezioso tempo :-)
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb

Anche il cd di vb5 ha un bell'esempio di splashscreen always on top con
tante cose carine all'interno...
perchč sono cosě pochi coloro che lo sfogliano? E sě, anche qui ci sono
quelli che piuttosto di aprire il vocabolario preferiscono copiare dal
vicino...
Il pensierino naturalmente non č rivolto a chi ha iniziato il thread.
Ciao Marco.
-- 
Remove xxx from E-mail.


Non conoscevo il vostro sito, e comunque mi piace fare da solo :D
Ninja