另一个从剪贴板线程绘制位图

时间:2013-10-25 23:20:55

标签: c++ winapi

我遇到了来自Windows剪贴板的blitting位图的问题。位图通过Printscreen按钮到达此处。

这是我的代码基于:VC++ win32 API programming :how can i get the image out of the clipboard and display it in a 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%肯定在剪贴板中有一个图像(否则应用程序会崩溃)当我在(例如)油漆中检查它时,可以粘贴它。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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完成后我不需要它。