Platform SDK: Interprocess Communications |
In the Label application, the application-defined EditCopy function copies the current selection to the clipboard. This function does the following:
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_MOVEABLE, (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; }