用于HDC的HDC到HDC

时间:2016-01-24 18:05:40

标签: c windows

我想将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);

2 个答案:

答案 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;