将信息复制到剪贴板

【勇芳软件工作室】汉化HomePreviousNext

在Label应用程序中,应用程序定义的EditCopy功能将当前选择复制到剪贴板。此函数执行以下操作:

通过调用OpenClipboard函数打开剪贴板。

通过调用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; 如果选择了标签,则为TRUE

BOOL fEdit; 如果选择了文本,则为TRUE

int nType; //矩形或椭圆形

int ichCaret; //插入位置

int ichSel; // with ichCaret,界定选择

int nXCaret; //窗口位置对应于ichCaret

int nXSel; //窗口位置对应于ichSel

int cchLabel; // atchLabel中的文本长度

TCHAR atchLabel[CCH_MAXLABEL];

} LABELBOX, *PLABELBOX;

以下是EditCopy功能。

BOOL WINAPI EditCopy(VOID)

{

PLABELBOX pbox;

LPTSTR lptstrCopy;

HGLOBAL hglbCopy;

int ich1, ich2, cch;

if (hwndSelected == NULL)

return FALSE;

//打开剪贴板,并将其清空。

if(!OpenClipboard(hwndMain))

return FALSE;

EmptyClipboard();

//获取指向所选标签的结构的指针。

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

//如果选择文本,请使用CF_TEXT格式复制文本。

if(pbox- > fEdit)

{

if (pbox->ichSel == pbox->ichCaret) //零长度

{

CloseClipboard(); //选择

return FALSE;

}

if(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));

if (hglbCopy == NULL)

{

CloseClipboard();

return FALSE;

}

//锁定句柄并将文本复制到缓冲区。

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)

);

if (pboxLocalClip == NULL)

{

CloseClipboard();

return FALSE;

}

memcpy(pboxLocalClip, pbox, sizeof(LABELBOX));

pboxLocalClip->fSelected = FALSE;

pboxLocalClip->fEdit = FALSE;

//放置已注册的剪贴板格式,所有者显示

//格式,并使用剪贴板上的CF_TEXT格式

//延迟呈现。

SetClipboardData(uLabelFormat, NULL);

SetClipboardData(CF_OWNERDISPLAY, NULL);

SetClipboardData(CF_TEXT, NULL);

}

//关闭剪贴板。

CloseClipboard();

return TRUE;

}