Processing the WM_RENDERFORMAT and WM_RENDERALLFORMATS Messages

If a window passes a NULL handle to the SetClipboardData function, it must process the WM_RENDERFORMAT and WM_RENDERALLFORMATS messages to render data upon request.

If the WM_RENDERFORMAT message delayed rendering a specific format and an application requested data in that format, the message is sent to the clipboard owner. If the WM_RENDERFORMAT message has delayed rendering one or more formats, the message is sent to the clipboard owner before it is destroyed.

To render a clipboard format, the window procedure must place a data handle on the clipboard by using the SetClipboardData function. It must not open the clipboard before calling SetClipboardData.

The Label application processes the WM_RENDERFORMAT and WM_RENDERALLFORMATS messages as follows.

case WM_RENDERFORMAT:

RenderFormat((UINT) wParam);

break;

case WM_RENDERALLFORMATS:

RenderFormat(uLabelFormat);

RenderFormat(CF_TEXT);

break;

In both cases, the window procedure calls the application-defined RenderFormat function, defined as follows.

void WINAPI RenderFormat(UINT uFormat)

{

HGLOBAL hglb;

PLABELBOX pbox;

LPTSTR lptstr;

int cch;

if (pboxLocalClip == NULL)

return;

if (uFormat == CF_TEXT)

{

// Allocate a buffer for the text.

cch = pboxLocalClip->cchLabel;

hglb = GlobalAlloc(GMEM_DDESHARE,

(cch + 1) * sizeof(TCHAR));

if (hglb == NULL)

return;

// Copy the text from pboxLocalClip.

lptstr = GlobalLock(hglb);

memcpy(lptstr, pboxLocalClip->atchLabel,

cch * sizeof(TCHAR));

lptstr[cch] = (TCHAR) 0;

GlobalUnlock(hglb);

// Place the handle on the clipboard.

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);

}

}