11.18.1.4 - Создание меню класса

Следующий пример показывает, как создать меню класса для прикладной программы, создать окно, которое использует меню класса и обрабатывать команды меню в оконной процедуре.

Ниже следует важная часть заголовочного файла прикладной программы:

// Идентификатор ресурса шаблона меню
#define IDM_MYMENURESOURCE   3

Ниже следует важная часть самого приложения:

HINSTANCE hinst;

int APIENTRY WinMain(hinstance, hPrevInstance, lpCmdLine, nCmdShow)
HINSTANCE hinstance;
HINSTANCE hPrevInstance;
LPSTR lpCmdLine;
int nCmdShow;
{
	MSG msg;		// сообщение
	WNDCLASS wc;		// данные класса окна
	HWND hwnd;		// дескриптор главного окна

	// Создадим класс окна для основного окна. 
	// Определим идентификатор ресурса шаблона меню как
	// элемент lpszMenuName структуры WNDCLASS, чтобы 
	// создать меню класса.

	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;

	// Создадим основное окно. Установим параметр 
	// hmenu в значение ПУСТО (NULL) так, чтобы Windows 
	// использовал меню класса для окна.

	hwnd = CreateWindow("MainWClass", "Sample Application",
		WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
		CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinstance,
		NULL);

	if (hwnd == NULL)
		return FALSE;

	// Сделаем окно видимым и передадим сообщение 
	// WM_PAINT в оконную процедуру.

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);

	// Запустим главный цикл сообщений.

	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) {
		.
		. // Обработка других сообщений окна.
		.

		case WM_COMMAND:
			// Проверка идентификатора командного пункта меню.
			switch(LOWORD(wParam)) {
				case IDM_FI_OPEN:
					DoFileOpen();	// определяется программой
					break;
				case IDM_FI_CLOSE:
					DoFileClose();	// определяется программой
					break;
				.
				. // Обработка других команд меню.
				.
				default:
					break;
			}
			return 0;
		.
		. // Обработка других сообщений окна.
		.

		default:
			return DefWindowProc(hwnd, uMsg, wParam, lParam);
	}
	return NULL;
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков - 06.10.2002