如果一个窗口将一个NULL句柄传递给SetClipboardData函数,则它必须处理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);
}
}