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.14 - Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS / Буфер обмена / Win32 API

3.14 - Обработка сообщений WM_RENDERFORMAT и WM_RENDERALLFORMATS

Если окно передает в функцию SetClipboardData значение дескриптора НОЛЬ (NULL), оно должно обработать сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS, чтобы предоставить данные по запросу.

Если сообщение WM_RENDERFORMAT откладывает запись в специфическом формате, а прикладная программа запросила данные в этом формате, сообщение посылается владельцу буфера обмена. Если сообщение WM_RENDERFORMAT - сообщение об отложенной записи одного или большего количества форматов, сообщение посылается владельцу буфера обмена перед тем, как буфер будет разрушен.

Чтобы записать формат буфера обмена, оконная процедура должна поместить дескриптор данных в буфер обмена, используя функцию SetClipboardData. Она не должна открывать буфер обмена перед вызовом SetClipboardData.

Приложение Метка обрабатывает сообщения WM_RENDERFORMAT и WM_RENDERALLFORMATS следующим образом.

case WM_RENDERFORMAT:
	RenderFormat((UINT) wParam);
	break;

case WM_RENDERALLFORMATS:
	RenderFormat(uLabelFormat);
	RenderFormat(CF_TEXT);
	break;

В обоих случаях, оконная процедура вызывает определяемую программой функцию RenderFormat, определенную следующим образом

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_DDESHARE,
			(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_DDESHARE, sizeof(LABELBOX));
		if (hglb == NULL)
			return;
		pbox = GlobalLock(hglb);

		memcpy(pbox, pboxLocalClip, sizeof(LABELBOX));
		GlobalUnlock(hglb);

		SetClipboardData(uLabelFormat, hglb);
	}
}

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