我遇到了来自Windows剪贴板的blitting位图的问题。位图通过Printscreen按钮到达此处。
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%肯定在剪贴板中有一个图像(否则应用程序会崩溃)当我在(例如)油漆中检查它时,可以粘贴它。
我错过了什么?
答案 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完成后我不需要它。