Использование собственного дисплейного формата буфера обмена
Если окно помещает информацию в буфер обмена при помощи использования формата 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; } |