Win32 API. Буфер обмена Страница 12. Обработка сообщения WM_INITMENUPOPUP
|
Страница 12 из 55 Обработка сообщения 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); } } }
|