Использование собственного дисплейного формата буфера обмена
Если окно помещает информацию в буфер обмена при помощи использования формата CF_OWNERDISPLAY, оно должно сделать нижеследующее:
Обычно, окно отвечает на это сообщение, устанавливая позицию и диапазон прокрутки для окна просмотра буфера обмена. В ответ на это сообщение, приложение Label также обновляет и структуру SIZE для окна просмотра буфера обмена.
Оконная процедура прикладной программы Label обрабатывает эти сообщения, как ниже указано.
Демонстрационный пример
LRESULT CALLBACK MainWindowProc(hwnd, msg, wParam, lParam)
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
static RECT rcViewer;
RECT rc;
LPRECT lprc;
LPPAINTSTRUCT lpps;
switch (msg)
{
//
// Обработка других сообщений.
//
case WM_PAINTCLIPBOARD:
// Определяем размеры ярлыка.
SetRect(&rc, 0, 0,
pboxLocalClip->rcText.right + CX_MARGIN,
pboxLocalClip->rcText.top * 2 + cyText
);
// Центруем изображение в окне просмотра буфера обмена.
if (rc.right < rcViewer.right)
{
rc.left = (rcViewer.right - rc.right) / 2;
rc.right += rc.left;
}
if (rc.bottom < rcViewer.bottom)
{
rc.top = (rcViewer.bottom - rc.bottom) / 2;
rc.bottom += rc.top;
}
// Рисуем изображение, используя установленную структуру
// PAINTSTRUCT, вызвав определяемую программой
// функцию PaintLabel.
lpps = (LPPAINTSTRUCT) GlobalLock((HGLOBAL) lParam);
PaintLabel(lpps, pboxLocalClip, &rc);
GlobalUnlock((HGLOBAL) lParam);
break;
case WM_SIZECLIPBOARD:
// Сохраняем размеры окна в статической
// структуре RECT.
lprc = (LPRECT) GlobalLock((HGLOBAL) lParam);
memcpy(&rcViewer, lprc, sizeof(RECT));
GlobalUnlock((HGLOBAL) lParam);
// Устанавливаем диапазон прокрутки от нуля(это исключение
// требуют обработки сообщений WM_HSCROLLCLIPBOARD и
// WM_VSCROLLCLIPBOARD).
SetScrollRange((HWND) wParam, SB_HORZ, 0, 0, TRUE);
SetScrollRange((HWND) wParam, SB_VERT, 0, 0, TRUE);
break;
case WM_ASKCBFORMATNAME:
LoadString(hinst, IDS_OWNERDISPLAY,
(LPSTR) lParam, wParam);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
} |