case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_EDIT_PASTE:
//打开剪切板
OpenClipboard(hwnd);
//取得指向文本的全局内存块的句柄
if(hGlobal=GetClipboardData(CF_TCHAR))
{
//锁定剪切板,同时得到一个指向数据块的指针
pGlobal=(PTSTR)GlobalLock(hGlobal);
//清pText数据
if(pText)
{
free(pText);
pText=NULL;
}
//分配大小
pText=(PTSTR)malloc(GlobalSize(hGlobal));
//复制
lstrcpy(pText,pGlobal);
//刷新,触发WM_PAINT
InvalidateRect(hwnd,NULL,TRUE);
}
//关闭剪切板
CloseClipboard();
return 0;
case IDM_EDIT_CUT:
case IDM_EDIT_COPY:
if(!pText)
return 0;
//分配一块内存(属性,大小)
hGlobal=GlobalAlloc(GHND|GMEM_SHARE,(lstrlen(pText)+1)*sizeof(TCHAR));
//锁定
pGlobal=(PTSTR)GlobalLock(hGlobal);
//复制
lstrcpy(pGlobal,pText);
//解锁(可以让Windows自由移动内存中的内存块)
GlobalUnlock(hGlobal);
//打开剪切板
OpenClipboard(hwnd);
//清空剪切板
EmptyClipboard();
//将内存句柄传给剪切板,后关闭剪切板
SetClipboardData(CF_TCHAR,hGlobal);
CloseClipboard();
//如果是复制的话,就直接返回0,不是的话,直接执行IDM_EDIT_CLEAR,实现了剪切
if(LOWORD(wParam)==IDM_EDIT_COPY)
return 0;
case IDM_EDIT_CLEAR:
if(pText)
{
free(pText);
pText=NULL;
}
InvalidateRect(hwnd,NULL,TRUE);
return 0;
以后在使用剪贴板时,按这种顺序来用,学习一种方法吧。