В приложении 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();
}
|