Работа с буфером обмена - Вставка данных из буфера обмена

ОГЛАВЛЕНИЕ

 

Вставка данных из буфера обмена

Процесс вставки информации из буфера обмена осуществляется следующим образом:

  1. Открываем буфер обмена функцией OpenClipboard.
  2. Определяем форматы данных, хранящихся в буфере обмена.
  3. Получаем хэндл данных нужного формата при помощи функции GetClipboardData.
  4. Вставляем копию данных в документ.

    Владельцем хэндла возвращённого GetClipboardData остаётся всё ещё буфер обмена, поэтому приложение не должно его освобождать.

  5. Закрываем буфер обмена функцией CloseClipboard.

Определение структуры LABELBOX:

#define BOX_ELLIPSE  0 
#define BOX_RECT 1

#define CCH_MAXLABEL 80
#define CX_MARGIN 12

typedef struct tagLABELBOX {
RECT rcText; // координаты прямоугольника с текстом
BOOL fSelected; // TRUE если будет копироваться весь label
BOOL fEdit; // TRUE если текст выделен
int nType; // прямоугольное или овальное
int ichCaret; // позиция каретки
int ichSel; // with ichCaret, delimits selection
int nXCaret; // window position corresponding to ichCaret
int nXSel; // window position corresponding to ichSel
int cchLabel; // длина текста в atchLabel
TCHAR atchLabel[CCH_MAXLABEL];
} LABELBOX, *PLABELBOX;

Далее следует исходник функции 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;
}

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

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