Страница 15 из 55 Вставка информации из буфера обмена В прикладной программе Метка, определяемая программой, функция EditPaste вставляет содержимое буфера обмена. Эта функция делает следующее: - Открывает буфер обмена путем вызова функции OpenClipboard.
- Устанавливает, какой доступен формат буфера обмена для возврата информации.
- Извлекает дескриптор данных в избранном формате при помощи вызова функции GetClipboardData.
- Вставляет скопированные данные в документ. Дескриптор, возвращенный GetClipboardData, все еще принадлежит буферу обмена, так что прикладная программа не должна освобождать его или оставлять заблокированным.
- Закрывает буфер обмена при помощи вызова функции 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(); } |