Работа с буфером обмена (clipboard)
Страница 2. Нестандартные форматы данных буфера обмена



2. Нестандартные форматы данных буфера обмена.

Возможно ситуация, когда приложению необходимо поместить данные в буфер обмена, а стандартные форматы для этого не подходят. Выходом из такой ситуации является возможность регистрации собственного формата данных.

Для того чтобы зарегистрировать новый формат буфера обмена, используйте функцию RegisterClipboardFormat. Рассмотрим простой пример использования этой функции:

//объявим некую структуру
struct MyClipboardData
{
   CString strName;
   int     nAge;
};
//помещаем данные в буфер обмена
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT"); //регистрируем наш формат данных
if(OpenClipboard())//для работы с буфером обмена его нужно открыть
{
   //заполним нашу структуру данными
   MyClipboardData data;
   data.strName = "Vasya_Pupkin";
   data.nAge = 25;

   HGLOBAL hgBuffer;
   EmptyClipboard(); //очищаем буфер
   hgBuffer= GlobalAlloc(GMEM_DDESHARE, sizeof(MyClipboardData));//выделим память
   MyClipboardData* buffer = (MyClipboardData*)GlobalLock(hgBuffer);
   //запишем данные в память
   *buffer = data;
   //поместим данные в буфер обмена
   GlobalUnlock(hgBuffer);
   SetClipboardData(format, hgBuffer); //помещаем данные в буфер обмена
   CloseClipboard();//после работы с буфером, его нужно закрыть
}

//прочитаем наши данные из буфера обмена
//вызываем второй раз, чтобы просто получить формат
UINT format = RegisterClipboardFormat("MY_CUSTOM_FORMAT");
MyClipboardData data;
if ( OpenClipboard() ) 
{
   //извлекаем данные из буфера
   HANDLE hData = GetClipboardData(format);
   MyClipboardData* buffer = (MyClipboardData*)GlobalLock( hData );

   //заполняем нашу структуру полученными данными
   data = *buffer;

   GlobalUnlock( hData );
   CloseClipboard();
}


Два различных приложения или две копии одного приложения могут зарегистрировать формат с одним и тем же именем, при этом функция RegisterClipboardFormat вернет один и тот же идентификатор формата. Поэтому два приложения всегда смогут "договориться", если они знают имя нестандартного формата данных.

 
« Предыдущая статья   Следующая статья »