3.13.1 - Обработка сообщения WM_INITMENUPOPUP

Не все команды буфера обмена доступны пользователю в любое данное время. Прикладная программа должна обработать сообщение WM_INITMENUPOPUP, чтобы включить пункты меню доступных команд и отключить недоступные команды.

Ниже следует выбирающая (case) структура WM_INITMENUPOPUP для прикладной программы, которая называется Меткой (Label).

case WM_INITMENUPOPUP:
	InitMenu((HMENU) wParam);
	break;

Функция InitMenu определяется, как указано ниже.

void WINAPI InitMenu(HMENU hmenu)
{
	int  cMenuItems = GetMenuItemCount(hmenu);
	int  nPos;
	UINT id;
	UINT fuFlags;
	PLABELBOX pbox = (hwndSelected == NULL) ? NULL :
		(PLABELBOX) GetWindowLong(hwndSelected, 0);

	for (nPos = 0; nPos < cMenuItems; nPos++)
	{
		id = GetMenuItemID(hmenu, nPos);
		switch (id)
		{
			case IDM_CUT:
			case IDM_COPY:
			case IDM_DELETE:
				if (pbox == NULL || !pbox->fSelected)
					fuFlags = MF_BYCOMMAND | MF_GRAYED;
				else if (pbox->fEdit)
					fuFlags = (id != IDM_DELETE && pbox->ichSel
						== pbox->ichCaret) ?
						MF_BYCOMMAND | MF_GRAYED :
						MF_BYCOMMAND | MF_ENABLED;
				else
					fuFlags = MF_BYCOMMAND | MF_ENABLED;

				EnableMenuItem(hmenu, id, fuFlags);
				break;

			case IDM_PASTE:
				if (pbox != NULL && pbox->fEdit)
					EnableMenuItem(hmenu, id,
						IsClipboardFormatAvailable(CF_TEXT) ?
						MF_BYCOMMAND | MF_ENABLED :
						MF_BYCOMMAND | MF_GRAYED);
				else
					EnableMenuItem(hmenu, id,
						IsClipboardFormatAvailable(
							uLabelFormat) ?
							MF_BYCOMMAND | MF_ENABLED :
							MF_BYCOMMAND | MF_GRAYED);
		}
	}
}

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