Поделиться через


Буфер обмена: использование буфера обмена Windows

В этом разделе описывается использование стандартного API буфера обмена Windows в приложении MFC.

Большинство приложений для Windows поддерживают удаление или копирование данных в буфер обмена Windows и вставку данных из буфера обмена. В разных приложениях форматы данных буфера обмена могут различаться. Фреймворк поддерживает только ограниченное число форматов буфера обмена для ограниченного числа классов. Обычно вы реализуете команды, связанные с буфером обмена, — вырезать, копировать и вставлять — в меню "Изменить" для представления. Библиотека классов определяет идентификаторы команд для этих команд: ID_EDIT_CUT, ID_EDIT_COPY и ID_EDIT_PASTE. Их указания для строки сообщений также определены.

Сообщения и команды в Платформе объясняют, как обрабатывать команды меню в приложении, сопоставляя команду меню с функцией обработчика. Если приложение не определяет функции обработчика для команд буфера обмена в меню "Изменить", они остаются отключенными. Чтобы написать функции обработчика для команд "Вырезать" и "Копировать", реализуйте выбор в приложении. Чтобы написать функцию обработчика для команды "Вставка", отправьте запрос к буферу обмена, чтобы узнать, содержит ли он данные в формате, который ваше приложение может принять. Например, чтобы включить команду Copy, можно написать обработчик, как показано ниже:

void CMyListView::OnEditCopy()
{
   if ( !OpenClipboard() )
   {
      AfxMessageBox( _T("Cannot open the Clipboard") );
      return;
   }
   // Remove the current Clipboard contents
   if( !EmptyClipboard() )
   {
      AfxMessageBox( _T("Cannot empty the Clipboard") );
      return;
   }
   // Get the currently selected data
   HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, 64);
   strcpy_s((char*)hGlob, 64, "Current selection\r\n");
   // For the appropriate data formats...
   if ( ::SetClipboardData( CF_TEXT, hGlob ) == NULL )
   {
      CString msg;
      msg.Format(_T("Unable to set Clipboard data, error: %d"), GetLastError());
      AfxMessageBox( msg );
      CloseClipboard();
      GlobalFree(hGlob);
      return;
   }
   CloseClipboard();
}

Команды "Вырезать", "Копировать" и "Вставка" являются значимыми только в определенных контекстах. Команды "Вырезать" и "Копировать" должны быть доступны только тогда, когда что-то выделено, а команда "Вставить" — только когда в буфере обмена что-то есть. Это поведение можно предоставить, определив функции обработчика обновлений, которые позволяют включить или отключить эти команды в зависимости от контекста. Дополнительные сведения см. в разделе "Обновление объектов User-Interface".

Библиотека классов Microsoft Foundation действительно предоставляет поддержку работы с Буфером обмена для редактирования текста с помощью классов CEdit и CEditView. Классы OLE также упрощают реализацию операций буфера обмена, включающих элементы OLE. Дополнительные сведения о классах OLE см. в разделе Буфер обмена: использование механизма буфера обмена OLE.

Реализация других команд меню "Изменить", таких как Отменить (ID_EDIT_UNDO) и Повторить (ID_EDIT_REDO), также остается вам. Если приложение не поддерживает эти команды, их можно легко удалить из файла ресурсов с помощью редакторов ресурсов Visual C++.

Что вы хотите узнать больше о

См. также

буфер обмена