剪贴板查看器示例

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

以下示例显示了一个简单的剪贴板查看器应用程序。

HINSTANCE hinst;

UINT uFormat = (UINT)(-1);

BOOL fAuto = TRUE;

LRESULT APIENTRY MainWndProc(hwnd,uMsg,wParam,lParam)en

HWND hwnd;

UINT uMsg;

WPARAM wParam;

LPARAM lParam;

{

static HWND hwndNextViewer;

HDC hdc;

HDC hdcMem;

PAINTSTRUCT ps;

LPPAINTSTRUCT lpps;

RECT rc;

LPRECT lprc;

HGLOBAL hglb;

LPSTR lpstr;

HBITMAP hbm;

HENHMETAFILE hemf;

HWND hwndOwner;

开关(uMsg)

{

case WM_PAINT:

hdc = BeginPaint(hwnd, &ps);

//根据剪贴板格式进行分支。

开关(uFormat)

{

case CF_OWNERDISPLAY:

hwndOwner = GetClipboardOwner();

hglb = GlobalAlloc(GMEM_DDESHARE,

sizeof(PAINTSTRUCT));

lpps = GlobalLock(hglb);

memcpy(lpps, &ps, sizeof(PAINTSTRUCT));

GlobalUnlock(hglb);

SendMessage(hwndOwner,WM_PAINTCLIPBOARD,

(WPARAM) hwnd, (LPARAM) hglb);

GlobalFree(hglb);

break;

case CF_BITMAP:

hdcMem = CreateCompatibleDC(hdc);

if (hdcMem != NULL)

{

if(OpenClipboard(hwnd))

{

hbm = (HBITMAP)

GetClipboardData(uFormat);

SelectObject(hdcMem, hbm);

GetClientRect(hwnd, &rc);

BitBlt(hdc,0,0,rc.right,rc.bottom,

hdcMem, 0, 0, SRCCOPY);

CloseClipboard();

}

DeleteDC(hdcMem);

}

break;

case CF_TEXT:

if(OpenClipboard(hwnd))

{

hglb = GetClipboardData(uFormat);

lpstr = GlobalLock(hglb);

GetClientRect(hwnd, &rc);

DrawText(hdc, lpstr, -1, &rc, DT_LEFT);

GlobalUnlock(hglb);

CloseClipboard();

}

break;

case CF_ENHMETAFILE:

if(OpenClipboard(hwnd))

{

hemf = GetClipboardData(uFormat);

GetClientRect(hwnd, &rc);

PlayEnhMetaFile(hdc, hemf, &rc);

CloseClipboard();

}

break;

case 0:

GetClientRect(hwnd, &rc);

DrawText(hdc,“剪贴板为空”,-1,

& rc,DT_CENTER | DT_SINGLELINE |

DT_VCENTER);

break;

默认:

GetClientRect(hwnd, &rc);

DrawText(hdc,“无法显示格式”,-1,

& rc,DT_CENTER | DT_SINGLELINE |

DT_VCENTER);

}

EndPaint(hwnd, &ps);

break;

case WM_SIZE:

if (uFormat == CF_OWNERDISPLAY)

{

hwndOwner = GetClipboardOwner();

hglb = GlobalAlloc(GMEM_DDESHARE, sizeof(RECT));

lprc = GlobalLock(hglb);

GetClientRect(hwnd, lprc);

GlobalUnlock(hglb);

SendMessage(hwndOwner,WM_SIZECLIPBOARD,

(WPARAM) hwnd, (LPARAM) hglb);

GlobalFree(hglb);

}

break;

case WM_CREATE:

//将窗口添加到剪贴板查看器链。

hwndNextViewer = SetClipboardViewer(hwnd);

break;

case WM_CHANGECBCHAIN:

//如果下一个窗口关闭,修复链。

if ((HWND) wParam == hwndNextViewer)

hwndNextViewer = (HWND) lParam;

//否则,将消息传递到下一个链接。

else if (hwndNextViewer != NULL)

SendMessage(hwndNextViewer, uMsg, wParam, lParam);

break;

case WM_DESTROY:

ChangeClipboardChain(hwnd, hwndNextViewer);

PostQuitMessage(0);

break;

case WM_DRAWCLIPBOARD: //剪贴板内容已更改。

//使用自动剪贴板格式更新窗口。

SetAutoView(hwnd);

//将消息传递到剪贴板中的下一个窗口

//查看器链。

SendMessage(hwndNextViewer, uMsg, wParam, lParam);

break;

case WM_INITMENUPOPUP:

if(!HIWORD(lParam))

InitMenu(hwnd, (HMENU) wParam);

break;

case WM_COMMAND:

开关(LOWORD(wParam))

{

case IDM_EXIT:

DestroyWindow(hwnd);

break;

case IDM_AUTO:

SetAutoView(hwnd);

break;

默认:

fAuto = FALSE;

uFormat = LOWORD(wParam);

InvalidateRect(hwnd, NULL, TRUE);

}

break;

默认:

return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return (LRESULT) NULL;

}

void WINAPI SetAutoView(HWND hwnd)

{

static UINT auPriorityList[] = {

CF_OWNERDISPLAY,

CF_TEXT,

CF_ENHMETAFILE,

CF_BITMAP

};

uFormat = GetPriorityClipboardFormat(auPriorityList, 4);

fAuto = TRUE;

InvalidateRect(hwnd, NULL, TRUE);

UpdateWindow(hwnd);

}

void WINAPI InitMenu(HWND hwnd,HMENU hmenu)

{

UINT uFormat;

char szFormatName[80];

LPCSTR lpFormatName;

UINT fuFlags;

UINT idMenuItem;

//如果菜单不是显示菜单,则不需要初始化。

if (GetMenuItemID(hmenu, 0) != IDM_AUTO)

return;

//删除除第一个以外的所有菜单项。

while(GetMenuItemCount(hmenu)> 1)

DeleteMenu(hmenu, 1, MF_BYPOSITION);

//检查或取消选中自动菜单项。

fuFlags = fAuto ? MF_BYCOMMAND | MF_CHECKED :

MF_BYCOMMAND | MF_UNCHECKED;

CheckMenuItem(hmenu, IDM_AUTO, fuFlags);

//如果没有剪贴板格式,返回。

if (CountClipboardFormats() == 0)

return;

//打开剪贴板。

if(!OpenClipboard(hwnd))

return;

//为每种格式添加一个分隔符,然后添加一个菜单项。

AppendMenu(hmenu, MF_SEPARATOR, 0, NULL);

uFormat = EnumClipboardFormats(0);

而(uFormat)

{

//调用应用程序定义的函数来获取名称

//的剪贴板格式。

lpFormatName = GetPredefinedClipboardFormatName(uFormat);

//对于注册格式,获取注册名称。

if (lpFormatName == NULL)

{

if(GetClipboardFormatName(uFormat,szFormatName,

sizeof(szFormatName)))

lpFormatName = szFormatName;

其他

lpFormatName = "(unknown)";

}

//为格式添加菜单项。可显示

//格式,使用菜单ID的格式ID。

if(IsDisplayableFormat(uFormat))

{

fuFlags = MF_STRING;

idMenuItem = uFormat;

}

其他

{

fuFlags = MF_STRING | MF_GRAYED;

idMenuItem = 0;

}

AppendMenu(hmenu, fuFlags, idMenuItem, lpFormatName);

uFormat = EnumClipboardFormats(uFormat);

}

CloseClipboard();

}

BOOL WINAPI IsDisplayableFormat(UINT uFormat)

{

开关(uFormat)

{

case CF_OWNERDISPLAY:

case CF_TEXT:

case CF_ENHMETAFILE:

case CF_BITMAP:

return TRUE;

}

return FALSE;

}