Menu items are vital part when dealing with a big functional application. Application can have large numbers of sections and categories. Menu resources makes it possible to link different sections together. User can navigate different subsections ans can access different dialogs. Menu items are static resources. they can be constructed by resource editor. Insert new menu resource and give a name of the menu. Now add sub items and add IDs.

LoadMenu

LoadMenu() loads menu resource from executable and returns the handle to the menu.

Syntax

HMENU WINAPI LoadMenu(LPCSTR strName);

Parameters

Name of the menu resource.

Return value

Handle to a newly loaded menu (HMENU).

Menu Resource

Menu resource can be added using Insert -> Resource -> Menu in VC++ Editor. We inserted a menu resource named as IDR_MENU1 and then added this resource in project.

Add menu items, Insert -> Resource -> Menu in VC++ Editor

We added a top menu named as "File". We added additional sub menu items under this menu item. We need to add unique identities for each menu items.

Menu Demo output

LoadMenu AppendMenu Demo Application screen shot

Menu Demo code

We can load a menu resource and set it to a main window in three ways-

  • Load Menu and supply handle to CreateWindow() as an argument,
  • Load Menu and set this menu to the window using SetMenu
  • Load Menu and set this menu to the window during window creation (WM_CREATE)
Note: Our example has all three options. We do not require all three. Thus use any one while testing this demo.

#include <windows.h>
#include "resource.h"

HMENU hMainMenu;
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)"MyMenuClass";


  RegisterClass(&wc);
  hMainMenu = LoadMenu(MAKEINTRESOURCE(IDR_MENU1));
  hWnd = CreateWindow("MyMenuClass", "LoadMenu", WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, hMainMenu, hInstance, NULL);
  SetMenu(hWnd, hMainMenu);
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);

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




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

  switch (message) 
  {
    case WM_CREATE:
    {
      /* Load our dynamic menu */
      hMainMenu = LoadMenu(MAKEINTRESOURCE(IDR_MENU1));
      SetMenu(hWnd, hMainMenu);
      break;
    }
    case WM_COMMAND:
    {
      DefWindowProc(hWnd, message, wParam, lParam);
      break;
    }
    case WM_DESTROY:
    {
      /* Free menu handles */
      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 ...

#