SubAbout




Option Explicit
Declare Function AppendMenu Lib "user32" Alias _
"AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, _
ByVal wIDNewItem As Long, ByVal lpNewItem As String) As Long
Declare Function GetSystemMenu Lib "user32" _
(ByVal hWnd As Long, ByVal bRevert As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex _
As Long, ByVal dwNewLong As Long) As Long
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 Const WM_SYSCOMMAND = &H112
Public Const MF_SEPARATOR = &H800&
Public Const MF_STRING = &H0&
Public Const GWL_WNDPROC = (-4)
Public Const IDM_ABOUT As Long = 1010
Public lProcOld As Long
Public Function SysMenuHandler(ByVal hWnd As Long, ByVal _
iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) _
As Long
If iMsg = WM_SYSCOMMAND Then
If wParam = IDM_ABOUT Then
MsgBox "About . . .", vbInformation, "About"
Exit Function
End If
End If
SysMenuHandler = CallWindowProc(lProcOld, hWnd, iMsg, _
wParam, lParam)
End Function

Public Function SubClass(FormName As Form)
Dim lhSysMenu As Long, lRet As Long
lhSysMenu = GetSystemMenu(FormName.hWnd, 0&)
lRet = AppendMenu(lhSysMenu, MF_SEPARATOR, 0&, vbNullString)
lRet = AppendMenu(lhSysMenu, MF_STRING, IDM_ABOUT, "About...")
FormName.Show
lProcOld = SetWindowLong(FormName.hWnd, GWL_WNDPROC, _
AddressOf SysMenuHandler)
End Function

'4. Apri la finestra del codice del form1 e digita il

'seguente codice

Private Sub Form_Load()
Dim d As String
d = SubClass(Form1) ' Digita il nome del form _
d = SubClass(<FormName>)
End Sub

Private Sub Form_Unload(Cancel As Integer)
SetWindowLong Me.hWnd, GWL_WNDPROC, lProcOld
End Sub

'5.Io ho cambiato il codice a operare con qualsiasi form

'specificando il nome del form dove ho commentato il codice

'6.Fai partire il progetto cliccando su run nella toolbar

'oppure dal menu' run.

'Se tu fai clic sul menu' di controllo puoi vedere due

'items. Uno e' un separatore e l'altro recita

'About...'. Clicca su about e un message box appare con

'il mio copyright.

Questa settimana voglio mostrarvi come fare qualche cosa
che ho sempre cercato di fare. Mi ricordo leggendo numerose
riviste con una simile questione, ma tutti giustamente
affermavano che non e' possibile in Visual Basic, bene io ho
trovato una soluzione a questo problema che include il
sub-classing realizzato nelle ultime settimane.

Nota del curatore:
Questa tips funziona solo in Visual Basic 5,
in quanto la precedente versione di VB non supporta
l'operatore AddressOf.
1. Inizia un nuovo progetto Standard-Exe,
form1 e' creato per default.
2. Aggiungi un modulo standard nel progetto,
menu' progetto e clicca "aggiungi modulo"
3. Il nuovo modulo deve aprirsi per default.
Aggiungi il seguente codice.










( subabout.html )- by Paolo Puglisi - Modifica del 17/12/2023