如果窗口使用CF_OWNERDISPLAY剪贴板格式将信息放在剪贴板上,则必须执行以下操作:
*处理WM_PAINTCLIPBOARD消息。当剪贴板查看器窗口的一部分必须重新绘制时,此消息将发送到剪贴板所有者。
*处理WM_SIZECLIPBOARD消息。当剪贴板查看器窗口已调整大小或其内容已更改时,此消息将发送到剪贴板所有者。
通常,窗口通过设置剪贴板查看器窗口的滚动位置和范围来响应此消息。响应于此消息,标签应用程序还会更新剪贴板查看器窗口的SIZE结构。
*处理WM_HSCROLLCLIPBOARD和WM_VSCROLLCLIPBOARD邮件。当剪贴板查看器窗口中出现滚动条事件时,这些消息将发送到剪贴板所有者。
*处理WM_ASKCBFORMATNAME消息。剪贴板查看器窗口将此消息发送到应用程序以检索所有者显示格式的名称。
Label应用程序的窗口过程处理这些消息,如下所示。
LRESULT CALLBACK MainWindowProc(hwnd,msg,wParam,lParam)
HWND hwnd;
UINT msg;
WPARAM wParam;
LPARAM lParam;
{
static RECT rcViewer;
RECT rc;
LPRECT lprc;
LPPAINTSTRUCT lpps;
开关(msg)
{
//
//处理其他消息。
//
case WM_PAINTCLIPBOARD:
//确定标签的尺寸。
SetRect(& rc,0,0,
pboxLocalClip- > rcText.right + CX_MARGIN,
pboxLocalClip- > rcText.top * 2 + cyText
);
//将图像放在剪贴板查看器窗口中。
if(rc.right < rcViewer.right)
{
rc.left = (rcViewer.right - rc.right) / 2;
rc.right += rc.left;
}
if(rc.bottom < rcViewer.bottom)
{
rc.top = (rcViewer.bottom - rc.bottom) / 2;
rc.bottom += rc.top;
}
//使用指定的PAINTSTRUCT绘制图像
//结构,通过调用应用程序定义
// PaintLabel函数。
lpps = (LPPAINTSTRUCT) GlobalLock((HGLOBAL) lParam);
PaintLabel(lpps, pboxLocalClip, &rc);
GlobalUnlock((HGLOBAL) lParam);
break;
case WM_SIZECLIPBOARD:
//将窗口的尺寸保存为静态
// RECT结构。
lprc = (LPRECT) GlobalLock((HGLOBAL) lParam);
memcpy(&rcViewer, lprc, sizeof(RECT));
GlobalUnlock((HGLOBAL) lParam);
//将滚动范围设置为零(从而消除
//需要处理WM_HSCROLLCLIPBOARD和
// WM_VSCROLLCLIPBOARD消息)。
SetScrollRange((HWND) wParam, SB_HORZ, 0, 0, TRUE);
SetScrollRange((HWND) wParam, SB_VERT, 0, 0, TRUE);
break;
case WM_ASKCBFORMATNAME:
LoadString(hinst,IDS_OWNERDISPLAY,
(LPSTR) lParam, wParam);
break;
默认:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}