Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] Always on Top

Ho creato una form che deve rimanere sempre in primo piano.
Il problema č che per fare questo non puň essere MDI child e quindi rimane
in primo piano rispetto a tutte le finestre.
Esiste un modo per rendere una form sempre in primo piano ma solo
relativamente ad un MDI child?
( nell'applicazione č possibile che ci siano piů form MDI aperti)
-- 
Roberto Ukmar
Indis S.p.A.

 ha scritto nel messaggio
news:6SeKc.85796$G%.71900@tornado.fastwebnet.it...

MDI che deve essere in primo piano
Form.Zorder
MDI che devono essere in secondo piano
Form.Zorder 1
Ciao

 relativamente ad un MDI child?
Se deve esserlo solo rispetto a un form è molto semplice:
frmOnTop.Show vbModeLess, frmOwnerForm
Se deve esserlo rispetto a tutta l'app devi usare la funzione API
SetWindowPos()
Ciao
--
NeoDataType : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 Ciao
Ho la seguente procedura che usa già l'API da te indicata. Il problema è che
la finestra non deve essere MDI child (altrimenti l'API non fa niente) e in
questo modo la finestra rimane on top di tutto e non solo dell'applicazione.
Sub SetAlwaysOnTopMode(hwnd As Long, Optional ByVal OnTop As Boolean = True)
   Me.Top = (SPACE000.Top + SPACE000.Height) - Me.Height
   Me.Left = (SPACE000.Left + SPACE000.Width) - Me.Width
   SetWindowPos hwnd, IIf(OnTop, HWND_TOPMOST, HWND_NOTOPMOST), 0, 0, 0, 0,
SWP_NOSIZE Or                                             SWP_SHOWWINDOW Or
SWP_NOMOVE
End Sub
Grazie


 questo modo la finestra rimane on top di tutto e non solo
dell'applicazione.
Se il problema è quello di avere il form che sia On top solo dell'
applicazione puoi intercettare il messaggio WM_ACTIVATEAPP tramite il
parametro wParam della procedura di CallBack ricavi se la tua applicazione è
stata attivata (=valore non zero) o disattivata (=0), quindi imposti la tua
finestra OnTop nel primo caso e normale nel secondo.
Chiaramente lo devi fare con un form normale non MDIChild
Ciao

Grazie, ci provo.


 Grazie, ci provo.
Se ti puo aiutare ecco una prova al volo che funziona, due form (Form1 e
Form2), riferimento alla MsgHook.dll (è freeware), il form2 viene messo ON
Top, se clicchi su un'altra applicazione il form2 và in secondo piano,
appena clicchi su form2 o su form1, form2 ritorna On-Top.
(devi compilare il progetto per provarlo bene)
(Tutto in Form1)
Option Explicit
Private WithEvents cMsg As MsgHook
'
Const WM_ACTIVATEAPP = &H1C
'
Const HWND_TOPMOST = -1
Const HWND_NOTOPMOST = -2
Const SWP_NOSIZE = &H1
Const SWP_NOMOVE = &H2
Const SWP_NOACTIVATE = &H10
Const SWP_SHOWWINDOW = &H40
'
Private Declare Sub 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)
Private Sub cMsg_AfterMessage(ByVal hWnd As Long, ByVal uMsg As Long, _
    ByVal wParam As Long, ByVal lParam As Long, retValue As Long)
    If uMsg = WM_ACTIVATEAPP And hWnd = Me.hWnd Then
        If wParam = 0 Then
            'Applicazione disattivata
            SetWindowPos Form2.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, _
                SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
        Else
            'Applicazione attivata
            SetWindowPos Form2.hWnd, HWND_TOPMOST, 0, 0, 0, 0, _
                SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
        End If
    End If
End Sub
'
Private Sub Form_Load()
    '
    Form2.Show
    SetWindowPos Form2.hWnd, HWND_TOPMOST, 0, 0, 0, 0, _
        SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
    '
    Set cMsg = New MsgHook
    cMsg.StartSubclass Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
    SetWindowPos Form2.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, _
        SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
    Unload Form2
    '
    cMsg.StopSubclass
    Set cMsg = Nothing
End Sub

     cMsg.StopSubclass
Da dove arriva 'sta roba?
Mi sembra di vedere il codice della mia adHook (anche il nome è simile!)
pubblicato sul sito comune.



Copia -> Incolla -> Rename!!! ;-)
Ciao, Vincenzo

 Ciao
Ciao

 Ciao, Vincenzo
Ehm... no...
Progetto->Riferimenti -> MsgHook.dll  di Karl E.Peterson
http://www.mvps.org/vb/index2.html?controls.htm
Ho fatto un esempio funzionante con un componente freeware che permette di
eseguire il subclass semplicemente, avrei potuto usare quella di Bruce
McKinney (SubTimer), quella di Steve McMahon ispirata a quella McKinney
(SSubTimer) o anche quella di Zanna o un' altra scritta da me, ma non
avrebbe fatto alcuna differenza visto che non si parlava di come realizzare
il Subclassing ma di come risolvere un problema, secondo me, con il
subclassing e non mi sembrava il caso di scrivere un componente apposta per
l' esempio o postarne uno ;-)
Non è mia abitudine fare il Rename di componenti altrui, se mi piacciono li
utilizzo nella loro versione originale, se hanno qualche cosa che ritengo
migliorabile la comunico all' autore ed, eventualmente, utilizzo la versione
da lui migliorata,  diversamente me lo scrivo come pare a me d'accapo.
E' vero, sono nuovo del NG., ma non vi sembra di essere un pochino prevenuti
? Il codice che ho postato, forse, risolve il problema di Ukmar non è questo
lo scopo del NG?
Ciao