Составители:
Хотя многие ресурсы Windows предназначены для совместного использования не-
сколькими приложениями, доступ к буферу обмена в каждый момент возможен только
одной программой. Это позволяет предотвратить конфликты между приложениями.
Прежде чем приложение начнет читать, записывать или удалять содержимое буфе-
ра обмена, необходимо запросить доступ к нему с помощью функции OpenClipboard().
Эта функция возвращает значение TRUE, если буфер открыт и доступ к нему разрешен,
и значение FALSE, если доступ к буферу запрещен по той причине, что в данный мо-
мент право доступа принадлежит другому приложению.
Закончив работу с буфером обмена, приложение должно вызвать функцию CloseC-
lipboard, которая делает буфер доступным для других программ.
Следует отметить, что каждый вызов функции OpenClipboard() всегда должен со-
провождаться вызовом функции CloseClipboard(). Приложение не должно пытаться дли-
тельное время удерживать буфер обмена открытым, а должно стремиться отдать кон-
троль над ним как можно быстрее.
Для записи данных в Clipboard можно использовать универсальную функцию
TransferToClipboard(), копирующую блок памяти в буфер обмена [12].
BOOL TransferToClipboard( HWND hwnd, HANDLE hMemBlock, WORD FormatCB )
{
if( OpenClipboard ( hwnd ) )
{
EmptyClipboard() ;
SetClipbpardData( FormatCB, hMemBlock );
CloseClipboard ();
return( TRUE );
}
return( FALSE ) ;
}
Функция TransferToClipboard() начинается с запроса на право доступа к буферу
обмена. Затем в буфер копируется одиночный блок памяти. Наконец, функция закрывает
буфер обмена, освобождая его для доступа другим приложениям.
Функция TransferToClipboard() имеет довольно универсальную структуру и допус-
кает любой тип дескриптора hMemBlock. Однако для ее работы необходим параметр
FormatCB, указывающий тип данных, копируемых в буфер обмена.
Термин блок памяти не подразумевает блок какого-то определенного размера.
Размер блока был определен ранее функцией GlobalAlloc. Каждый блок памяти может
содержать абзац текста, несколько записей или другие данные, но обязательно одного
типа [12].
А как же быть, если приложение должно передать в буфер обмена смешанные дан-
ные, скажем растровое изображение, метафайл, палитру и фрагмент текста? Решение
этой проблемы довольно простое. Сначала каждый фрагмент данных копируется от-
дельно в глобальную выделенную память с сохранением дескриптора блока памяти, на-
пример hBitmap, hMetafile, hPalette и hText. После этого открывается и освобождается
буфер обмена и в него передается каждый из дескрипторов:
if( OpenClipboard( hwnd ) )
{
EmptyClipboard();
SetClipboardData( CF_BITMAP, hBitmap ) ;
SetClipboardData( CF_PALETTE, hPalette);
168
Хотя многие ресурсы Windows предназначены для совместного использования не- сколькими приложениями, доступ к буферу обмена в каждый момент возможен только одной программой. Это позволяет предотвратить конфликты между приложениями. Прежде чем приложение начнет читать, записывать или удалять содержимое буфе- ра обмена, необходимо запросить доступ к нему с помощью функции OpenClipboard(). Эта функция возвращает значение TRUE, если буфер открыт и доступ к нему разрешен, и значение FALSE, если доступ к буферу запрещен по той причине, что в данный мо- мент право доступа принадлежит другому приложению. Закончив работу с буфером обмена, приложение должно вызвать функцию CloseC- lipboard, которая делает буфер доступным для других программ. Следует отметить, что каждый вызов функции OpenClipboard() всегда должен со- провождаться вызовом функции CloseClipboard(). Приложение не должно пытаться дли- тельное время удерживать буфер обмена открытым, а должно стремиться отдать кон- троль над ним как можно быстрее. Для записи данных в Clipboard можно использовать универсальную функцию TransferToClipboard(), копирующую блок памяти в буфер обмена [12]. BOOL TransferToClipboard( HWND hwnd, HANDLE hMemBlock, WORD FormatCB ) { if( OpenClipboard ( hwnd ) ) { EmptyClipboard() ; SetClipbpardData( FormatCB, hMemBlock ); CloseClipboard (); return( TRUE ); } return( FALSE ) ; } Функция TransferToClipboard() начинается с запроса на право доступа к буферу обмена. Затем в буфер копируется одиночный блок памяти. Наконец, функция закрывает буфер обмена, освобождая его для доступа другим приложениям. Функция TransferToClipboard() имеет довольно универсальную структуру и допус- кает любой тип дескриптора hMemBlock. Однако для ее работы необходим параметр FormatCB, указывающий тип данных, копируемых в буфер обмена. Термин блок памяти не подразумевает блок какого-то определенного размера. Размер блока был определен ранее функцией GlobalAlloc. Каждый блок памяти может содержать абзац текста, несколько записей или другие данные, но обязательно одного типа [12]. А как же быть, если приложение должно передать в буфер обмена смешанные дан- ные, скажем растровое изображение, метафайл, палитру и фрагмент текста? Решение этой проблемы довольно простое. Сначала каждый фрагмент данных копируется от- дельно в глобальную выделенную память с сохранением дескриптора блока памяти, на- пример hBitmap, hMetafile, hPalette и hText. После этого открывается и освобождается буфер обмена и в него передается каждый из дескрипторов: if( OpenClipboard( hwnd ) ) { EmptyClipboard(); SetClipboardData( CF_BITMAP, hBitmap ) ; SetClipboardData( CF_PALETTE, hPalette); 168
Страницы
- « первая
- ‹ предыдущая
- …
- 164
- 165
- 166
- 167
- 168
- …
- следующая ›
- последняя »