Platform SDK: Interprocess Communications |
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_MOVEABLE, (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_MOVEABLE, sizeof(LABELBOX)); if (hglb == NULL) return; pbox = GlobalLock(hglb); memcpy(pbox, pboxLocalClip, sizeof(LABELBOX)); GlobalUnlock(hglb); SetClipboardData(uLabelFormat, hglb); } }