Win32 API. Буфер обмена
Страница 17. Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS


Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS

Если окно передает в функцию SetClipboardData значение дескриптора НОЛЬ (NULL), оно должно обработать сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS, чтобы предоставить данные по запросу.

Если сообщение WM_RENDERFORMAT откладывает запись в специфическом формате, а прикладная программа запросила данные в этом формате, сообщение посылается владельцу буфера обмена. Если сообщение WM_RENDERFORMAT - сообщение об отложенной записи одного или большего количества форматов, сообщение посылается владельцу буфера обмена перед тем, как буфер будет разрушен.

Чтобы записать формат буфера обмена, оконная процедура должна поместить дескриптор данных в буфер обмена, используя функцию SetClipboardData. Она не должна открывать буфер обмена перед вызовом SetClipboardData.

Приложение Метка обрабатывает сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS следующим образом.

case WM_RENDERFORMAT:
RenderFormat((UINT) wParam);
break;

case WM_RENDERALLFORMATS:
RenderFormat(uLabelFormat);
RenderFormat(CF_TEXT);
break;

В обоих случаях, оконная процедура вызывает определяемую программой функцию RenderFormat, определенную следующим образом

void WINAPI RenderFormat(UINT uFormat)
{
HGLOBAL hglb;
PLABELBOX pbox;
LPTSTR lptstr;
int cch;

if (pboxLocalClip == NULL)
return;

if (uFormat == CF_TEXT)
{
// Размещение буфера для текста.
cch = pboxLocalClip->cchLabel;
hglb = GlobalAlloc(GMEM_DDESHARE,
(cch + 1) * sizeof(TCHAR));
if (hglb == NULL)
return;

// Копирование текста из pboxLocalClip.
lptstr = GlobalLock(hglb);
memcpy(lptstr, pboxLocalClip->atchLabel,
cch * sizeof(TCHAR));
lptstr[cch] = (TCHAR) 0;
GlobalUnlock(hglb);

// Поместим дескриптор в буфер обмена
SetClipboardData(CF_TEXT, hglb);
}
else if (uFormat == uLabelFormat)
{
hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(LABELBOX));
if (hglb == NULL)
return;
pbox = GlobalLock(hglb);

memcpy(pbox, pboxLocalClip, sizeof(LABELBOX));
GlobalUnlock(hglb);

SetClipboardData(uLabelFormat, hglb);
}
}

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