2

我遇到了从 Windows 剪贴板传送位图的问题。位图通过 Printscreen 按钮到达这里。

这是我的代码基于:VC++ win32 API 编程:如何从剪贴板中获取图像并将其显示在 winodws 中?

bool SetBackgroundImage(HWND hwnd) {

    GetPrintScreen(hwnd));

    OpenClipboard(NULL);
    HBITMAP Image = (HBITMAP)GetClipboardData(CF_BITMAP);
    PAINTSTRUCT ps;
    HDC wdc = BeginPaint(hwnd,&ps);
    HDC mdc = CreateCompatibleDC(wdc);
    SelectObject(mdc,Image);
    BitBlt(wdc,0,0,1000,700,mdc,10,10,SRCCOPY);
    DeleteDC(mdc);
    EndPaint(hwnd,&ps);
    CloseClipboard();

    return true;
}

(我已经放弃了整个错误处理等)我 99% 确定剪贴板中有一个图像(否则应用程序会崩溃),当我在(ex)paint 中检查它时,也可以粘贴它。

我错过了什么?

4

2 回答 2

2

您的窗口没有任何无效区域,因此BeginPaint会生成一个完全被剪裁的 HDC。

BeginPaint只能在WM_PAINT处理程序中使用。如果您想在外面画画WM_PAINT(这通常不是一个好主意;只有在您确定自己知道自己在做什么的情况下才尝试),请GetDC改用。

于 2013-10-25T23:43:52.127 回答
0

这对我有用:

case WM_PAINT:
    {
        hdc = BeginPaint(hWnd, &ps);

        OpenClipboard(NULL);
        HBITMAP Image = (HBITMAP)GetClipboardData(CF_BITMAP);
        if(Image)
        {
            PAINTSTRUCT ps;
            HDC mdc = CreateCompatibleDC(hdc);
            SelectObject(mdc, Image);
            BitBlt(hdc, 0, 0, 1000, 700, mdc, 10, 10, SRCCOPY);
            DeleteDC(mdc);
        }
        CloseClipboard();

        EndPaint(hWnd, &ps);
    }
    break;

在以下文档中值得注意BeginPaint

除非响应 WM_PAINT 消息,否则应用程序不应调用 BeginPaint。对 BeginPaint 的每次调用都必须有对 EndPaint 函数的相应调用。

因此,您需要将绘图代码放入您的绘图处理程序中。目前尚不清楚这是否是您所做的。如果您想在代码中的另一个位置从剪贴板中检索位图,您可以,但您需要制作它的副本,因为一旦您关闭剪贴板,它将被销毁。这在这里不是问题,因为在 blit 完成后我不需要它。

于 2013-10-25T23:44:23.327 回答