Windows API Guide: GetWindowText Function


Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii As MENUITEMINFO) As Long

Platforms

  • Windows 95: Supported.
  • Windows 98: Supported.
  • Windows NT: Requires Windows NT 4.0 or later.
  • Windows 2000: Supported.
  • Windows CE: Not Supported.

Description & Usage

InsertMenuItem adds a menu item to a menu that already exists. The new item can be inserted at any point in the menu. If the menu is a regular menu, then the window it belongs to will receive a WM_COMMAND message whenever the menu item is selected. If the menu is a window's system menu, then the window receives the WM_SYSCOMMAND message instead.

Also, when adding an item to a window's system menu, be sure that the new item's unique menu item identifier is less than &HF000. All identifiers greater than that are reserved for items that the system places there (such as Restore, Minimize, etc.).

Return Value

If successful, the function returns a non-zero value. If an error occured, the function returns 0 (use GetLastError to get the error code).

Visual Basic-Specific Issues

When using InsertMenuItem to add something to a menu, keep in mind that there is no way for Visual Basic to create an event handler to run when the item is selected. Instead, it is necessary to create a WindowProc window procedure to manually process the WM_COMMAND or WM_SYSCOMMAND messages that the menu item may send. See the example below for a demonstration of how to accomplish this.

Parameters

hMenu
A handle to the menu to add a new item to.
uItem
Identifies the existing menu item that appears immediately before the point where you want to add the new item. This could be either a position or a menu item identifier, depending on fByPosition.
fByPosition
If this is a non-zero value, uItem indicates the existing item by using its zero-based position. (For example, the first item in the menu has a position of 0.) If this is zero, then uItem is the unique menu item identifier of the existing item.
lpmii
Describes the menu item to be added.

Example

