3.16 - Использование собственного формата записи данных в буфере обмена

Если окно помещает информацию в буфер обмена, используя формат буфера обмена CF_OWNERDISPLAY, оно должно делать следующее:

Обработать сообщение WM_PAINTCLIPBOARD. Это сообщение посылается владельцу буфера обмена, когда часть окна просмотра буфера обмена должна быть перерисована.

Обработать сообщение WM_SIZECLIPBOARD Это сообщение посылается владельцу буфера обмена, когда было изменено окно просмотра буфера обмена или изменилось его содержание. Как правило, окно отвечает на это сообщение, устанавливая позиции прокрутки и область окна просмотра буфера обмена. В ответ на это сообщение, прикладная программа Метки также модифицирует структуру SIZE для окна просмотра буфера обмена.

Обработать сообщения WM_HSCROLLCLIPBOARD и WM_VSCROLLCLIPBOARD. Эти сообщения посылаются владельцу буфера обмена, когда в окне просмотра буфера обмена происходит событие с полосой прокрутки окна.

Обработать сообщение WM_ASKCBFORMATNAME. Окно окна просмотра буфера обмена посылает это сообщению прикладной программе, чтобы извлечь информацию об имени формата собственной записи данных.

Оконная процедура приложения Метки (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;
}


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Владимир Соковиков - 15.02.2002