Send a suggestion!

We're building a brand new version of the site, and we'd love to hear your ideas

Members

Technology Zones

IBM Learning Center

Articles

Hosted By

MaximumASP

Info

Rated
Read 32,159 times

Contents

Related Categories

Subclassing - Using messages - MENU STATUS

Using messages - MENU STATUS

Another example is giving status messages when the mouse cursor is over a menu item. This time, windows sends a WM_MENUSELECT message. Make sure your Form is named Form1 and you have a label called lblSel before starting.

'// extra constants and windows api
Public Const MF_BYCOMMAND = &H0&
Public Const MF_BYPOSITION = &H400&
Public Const MF_POPUP = &H10&
Public Const WM_MENUSELECT = &H11F

Declare Function GetMenuString Lib "user32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long

Public Function WindowProc(ByVal hWnd As Long, ByVal iMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
    '// ----WARNING----
    '// do not attempt to debug this procedure!!
    '// ----WARNING----

    '// this is our implementation of the message handling routine
    '// determine which message was recieved
    Select Case iMsg
    Case WM_MENUSELECT
        '// This occurs when the menu is being closed
        If lParam = 0 Then Exit Function
        '// variables
        Dim MenuItemStr As String * 128
        Dim MenuHandle As Integer
        '// Get the low word from wParam: this contains the command ID or position of the menu entry
        MenuHandle = GetLowWord(wParam)
       
        '//If the highlighted menu is the top of a poup menu, pass menu item by position
        If (GetHighWord(wParam) And MF_POPUP) = MF_POPUP Then
           
            '//Get the caption of the menu item
            If GetMenuString(lParam, MenuHandle, MenuItemStr, 127, MF_BYPOSITION) = 0 Then Exit Function
           
        Else '// Otherwise pass it by command ID
           
            '//Get the caption of the menu item
            If GetMenuString(lParam, MenuHandle, MenuItemStr, 127, MF_BYCOMMAND) = 0 Then Exit Function
           
        End If
        '// return item to label to remove any nulls
        Form1.lblSelItem = MenuItemStr
        '// display a message in a label
        Select Case Form1.lblSelItem
        Case "Item 1"
            Form1.lblSelItem = "Adds a Font"
        Case Else
             Form1.lblSelItem = "Item Unknown: " & Form1.lblSelItem
        End Select
    Case Else
        '// pass all messages on to VB and then return the value to windows
        WindowProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam)
    End Select
End Function

Public Function GetLowWord(Word As Long)
   GetLowWord = CInt("&H" & Right$(Hex$(Word), 4))
End Function

Public Function GetHighWord(Word As Long)
    GetHighWord = CInt("&H" & Left$(Hex$(Word), 4))
End Function

James first started writing tutorials on Visual Basic in 1999 whilst starting this website (then known as VB Web). Since then, the site has grown rapidly, and James has written numerous tutorials, articles and reviews on VB, PHP, ASP and C#. In October 2003, James formed the company Developer Fusion Ltd, which owns this website, and also offers various development services. In his spare time, he's a 3rd year undergraduate studying Computer Science in the UK. He's also a Visual Basic MVP.

Comments

  • GetLowWord() and GetHighWord()

    Posted by HyperHacker on 25 Feb 2004

    Pretty hacky functions... Try these:

    [code]Public Function GetLowWord(Word As Long) as Long
    GetLowWord = Word Mod 65536
    End Function

    Public Function GetHighWord(Word As Long)
    GetHighWo...

  • Mr. Crowley copies source code!

    Posted by alpine on 08 Aug 2003

    Hummmm..... This code looks surprisingly like the code in the GETMINMAXINFO example at http://www.mvps.org/vbvision/ Right down to the *exact* same comments! Coincidence? You be the judge!

  • Posted by James Crowley on 07 Mar 2003

    http://www.vbaccelerator.com/home/VB/Code/Libraries/Subclassing/SSubTimer/article.asp

  • link not working

    Posted by gautam on 07 Mar 2003

    the link [b]Download the SSubTmr project code (no DLL) (9kb) [/b] not working.