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