Страница 1 из 7
Реализация команд Cut, Copy, и Paste В этом разделе приводится пример, реализующий эти команды используя два формата буфера обмена: CF_OWNERDISPLAY и CF_TEXT. Обычно, перед тем, как информация будет скопирована в буфер обмена (clipboard), пользователь должен выделить определённый кусок текста. Для этого в приложении должны быть реализованы все возможности. После того, как текст будет выделен, необходимо реализовать всплывающее меню по правой кнопке мыши, а так же акселераторы к пунктам этого меню. Чтобы сделать всплывающее меню, приложение должно обработать сообщение WM_INITMENUPOPUP: 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 );
} } }
Далее, для того, чтобы обрабатывать команды меню, необходимо добавить в приложение обработку команды WM_COMMAND в главную оконную процедуру: Пример: case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_CUT: if (EditCopy()) EditDelete(); break;
case IDM_COPY: EditCopy(); break;
case IDM_PASTE: EditPaste(); break;
case IDM_DELETE: EditDelete(); break;
case IDM_EXIT: DestroyWindow(hwnd); } break; Для реализации команд Copy и Cut используется функция EditCopy (См. Копирование данных в буфер обмена). Для реализации команды Paste используется функция EditPaste (См. Вставка данных из буфера обмена). |