В приложении Label, определяемая программой функция EditPaste вставляет содержимое буфера обмена. Эта функция делает следующее:
Дескриптор, возвращенный GetClipboardData все еще принадлежит буферу обмена, так что приложение не должно освобождать или оставлять его заблокированным.
Если ярлык выбирается и содержит курсор, функция EditPaste вставляет текст из буфера обмена туда, где курсор. Если выбора нет, или если выбирается ярлык, функция создает новый ярлык, используя определяемую программой структуру LABELBOX в буфере обмена. Структура LABELBOX помещается в буфер обмена при помощи использования зарегистрированного формата буфера обмена.
Структура, называемая 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, если ярлык выбран BOOL fEdit; // TRUE, если текст выбран int nType; // прямоугольный или эллиптический int ichCaret; // позиция каретки int ichSel; // с ichCaret, разграничивает выбор int nXCaret; // позиция окна, соответствующая ichCaret int nXSel; // позиция окна, соответствующая 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; } // Если приложение не в режиме редактирования, // создадим окно ярлыка. 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(); } |