在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;
}