Страница 5 из 7 Обработка сообщений 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); } }
|