На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

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



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz