Работа с буфером обмена
Страница 5. Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS


 

Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS

Если не известно, какого формата данные будут помещены в буфер обмена, то можно передать в функцию SetClipboardData хэндл равный NULL, при этом приложение сгенерирует сообщение WM_RENDERFORMAT либо WM_RENDERALLFORMATS и Вы должны позаботиться, чтобы обработать эти сообщения. В данном случае перед вызовом функции SetClipboardData нельзя открывать буфер обмена.

Сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS обрабатываются следующим образом:

case WM_RENDERFORMAT:
RenderFormat((UINT) wParam);
break;

case WM_RENDERALLFORMATS:
RenderFormat(uLabelFormat);
RenderFormat(CF_TEXT);
break;

Код функции RenderFormat представлен ниже.

Как обычно, определение структуры LABELBOX:

#define BOX_ELLIPSE 0 
#define BOX_RECT 1

#define CCH_MAXLABEL 80
#define CX_MARGIN 12

typedef struct tagLABELBOX {
RECT rcText; // координаты прямоугольника с текстом
BOOL fSelected; // TRUE если будет копироваться весь label
BOOL fEdit; // TRUE если текст выделен
int nType; // прямоугольное или овальное
int ichCaret; // позиция каретки
int ichSel; // with ichCaret, delimits selection
int nXCaret; // window position corresponding to ichCaret
int nXSel; // window position corresponding to ichSel
int cchLabel; // длина текста в atchLabel
TCHAR atchLabel[CCH_MAXLABEL];
} LABELBOX, *PLABELBOX;

Пример:

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_MOVEABLE,
(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_MOVEABLE, sizeof(LABELBOX));
if (hglb == NULL)
return;
pbox = GlobalLock(hglb);
memcpy(pbox, pboxLocalClip, sizeof(LABELBOX));
GlobalUnlock(hglb);

SetClipboardData(uLabelFormat, hglb);
}
}

 
« Предыдущая статья   Следующая статья »