CreateMenu

CreateMenu() creates a new menu and returns the handle.

Syntax

HMENU WINAPI CreateMenu();

Parameters

None

Return value

Handle to a newly created menu (HMENU).

AppendMenu

Appends a new item to the end of the specified menu bar, drop-down menu, submenu, or shortcut menu. You can use this function to specify the content, appearance, and behavior of the menu item.

Syntax

BOOL WINAPI AppendMenu(
        HMENU hMenu,
        UINT uFlags,
        UINT_PTR uIDNewItem,
        LPCTSTR lpNewItem
);

Parameters

  • hMenu (HMENU) A handle to the menu bar, drop-down menu, submenu, or shortcut menu to be changed.
  • uFlags (UINT) Controls the appearance and behavior of the new menu item. This parameter can be a combination of the following values. Value Meaning MF_BITMAP, MF_CHECKED, MF_DISABLED, MF_ENABLED, MF_GRAYED, MF_MENUBARBREAK, MF_MENUBREAK, MF_OWNERDRAW, MF_POPUP, MF_SEPARATOR, MF_STRING,MF_UNCHECKED
  • uIDNewItem (UINT_PTR) The identifier of the new menu item or, if the uFlags parameter is set to MF_POPUP, a handle to the drop-down menu or submenu.
  • lpNewItem (LPCTSTR) The content of the new menu item. The interpretation of lpNewItem depends on whether the uFlags parameter includes the following values. MF_BITMAP, MF_OWNERDRAW, MF_STRING

Return value

If the function succeeds, the return value is nonzero. If the function fails, the return value is zero/FALSE. To get extended error information, call GetLastError.

CreateMenu AppendMenu Demo Application screen shot

#include <windows.h>
#define IDM_FILE_NEW 1000
#define IDM_FILE_OPEN 1001
#define IDM_FILE_CLOSE 1002
#define IDM_FILE_EXIT 1003
#define IDM_HELP_ABOUT 1004

LRESULT CALLBACK WndProc(HWND hWnd,
                         UINT message, 
                         WPARAM wParam,
                         LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
  WNDCLASS wc;
  MSG msg;
  HWND hWnd;
  HMENU hMenu;

  ZeroMemory(&wc, sizeof(WNDCLASS));

  wc.style           = CS_HREDRAW | CS_VREDRAW;
  wc.lpfnWndProc     = (WNDPROC)WndProc;
  wc.hInstance       = hInstance;
  wc.hCursor         = LoadCursor(NULL, IDC_ARROW);
  wc.hbrBackground   = (HBRUSH)(COLOR_BACKGROUND);
  wc.lpszClassName   = (LPCTSTR)"MyDynMenuClass";


  RegisterClass(&wc);

   hWnd = CreateWindow("MyDynMenuClass", "Dynamic Menu", WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

  while (GetMessage(&msg, NULL, 0, 0)) 
  {
    DispatchMessage(&msg);
  }
  return 0;
}

HMENU hMainMenu;
HMENU hFileMenu;
HMENU hHelpMenu;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  int nSel;
  char * caption_menu[] = { "New", "Open", "Close", "Exit", "About"};
  char msg[50];
  switch (message) 
  {
    case WM_CREATE:
    {
      /* Creating our dynamic menu */
      hMainMenu = CreateMenu();
      hFileMenu = CreateMenu();
      hHelpMenu = CreateMenu();

      AppendMenu(hFileMenu, MF_BYPOSITION | MF_STRING, IDM_FILE_NEW, "New");
      AppendMenu(hFileMenu, MF_BYPOSITION | MF_STRING, IDM_FILE_OPEN, "Open");
      AppendMenu(hFileMenu, MF_BYPOSITION | MF_STRING, IDM_FILE_CLOSE, "Close");
      AppendMenu(hFileMenu, MF_BYPOSITION | MF_SEPARATOR, 0, NULL);
      AppendMenu(hFileMenu, MF_BYPOSITION | MF_STRING, IDM_FILE_EXIT, "Exit");

      AppendMenu(hHelpMenu, MF_BYPOSITION | MF_STRING,IDM_HELP_ABOUT, "About");
      AppendMenu(hMainMenu,MF_POPUP | MF_STRING,(UINT)hFileMenu, "File");
      AppendMenu(hMainMenu,MF_POPUP | MF_STRING,(UINT)hHelpMenu, "Help");
      
      SetMenu(hWnd, hMainMenu);
      break;
    }
    case WM_COMMAND:
    {
      if(wParam >= IDM_FILE_NEW && wParam <= IDM_HELP_ABOUT) {
        sprintf(msg, "Clicked on %s", caption_menu[wParam -IDM_FILE_NEW]);
        MessageBox(hWnd, msg, "Main Menu", MB_OK);
      }
      DefWindowProc(hWnd, message, wParam, lParam);
      break;
    }
    case WM_DESTROY:
    {
      /* Free menu handles */
      DestroyMenu(hHelpMenu);
      DestroyMenu(hFileMenu);
      DestroyMenu(hMainMenu);
      PostQuitMessage(0);
      break;
    }
    default:
      return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

About our authors: Team EQA

Further readings

Where is WinMain() function in MFC application ?

MFC hides WinMain in its framework and includes source file on WinMain(). This explains how framework calls global CWinApp::Initinstance() from entry WinMain.

What is the utility of CWinApp class?

This is constructed during global C++ objects are constructed and is already available when Windows calls the WinMain function, which is supplied by the ...

Basic steps in Win32 GUI Application with source code.

Define a custom Window class structure, Register the class name, CreateWindow, Show windows and write message get and dispatch loop statements. Define the Window CallBack procedure and write the handlers.

What is a Window CallBack procedure and what is its utility?

DispatchMessage() is a API which indirectly triggers the Window CallBack procedure. Message structure members from this function are passed to the CallBack procedure. CallBack procedure should implement event handlers depending on the need of the application.

What are LPARAM and WPARAM in window proc function?

LPARAM and WPARAM are the two parameters in Window CallBack procedure. They signifies parameters of various events. They are used in handing individual events.

What are the basic steps of a typical MFC based application?

We need to write WinMain and need to follow all these in a Win32 application. However we need not to write much if we are writing an application with MFC ...

#