3.13.4 - Вставка информации из буфера обмена

В прикладной программе Метка, определяемая программой, функция EditPaste вставляет содержимое буфера обмена. Эта функция делает следующее:

  1. Открывает буфер обмена путем вызова функции OpenClipboard.
  2. Устанавливает, какой доступен формат буфера обмена для возврата информации.
  3. Извлекает дескриптор данных в избранном формате при помощи вызова функции GetClipboardData.
  4. Вставляет скопированные данные в документ. Дескриптор, возвращенный GetClipboardData, все еще принадлежит буферу обмена, так что прикладная программа не должна освобождать его или оставлять заблокированным.
  5. Закрывает буфер обмена при помощи вызова функции CloseClipboard.

Если пометка выбрана и содержит курсор, функция EditPaste вставляет текст из буфера обмена в месте расположения курсора. Если ничего не выбрано, или если пометка выбрана, функция создает новую пометку в буфере обмена, используя определяемую программой структуру LABELBOX. Структура LABELBOX помещает в буфер обмена, используя зарегистрированный формат буфера обмена.

Ниже показана функция EditPaste.

VOID WINAPI EditPaste(VOID)
{
	PLABELBOX pbox;
	HGLOBAL hglb;
	LPTSTR lptstr;
	PLABELBOX pboxCopy;
	int cx, cy;
	HWND hwnd;

	pbox = hwndSelected == NULL ? NULL :
		(PLABELBOX) GetWindowLong(hwndSelected, 0);

	// Если приложение в режиме редактирования,
	// получите текст буфера обмена

	if (pbox != NULL && pbox->fEdit)
	{
		if (!IsClipboardFormatAvailable(CF_TEXT))
			return;
		if (!OpenClipboard(hwndMain))
			return;

		hglb = GetClipboardData(CF_TEXT);
		if (hglb != NULL)
		{
			lptstr = GlobalLock(hglb);
			if (lptstr != NULL)
			{
				// Обращаемся к определяемой прикладной программой функции
				// ReplaceSelection, чтобы вставить текст и перерисовать окно.

				ReplaceSelection(hwndSelected, pbox, lptstr);
				GlobalUnlock(hglb);
			}
		}
		CloseClipboard();
		return;
	}

	// Если приложение не в режиме редактирования,
	// создаем метку окна.

	if (!IsClipboardFormatAvailable(uLabelFormat))
		return;
	if (!OpenClipboard(hwndMain))
		return;

	hglb = GetClipboardData(uLabelFormat);
	if (hglb != NULL)
	{
		pboxCopy = GlobalLock(hglb);
		if (pboxCopy != NULL)
		{
			cx = pboxCopy->rcText.right + CX_MARGIN;
			cy = pboxCopy->rcText.top * 2 + cyText;
			hwnd = CreateWindowEx(
				WS_EX_NOPARENTNOTIFY | WS_EX_TRANSPARENT,
				atchClassChild, NULL, WS_CHILD, 0, 0, cx, cy,
				hwndMain, NULL, hinst, NULL);

			if (hwnd != NULL)
			{
				pbox = (PLABELBOX) GetWindowLong(hwnd, 0);
				memcpy(pbox, pboxCopy, sizeof(LABELBOX));
				ShowWindow(hwnd, SW_SHOWNORMAL);
				SetFocus(hwnd);
			}
			GlobalUnlock(hglb);
		}
	}
	CloseClipboard();
}

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