【发布时间】:2011-11-02 05:33:53
【问题描述】:
如何将以下 C++ 代码(用于从剪贴板获取位图并将其复制到表单上)转换为也使用 API(不是 .NET Framework 中的内置剪贴板助手)的 WPF C# 代码来复制它进入 BitmapSource(或 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);
}
我的在 WPF C# 代码中的实现如下。大概是大错特错了。问题是我从中得到了黑色图像。
IntPtr hdc = CreateCompatibleDC(IntPtr.Zero);
IntPtr hdcMem = CreateCompatibleBitmap(hdc, 64, 64);
if (hdcMem != null)
{
if (OpenClipboard(MainWindow.Handle))
{
IntPtr hbm = GetClipboardData((uint)clipboardFormat);
SelectObject(hdcMem, hbm);
BitBlt(hdc, 0, 0, 64, 64, hdcMem, 0, 0, TernaryRasterOperations.SRCCOPY);
CloseClipboard();
}
DeleteDC(hdcMem);
}
【问题讨论】:
-
为什么要更改原代码?那就是你的错误所在。例如,在您的版本中 hdcMem 被命名为好像您认为它是一个显示上下文,并且它被用作一个显示上下文(在 SelectObject 中)但它不是,它是一个位图。
-
那么原始代码从剪贴板复制到屏幕。我想从剪贴板复制到位图。你解决了我的问题。你能帮我解决吗?
-
类似
IntPtr hDstdc = CreateCompatibleDC(IntPtr.Zero); IntPtr hDstBm = CreateCompatibleBitmap(hDstdc, 64, 64); SelectObject(hDstdc, hDstBm); IntPtr hSrcdc = CreateCompatibleDC(IntPtr.Zero); ... IntPtr hDstbm = GetClipboardData((uint)clipboardFormat); SelectObject(hDstDc, hDstbm); BitBlt(hDstdc, 0, 0, 64, 64, hSrcdc, 0, 0, TernaryRasterOperations.SRCCOPY)。您必须创建两个显示上下文,然后创建目标位图并从剪贴板获取源位图,然后将每个位图选择到显示上下文中,然后调用 BitBlt。 -
但是真的好久没做这些东西了,我没有做任何承诺。
-
那行得通。将其作为解决方案发布,我会给你积分,就像你应得的一样。