C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




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

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;
}


| |
Автор Владимир Соковиков.
[AD]