На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Copying Information to the Clipboard



In the Label application, the application-defined EditCopy function copies the current selection to the clipboard. This function does the following:

1. Opens the clipboard by calling the OpenClipboard function.
2. Empties the clipboard by calling the EmptyClipboard function.
3. Calls the SetClipboardData function once for each clipboard format the application provides.
4. Closes the clipboard by calling the CloseClipboard function.



Depending on the current selection, the EditCopy function either copies a range of text or copies an application-defined structure representing an entire label. The structure, called LABELBOX, is defined as follows.

#define BOX_ELLIPSE 0
#define BOX_RECT 1

#define CCH_MAXLABEL 80
#define CX_MARGIN 12

typedef struct tagLABELBOX { // box
RECT rcText; // coordinates of rectangle containing text
BOOL fSelected; // TRUE if the label is selected
BOOL fEdit; // TRUE if text is selected
int nType; // rectangular or elliptical
int ichCaret; // caret position
int ichSel; // with ichCaret, delimits selection
int nXCaret; // window position corresponding to ichCaret

int nXSel; // window position corresponding to ichSel
int cchLabel; // length of text in atchLabel
TCHAR atchLabel[CCH_MAXLABEL];
} LABELBOX, *PLABELBOX;


Following is the EditCopy function.

BOOL WINAPI EditCopy(VOID)
{
PLABELBOX pbox;
LPTSTR lptstrCopy;
HGLOBAL hglbCopy;
int ich1, ich2, cch;

if (hwndSelected == NULL)
return FALSE;

// Open the clipboard, and empty it.

if (!OpenClipboard(hwndMain))
return FALSE;
EmptyClipboard();

// Get a pointer to the structure for the selected label.

pbox = (PLABELBOX) GetWindowLong(hwndSelected, 0);

// If text is selected, copy it using the CF_TEXT format.


if (pbox->fEdit)
{
if (pbox->ichSel == pbox->ichCaret) // zero length
{
CloseClipboard(); // selection
return FALSE;
}

if (pbox->ichSel < pbox->ichCaret)
{
ich1 = pbox->ichSel;
ich2 = pbox->ichCaret;
}
else
{
ich1 = pbox->ichCaret;
ich2 = pbox->ichSel;
}
cch = ich2 - ich1;


// Allocate a global memory object for the text.

hglbCopy = GlobalAlloc(GMEM_DDESHARE,
(cch + 1) * sizeof(TCHAR));
if (hglbCopy == NULL)
{
CloseClipboard();
return FALSE;
}

// Lock the handle and copy the text to the buffer.

lptstrCopy = GlobalLock(hglbCopy);
memcpy(lptstrCopy, &pbox->atchLabel[ich1],
cch * sizeof(TCHAR));
lptstrCopy[cch] = (TCHAR) 0; // null character

GlobalUnlock(hglbCopy);

// Place the handle on the clipboard.

SetClipboardData(CF_TEXT, hglbCopy);
}

// If no text is selected, the label as a whole is copied.

else
{
// Save a copy of the selected label as a local memory
// object. This copy is used to render data on request.
// It is freed in response to the WM_DESTROYCLIPBOARD
// message.

pboxLocalClip = (PLABELBOX) LocalAlloc(

LMEM_FIXED,
sizeof(LABELBOX)
);
if (pboxLocalClip == NULL)
{
CloseClipboard();
return FALSE;
}
memcpy(pboxLocalClip, pbox, sizeof(LABELBOX));
pboxLocalClip->fSelected = FALSE;
pboxLocalClip->fEdit = FALSE;

// Place a registered clipboard format, the owner-display
// format, and the CF_TEXT format on the clipboard using
// delayed rendering.


SetClipboardData(uLabelFormat, NULL);
SetClipboardData(CF_OWNERDISPLAY, NULL);
SetClipboardData(CF_TEXT, NULL);
}

// Close the clipboard.

CloseClipboard();

return TRUE;
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Копирование Информации в Буфер



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

1. Открывает буфер вызывая функцию OpenClipboard.
2. Пустые буфер вызывая функцию EmptyClipboard.
3. Называет функцию SetClipboardData как только для каждого буфера формата приложение обеспечится.
4. Закрывает буфер вызывая функцию CloseClipboard.



В зависимости от текущего выбора, функция EditCopy или копирует дипазон текста или копирует определенную прикладную структуру представляя целую этикетку. Структура, назвавшая LABELBOX, определяется следующим образом.

#define BOX_ELLIPSE 0 #define BOX_RECT 1

#define CCH_MAXLABEL 80 #define CX_MARGIN 12

typedef struct tagLABELBOX { // блок RECT rcText; // координаты прямоугольника, содержащего текст BOOL fSelected; // ИСТИНА если этикетка выбрана BOOL fEdit; // ИСТИНА если текст выбран int nType; // прямоугольный или эллиптический int ichCaret; // символ ^ позиции int ichSel; // с ichCaret, ограничивает выбор int nXCaret; // позиция окна, соответствуемая на ichCaret

int nXSel; // позиция окна, соответствуемая на ichSel int cchLabel; // длина текста в atchLabel TCHAR atchLabel[CCH_MAXLABEL];
} LABELBOX, *PLABELBOX;


Следующее является функцией EditCopy.

BOOL WINAPI EditCopy(ПУСТОТА)
{
PLABELBOX pbox;
LPTSTR lptstrCopy;
HGLOBAL hglbCopy;
int ich1, ich2, cch;

если (hwndSelected == НЕДЕЙСТВИТЕЛЬНЫМ) обратная ЛОЖЬ;

// Открытый буфер, и пустой это.

если (!OpenClipboard(hwndMain)) ОБРАТНАЯ ЛОЖЬ;
EmptyClipboard();

// Получите указатель в структуру для выбранной этикетки.

pbox = (PLABELBOX) GetWindowLong(hwndSelected, 0);

// Если текст выбран, скопируйте этому используя формат CF_TEXT.


если (pbox->fEdit)
{
если (pbox->ichSel == pbox->ichCaret) // нулевая длина
{
CloseClipboard(); // обратная ЛОЖЬ выбора;
}

если (pbox->ichSel < pbox->ichCaret)
{
ich1 = pbox->ichSel;
ich2 = pbox->ichCaret;
}
еще
{
ich1 = pbox->ichCaret;
ich2 = pbox->ichSel;
}
cch = ich2 - ich1;


// Распределите глобальный объект памяти для текста.

hglbCopy = GlobalAlloc(GMEM_DDESHARE, (cch + 1) * sizeof(TCHAR));
если (hglbCopy == НЕДЕЙСТВИТЕЛЬНЫЙ)
{
CloseClipboard();
обратная ЛОЖЬ;
}

// Заприте ручку и копируйте текст в буфер.

lptstrCopy = GlobalLock(hglbCopy);
memcpy(lptstrCopy, &pbox->atchLabel[ich1], cch * sizeof(TCHAR));
lptstrCopy[cch] = (TCHAR) 0; // недействительный символ

GlobalUnlock(hglbCopy);

// Установите ручку в буфере.

SetClipboardData(CF_TEXT, hglbCopy);
}

// Если никакой текст не выбран, этикетка в целом скопирована.

еще
{
// Сохраняемый копия выбранной этикетки как локальная память // объект. Эта копия использована, чтобы предоставлять данные о запросе.
// Освобождено в ответ на сообщение WM_DESTROYCLIPBOARD //.

pboxLocalClip = (PLABELBOX) LocalAlloc(

LMEM_FIXED, sizeof(LABELBOX)
);
если (pboxLocalClip == НЕДЕЙСТВИТЕЛЬНЫЙ)
{
CloseClipboard();
обратная ЛОЖЬ;
}
memcpy(pboxLocalClip, pbox, sizeof(LABELBOX));
pboxLocalClip->fSelected = ЛОЖЬ;
pboxLocalClip->fEdit = ЛОЖЬ;

// Место зарегистрированный формат буфера, владелец-дисплей // формат, и формат CF_TEXT в буфере использования // задержавшем предоставление.


SetClipboardData(uLabelFormat, НЕДЕЙСТВИТЕЛЬНЫЙ);
SetClipboardData(CF_OWNERDISPLAY, НЕДЕЙСТВИТЕЛЬНЫЙ);
SetClipboardData(CF_TEXT, НЕДЕЙСТВИТЕЛЬНЫЙ);
}

// Закрытый буфер.

CloseClipboard();

возвращайтесь ВЕРНО;
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz