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


Буфер обмена. Использование буфера обмена 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();
}

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

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

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

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

См. также

Буфер обмена