' This code is licensed according to the terms and conditions listed here. ' Declarations and such needed for the example: ' (Copy them to the (declarations) section of a module.) ' There's quite a few declarations for this example, but it's worth it! Public Declare Function GetSystemMenu Lib "user32.dll" (ByVal hWnd As Long, ByVal bRevert _ As Long) As Long Public Declare Function GetMenuItemCount Lib "user32.dll" (ByVal hMenu As Long) As Long Public Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As Long End Type Public Const MIIM_STATE = &H1 Public Const MIIM_ID = &H2 Public Const MIIM_TYPE = &H10 Public Const MFT_SEPARATOR = &H800 Public Const MFT_STRING = &H0 Public Const MFS_ENABLED = &H0 Public Const MFS_CHECKED = &H8 Public Declare Function InsertMenuItem Lib "user32.dll" Alias "InsertMenuItemA" (ByVal _ hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii _ As MENUITEMINFO) As Long Public Declare Function SetMenuItemInfo Lib "user32.dll" Alias "SetMenuItemInfoA" (ByVal _ hMenu As Long, ByVal uItem As Long, ByVal fByPosition As Long, lpmii _ As MENUITEMINFO) As Long Public Declare Function SetWindowPos Lib "user32.dll" (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 Const HWND_TOPMOST = -1 Public Const HWND_NOTOPMOST = -2 Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd _ As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Const GWL_WNDPROC = -4 Public Declare Function CallWindowProc Lib "user32.dll" 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 WM_INITMENU = &H116 ' Add an option to make window Form1 "Always On Top" to the bottom of its system ' menu.  A check mark appears next to this option when active.  The menu item acts as a toggle. ' Note how subclassing the window is necessary to process the two messages needed ' to give the added system menu item its full functionality. ' *** Place the following code in a module. *** Public pOldProc As Long  ' pointer to Form1's previous window procedure Public ontop As Boolean  ' identifies if Form1 is always on top or not ' The following function acts as Form1's window procedure to process messages. Public Function WindowProc (ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam _ As Long, ByVal lParam As Long) As Long Dim hSysMenu As Long     ' handle to Form1's system menu Dim mii As MENUITEMINFO  ' menu item information for Always On Top Dim retval As Long       ' return value Select Case uMsg Case WM_INITMENU ' Before displaying the system menu, make sure that the Always On Top ' option is properly checked. hSysMenu = GetSystemMenu(hwnd, 0) With mii ' Size of the structure. .cbSize = Len(mii) ' Only use what needs to be changed. .fMask = MIIM_STATE ' If Form1 is now always on top, check the item. .fState = MFS_ENABLED Or IIf(ontop, MFS_CHECKED, 0) End With retval = SetMenuItemInfo(hSysMenu, 1, 0, mii) WindowProc = 0 Case WM_SYSCOMMAND ' If Always On Top (ID = 1) was selected, change the on top/not on top ' setting of Form1 to match. If wParam = 1 Then ' Reverse the setting and make it the current one. ontop = Not ontop retval = SetWindowPos(hwnd, IIf(ontop, HWND_TOPMOST, HWND_NOTOPMOST), _ 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) WindowProc = 0 Else ' Some other item was selected.  Let the previous window procedure ' process it. WindowProc = CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam) End If Case Else ' If this is some other message, let the previous procedure handle it. WindowProc = CallWindowProc(pOldProc, hwnd, uMsg, wParam, lParam) End Select End Function ' *** Place the following code inside Form1. *** ' When Form1 loads, add Always On Top to the system menu and set up the ' new window procedure. Private Sub Form_Load() Dim hSysMenu As Long     ' handle to the system menu Dim count As Long        ' the number of items initially on the menu Dim mii As MENUITEMINFO  ' describes a menu item to add Dim retval As Long       ' return value ' Get a handle to the system menu. hSysMenu = GetSystemMenu(Form1.hWnd, 0) ' See how many items are currently in it. count = GetMenuItemCount(hSysMenu) ' Add a separator bar and then Always On Top to the system menu. With mii ' The size of the structure. .cbSize = Len(mii) ' What parts of the structure to use. .fMask = MIIM_ID Or MIIM_TYPE ' This is a separator. .fType = MFT_SEPARATOR ' It has an ID of 0. .wID = 0 End With ' Add the separator to the end of the system menu. retval = InsertMenuItem(hSysMenu, count, 1, mii) ' Likewise, add the Always On Top command. With mii .fMask = MIIM_STATE Or MIIM_ID Or MIIM_TYPE ' This is a regular text item. .fType = MFT_STRING ' The option is enabled. .fState = MFS_ENABLED ' It has an ID of 1 (this identifies it in the window procedure). .wID = 1 ' The text to place in the menu item. .dwTypeData = "&Always On Top" .cch = Len(.dwTypeData) End With ' Add this to the bottom of the system menu. retval = InsertMenuItem(hSysMenu, count + 1, 1, mii) ' Set the custom window procedure to process Form1's messages. ontop = False pOldProc = SetWindowLong(Form1.hWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub ' Before unloading, restore the default system menu and remove the ' custom window procedure. Private Sub Form_Unload(Cancel As Integer) Dim retval As Long  ' return value ' Replace the previous window procedure to prevent crashing. retval = SetWindowLong(Form1.hWnd, GWL_WNDPROC, pOldProc) ' Remove the modifications made to the system menu. retval = GetSystemMenu(Form1.hWnd, 1) End Sub

Category

Menus

Back to the Function list.
Back to the Reference section.


Last Modified: June 4, 2000
This page is copyright © 2000 Paul Kuliniewicz. Copyright Information Revised October 29, 2000
Go back to the Windows API Guide home page.
E-mail: vbapi@vbapi.com Send Encrypted E-Mail
This page is at http://www.vbapi.com/ref/i/insertmenuitem.html



Windows API Guide
Windows API Guide - Reference - Volume 1: Version 3.0 For the MS-DOS and PC-DOS Operating Systems
ISBN: B001V0KQIY
EAN: N/A
Year: 1998
Pages: 610

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net