Creating a Class Menu

The following example shows how to create a class menu for an application, create a window that uses the class menu, and process menu commands in the window procedure.

Following is the relevant portion of the application's header file:

// Menu-template resource identifier

#define IDM_MYMENURESOURCE 3

Following are the relevant portions of the application itself:

HINSTANCE hinst;

int APIENTRY WinMain(hinstance, hPrevInstance, lpCmdLine, nCmdShow)

HINSTANCE hinstance;

HINSTANCE hPrevInstance;

LPSTR lpCmdLine;

int nCmdShow;

{

MSG msg; // message

WNDCLASS wc; // windowclass data

HWND hwnd; // handle to the main window

// Create the window class for the main window. Specify

// the identifier of the menu-template resource as the

// lpszMenuName member of the WNDCLASS structure to create

// the class menu.

wc.style = 0;

wc.lpfnWndProc = (WNDPROC) MainWndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hinstance;

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = GetStockObject(WHITE_BRUSH);

wc.lpszMenuName = MAKEINTRESOURCE(IDM_MYMENURESOURCE);

wc.lpszClassName = "MainWClass";

if (!RegisterClass(&wc))

return FALSE;

hinst = hinstance;

// Create the main window. Set the hmenu parameter to NULL so

// that Windows uses the class menu for the window.

hwnd = CreateWindow("MainWClass", "Sample Application",

WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance,

NULL);

if (hwnd == NULL)

return FALSE;

// Make the window visible and send a WM_PAINT message to the

// window procedure.

ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);

// Start the main message loop.

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

UNREFERENCED_PARAMETER(hPrevInstance);

}

LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)

HWND hwnd;

UINT uMsg;

WPARAM wParam;

LPARAM lParam;

{

switch (uMsg) {

.

. // Process other window messages.

.

case WM_COMMAND:

// Test for the identifier of a command item.

switch(LOWORD(wParam)) {

case IDM_FI_OPEN:

DoFileOpen(); // application-defined

break;

case IDM_FI_CLOSE:

DoFileClose(); // application-defined

break;

.

. // Process other menu commands.

.

default:

break;

}

return 0;

.

. // Process other window messages.

.

default:

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return NULL;

}