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

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

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

    Дескриптор, возвращенный GetClipboardData все еще принадлежит  буферу обмена, так что приложение не должно освобождать или оставлять его заблокированным.

  5. Закрывает буфер обмена при помощи вызова функции CloseClipboard.

Если ярлык выбирается и содержит курсор, функция 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(); 
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz