我正在Windows上为我的应用程序沙箱系统实现剪贴板。我必须自己模拟剪贴板的行为。现在,除了格式转换部分,所有的工作都很好,我可以为CF_TEXT/UNICODETEXT/OEMTEXT做这件事,但还有其他我不熟悉的格式,比如DIB。有任何示例代码说明Windows是如何做到这一点的吗?
CF_DIB
与其他剪贴板格式的区别在于它包含BITMAPINFO
结构的内存对象和位图位。
msdn文档提供了一个非常详细的例子:
HINSTANCE hinst;
UINT uFormat = (UINT)(-1);
BOOL fAuto = TRUE;
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam)
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;
switch (uMsg)
{
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
// Branch depending on the clipboard format.
switch (uFormat)
{
case CF_OWNERDISPLAY:
...
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;
...
如果需要将获得的位图对象保存为文件,则必须严格按照BITMAPINFOHEADER结构进行赋值。
MSDN代码示例:存储图像