|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
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(); возвращайтесь ВЕРНО; }
|
|
|
|
| |