在Label应用程序中,应用程序定义的EditPaste函数粘贴剪贴板的内容。此函数执行以下操作:
通过调用OpenClipboard函数打开剪贴板。
2.确定要检索哪些可用的剪贴板格式。
3.通过调用GetClipboardData功能检索所选格式的数据句柄。
4.将数据的副本插入到文档中。
GetClipboardData返回的句柄仍然由剪贴板所有,因此应用程序不得将其释放或将其锁定。
5.通过调用CloseClipboard函数关闭剪贴板。
如果选择了标签并包含插入点,则EditPaste函数会在插入点插入剪贴板中的文本。如果没有选择或选择标签,该函数将使用剪贴板上的应用程序定义的LABELBOX结构创建一个新标签。LABELBOX结构通过使用注册的剪贴板格式放置在剪贴板上。
以下是EditPaste函数。
VOID WINAPI EditPaste(VOID)
{
PLABELBOX pbox;
HGLOBAL hglb;
LPTSTR lptstr;
PLABELBOX pboxCopy;
int cx, cy;
HWND hwnd;
pbox = hwndSelected == NULL ? NULL :
(PLABELBOX) GetWindowLong(hwndSelected, 0);
//如果应用程序处于编辑模式,
//获取剪贴板文本。
if (pbox != NULL && pbox->fEdit)
{
if(!IsClipboardFormatAvailable(CF_TEXT))
return;
if(!OpenClipboard(hwndMain))
return;
hglb = GetClipboardData(CF_TEXT);
if (hglb != NULL)
{
lptstr = GlobalLock(hglb);
if (lptstr != NULL)
{
//调用应用程序定义的ReplaceSelection
//函数插入文本并重绘
//窗口。
ReplaceSelection(hwndSelected, pbox, lptstr);
GlobalUnlock(hglb);
}
}
CloseClipboard();
return;
}
//如果应用程序不处于编辑模式,
//创建标签窗口。
if(!IsClipboardFormatAvailable(uLabelFormat))
return;
if(!OpenClipboard(hwndMain))
return;
hglb = GetClipboardData(uLabelFormat);
if (hglb != NULL)
{
pboxCopy = GlobalLock(hglb);
if (pboxCopy != NULL)
{
cx = pboxCopy->rcText.right + CX_MARGIN;
cy = pboxCopy->rcText.top * 2 + cyText;
hwnd = CreateWindowEx(
WS_EX_NOPARENTNOTIFY | WS_EX_TRANSPARENT,
atchClassChild,NULL,WS_CHILD,0,0,cx,cy,
hwndMain,NULL,hinst,NULL
);
if (hwnd != NULL)
{
pbox = (PLABELBOX) GetWindowLong(hwnd, 0);
memcpy(pbox, pboxCopy, sizeof(LABELBOX));
ShowWindow(hwnd, SW_SHOWNORMAL);
SetFocus(hwnd);
}
GlobalUnlock(hglb);
}
}
CloseClipboard();
}