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