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;

}

Software for developers
Delphi Components
.Net Components
Software for Android Developers
More information resources
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
Databases for Amazon shops developers
Amazon Categories Database
Browse Nodes Database