我想将hdc blit到另一个hdc,而这个hdc将是blit进入包含“BeginPaint”的hdc。但是出现了问题,没有任何内容。
这是代码,谢谢,
HDC hdcMem3 = CreateCompatibleDC(NULL);
SelectObject(hdcMem3, Picture);
BITMAP bitmap;
GetObject(Picture, sizeof(bitmap), &bitmap);
HDC hdcMem2 = CreateCompatibleDC(NULL);
BitBlt(hdcMem2, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem3, 0, 0, SRCCOPY);
DeleteDC(hdcMem3);
BitBlt(hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem2, 0, 0, SRCCOPY);
DeleteDC(hdcMem2);
答案 0 :(得分:0)
CreateCompatibleDC
使用1像素单色位图创建设备上下文。
在您的示例中,hdcMem3
引用的设备上下文具有实际位图,但hdcMem2
引用的DC仅具有1像素单色位图。当你从hdcMem3
blit到hdcMem2
时,你最终可能会得到1个黑色像素。
您需要创建一个内存位图以选择hdcMem2
。我假设,最终,你将在一个窗口中显示它。假设您有一个名为hdcWindow
的窗口的设备上下文。
// Create a memory bitmap that's compatible with the window (screen) and
// the same size as Picture.
hbmpMem2 = CreateCompatibleBitmap(hdcWindow, bitmap.bmWidth, bitmap.bmHeight);
hbmpOld2 = SelectObject(hdcMem2, hbmpMem2);
现在,当您对hdcMem2执行操作时,它将绘制到真实的位图。
完成hdcMem2
后,您需要先处理hbmpMem2
:
SelectObject(hdcMem2, hbmpOld2);
DeleteObject(hbmpMem2);
DestroyDC(hdcMem2);
答案 1 :(得分:0)
好的工作!但是我发现了一件事:
BITMAP bitmap;
GetObject(picture, sizeof(bitmap), &bitmap);
LPBITMAPINFO Hbitmap = new BITMAPINFO;
Hbitmap->bmiHeader.biSize = sizeof(Hbitmap->bmiHeader);
Hbitmap->bmiHeader.biWidth = 300;
Hbitmap->bmiHeader.biHeight = 300;
Hbitmap->bmiHeader.biPlanes = 1;
Hbitmap->bmiHeader.biBitCount = 32;
Hbitmap->bmiHeader.biCompression = BI_RGB;
Hbitmap->bmiHeader.biSizeImage = 300 * 4 * 300;
Hbitmap->bmiHeader.biClrUsed = 0;
Hbitmap->bmiHeader.biClrImportant = 0;
HDC hdcMem3 = CreateCompatibleDC(NULL);
SelectObject(hdcMem3, picture);
HDC hdcMem2 = CreateCompatibleDC(NULL);
HBITMAP BhdcMem2 = CreateDIBSection(hdcMem2, Hbitmap, DIB_RGB_COLORS,0, 0, 0);
SelectObject(hdcMem2, BhdcMem2);
BitBlt(hdcMem2, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem3, 0, 0, SRCCOPY);
BitBlt(hdcMem, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdcMem2, 0, 0, SRCCOPY);
DeleteDC(hdcMem2);
DeleteDC(hdcMem3);
delete Hbitmap;