Операционные системы. Учебное пособие. Марапулец Ю.В. - 166 стр.

UptoLike

Составители: 

Хотя многие ресурсы 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