处理WM_RENDERFORMAT和WM_RENDERALLFORMATS邮件

【勇芳软件工作室】汉化HomePreviousNext

如果一个窗口将一个NULL句柄传递给SetClipboardData函数,则它必须处理WM_RENDERFORMATWM_RENDERALLFORMATS消息以根据请求呈现数据。

如果WM_RENDERFORMAT消息延迟呈现特定格式,并且应用程序请求该格式的数据,则该消息将发送到剪贴板所有者。如果WM_RENDERFORMAT消息延迟呈现一种或多种格式,则消息将在销毁之前发送到剪贴板所有者。

要渲染剪贴板格式,窗口过程必须使用SetClipboardData功能将数据句柄放在剪贴板上。在调用SetClipboardData之前不得打开剪贴板。

标签应用程序处理WM_RENDERFORMATWM_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);

}

}