15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту




Посмотрим, что у нас в clipboard.

Автор: Michael Dunn

  • Скачать исходник - 45 Kb

     [Screen shot 1 - Word clipboard data - 45K]
    Рис. 1: ClipSpy показывает, что Word 97 положил в clipboard после простой операции копирования.

     [Screen shot 2 - Word drag-n-drop data - 22K]
    Рис. 2: ClipSpy показывает содержимое clipboard , если в Word что-нибудь перетащить.

 

Программка ClipSpy работает через MFC класс COleDataObject , который включает интерфейс IDataObject, и обеспечивает доступ к содержимому clipboard. Функция CLeftView::ReadDataAndFillList() отслеживает форматы данных в clipboard и заполняет ими список:

BOOL CLeftView::ReadDataAndFillList ( COleDataObject* pDO )
{
FORMATETC etc;
UINT      uNumFormats = 0;

    // определяем, сколько форматов данных доступно в clipboard.

    pDO->BeginEnumFormats();

    while ( pDO->GetNextFormat ( &etc ))
    {
        if ( pDO->IsDataAvailable ( etc.cfFormat ))
        {
            uNumFormats++;
        }
    }

ClipSpy проверяет, является ли каждый формат данных встроенным. Если нет, то вызывается функция GetClipboardFormatName()для получения названия формата:

    TCHAR szFormat [256];
    GetClipboardFormatName ( etc.cfFormat, szFormat, 256 );

Затем ClipSpy считывает данные из формата:

HGLOBAL hgData;
UINT    uDataSize;
CClipSpyDoc* pDoc = GetDocument();

    // Получаем HGLOBAL данных.
    hgData = pDO->GetGlobalData ( etc.cfFormat );

    if ( NULL != hgData )
    {
        uDataSize = GlobalSize ( hgData );
        pDoc->AddDataBlock ( hgData, uDataSize );
    }
    else
    {
        pDoc->AddEmptyBlock();
    }

Функции AddDataBlock() и AddEmptyBlock() это члены класса Документ, которые сохраняют копии данных.

Следующий интересный момент, это CLeftView::OnItemchanged() и CClipSpyView::OnUpdate(). Первая функция определяет изменения и соответственно вызывает функцию UpdateAllViews(), которая в свою очередь вызывает OnUpdate(). OnUpdate() заполняет правый rich edit данными.