|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
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); } }
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Обработка WM_RENDERFORMAT и Сообщения WM_RENDERALLFORMATS
Если окно передает НЕДЕЙСТВИТЕЛЬНУЮ ручку в функцию SetClipboardData, оно должно обработать WM_RENDERFORMAT и сообщения WM_RENDERALLFORMATS, чтобы предоставлять данные о запросе.
Если сообщение WM_RENDERFORMAT задерживало бы предоставляя специфический формат и приложение запрашивало данные в этом формате, сообщение послано в буфер владельца. Если сообщение WM_RENDERFORMAT задержало бы предоставление один или более форматов, сообщение послано в буфер владельца прежде, чем оно будет уничтожено. Чтобы предоставлять буфер формата, процедура окна должна установить ручку данных в буфере используя функцию SetClipboardData. Это не должно открывать буфер перед разговором SetClipboardData.
Приложение Этикетки обрабатывает WM_RENDERFORMAT и сообщения WM_RENDERALLFORMATS следующим образом.
случай WM_RENDERFORMAT: RenderFormat((UINT) wParam); прерывание; случай WM_RENDERALLFORMATS: RenderFormat(uLabelFormat); RenderFormat(CF_TEXT); прерывание;
В обоих случаях, процедура окна вызывает определенную прикладную функцию RenderFormat, определенную следующим образом.
пустота WINAPI RenderFormat(UINT uFormat) { HGLOBAL hglb; PLABELBOX pbox; LPTSTR lptstr; int cch; если возврат (pboxLocalClip == НЕДЕЙСТВИТЕЛЬНЫЙ); если (uFormat == CF_TEXT) { // Распределите буфер для текста. cch = pboxLocalClip->cchLabel; hglb = GlobalAlloc(GMEM_DDESHARE, (cch + 1) * sizeof(TCHAR)); если возврат (hglb == НЕДЕЙСТВИТЕЛЬНЫЙ); // Скопируйте текст из pboxLocalClip.
lptstr = GlobalLock(hglb); memcpy(lptstr, pboxLocalClip->atchLabel, cch * sizeof(TCHAR)); lptstr[cch] = (TCHAR) 0; GlobalUnlock(hglb); // Установите ручку в буфере. SetClipboardData(CF_TEXT, hglb); } еще если (uFormat == uLabelFormat) { hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(LABELBOX)); если возврат (hglb == НЕДЕЙСТВИТЕЛЬНЫЙ); pbox = GlobalLock(hglb);
memcpy(pbox, pboxLocalClip, sizeof(LABELBOX)); GlobalUnlock(hglb); SetClipboardData(uLabelFormat, hglb); } }
|
|
|
|
| |