Newsgroup: it.comp.lang.visual-basic
Titolo: [?] «Sempre in primo piano» nel menu della form

Grazie al sito del newsgroup ho trovato la funzione che porta in primo piano
un form. Adesso però mi sorge un problema.
Volevo includere il comando "sempre in primo piano" nel menu della finestra
(praticamente dove ci sono "ingrandisci", "riduci a icona", "ripristina",
"chiudi" ecc.)... come posso fare?
(Mi viene a mente che lo fanno il WinZip e l'ACDSee, ma sinceramente non
penso siano scritti in VB...)
Raffaele
 
def...@nxd.it


Facile...
1) Aggingi un separatore e un nuovo menu item al systemmenu
2) Dai un ID al nuovo menuitem per gestire il nuovo messaggio
3) Assegni alla form una nuova WindProc
4) Quando arriva il messaggio WM_SYSCOMMAND e il menu clickato e
ID_PRIMOPIANO, verifichi lo stato precedente, cambi lo stato del menuitem e
lo stato della finestra in relazione allo stato precedente.
Vabe.. lo so, vuoi il codice.... ^^;;
In una form metti:
Option Explicit
Private Sub Form_Load()
    hSysMenu = GetSystemMenu(Me.hwnd, False)
    AppendMenu hSysMenu, MF_SEPARATOR, False, vbNullString
    AppendMenu hSysMenu, MF_STRING, ID_PRIMOPIANO, "&Sempre in primo piano"
    statoPrimoPianoMenu = Unchecked
    processoOriginale = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf
nuovoProcesso)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    SetWindowLong Me.hwnd, GWL_WNDPROC, processoOriginale
End Sub
In un modulo bas:
Option Explicit
Enum CHECK
    Checked
    Unchecked
End Enum
Public processoOriginale As Long
Public Const ID_PRIMOPIANO = 1
Public hSysMenu As Long
Public statoPrimoPianoMenu As CHECK
Public Const WM_SYSCOMMAND = &H112
Public Const MF_SEPARATOR = &H800&
Public Const MF_STRING = &H0&
Public Const GWL_WNDPROC = (-4)
Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const MF_CHECKED = &H8&
Public Const MF_UNCHECKED = &H0&
Public Const MF_BYCOMMAND = &H0&
Public Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long,
ByVal bRevert As Long) As Long
Public Declare Function AppendMenu Lib "user32" Alias "AppendMenuA" (ByVal
hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal
lpNewItem As Any) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Public 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
Public Declare Function CheckMenuItem Lib "user32" (ByVal hMenu As Long,
ByVal wIDCheckItem As Long, ByVal wCheck As Long) As Long
Public Function nuovoProcesso(ByVal hwnd As Long, ByVal iMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
    If iMsg = WM_SYSCOMMAND Then
        Select Case wParam
            Case ID_PRIMOPIANO
                Dim xPos As Integer
                Dim yPos As Integer
                xPos = Form1.Left / Screen.TwipsPerPixelX
                yPos = Form1.Top / Screen.TwipsPerPixelY
                If statoPrimoPianoMenu = Checked Then
                    CheckMenuItem hSysMenu, ID_PRIMOPIANO, MF_BYCOMMAND Or
MF_UNCHECKED
                    SetWindowPos Form1.hwnd, HWND_NOTOPMOST, xPos, yPos, 0,
0, 1
                    statoPrimoPianoMenu = Unchecked
                Else
                    CheckMenuItem hSysMenu, ID_PRIMOPIANO, MF_BYCOMMAND Or
MF_CHECKED
                    SetWindowPos Form1.hwnd, HWND_TOPMOST, xPos, yPos, 0, 0,
1
                    statoPrimoPianoMenu = Checked
                End If
        End Select
    End If
    nuovoProcesso = CallWindowProc(processoOriginale, hwnd, iMsg, wParam,
lParam)
End Function
Bye

Ehm, io sono un novellino di VB e praticamente per me C è una lettera
dell'alfabeto...
Quando ho visto la prima parte del messaggio stavo già prendendo una flebo
:)
Grazie mille, proverò quello che mi hai scritto :)
