0

今天遇到一个很奇怪的问题。在带有MFC项目的VC6上运行以下代码,它是黑屏,如果我拿出评论,它可以完美运行并显示桌面图片。但是这些代码是在无限循环中执行的,所以我尝试减少内存复制和内存消耗等BitBltCreateCompatibleBitmap我不明白我的程序与这些注释代码有什么关系。任何人都知道导致问题的原因和原因?

HDC hdcDesktop = ::CreateDC("DISPLAY", NULL, NULL, NULL);
RECT desktopRect;
::GetWindowRect(::GetDesktopWindow(), &desktopRect);
int desktopWidth = desktopRect.right - desktopRect.left;
int desktopHeight = desktopRect.bottom - desktopRect.top;

HBITMAP hBitmap = CreateCompatibleBitmap(hdcDesktop, desktopWidth, desktopHeight);
/*
HDC hdcMemory = CreateCompatibleDC(hdcDesktop);
SelectObject(hdcMemory, hBitmap);
BitBlt(hdcMemory, 0, 0, desktopWidth, desktopHeight, hdcDesktop, 0, 0, SRCCOPY);
*/

BITMAPINFO bitmapInfo = {0};
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

GetDIBits(hdcDesktop, hBitmap, 0, 0, NULL, &bitmapInfo, DIB_RGB_COLORS);
BYTE *pData = new BYTE[bitmapInfo.bmiHeader.biSizeImage];
memset(pData, 0, bitmapInfo.bmiHeader.biSizeImage);
GetDIBits(hdcDesktop, hBitmap, 0, bitmapInfo.bmiHeader.biHeight, pData, &bitmapInfo, DIB_RGB_COLORS);

CRect destRect;
GetClientRect(&destRect);
StretchDIBits(::GetDC(m_hWnd), 0, 0, destRect.Width(), destRect.Height(), 0, 0, bitmapInfo.bmiHeader.biWidth, bitmapInfo.bmiHeader.biHeight, 
    pData, &bitmapInfo, DIB_RGB_COLORS, SRCCOPY);
4

1 回答 1

0

这就是为什么注释掉该部分不起作用的原因......

HBITMAP hBitmap = CreateCompatibleBitmap(hdcDesktop, desktopWidth, desktopHeight);

HDC hdcMemory = CreateCompatibleDC(hdcDesktop);
SelectObject(hdcMemory, hBitmap);

// BitBlt makes a copy of the desktop here.
BitBlt(hdcMemory, 0, 0, desktopWidth, desktopHeight, hdcDesktop, 0, 0, SRCCOPY);

BITMAPINFO bitmapInfo = {0};
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

// the following lines make use of the contents of bitmap in hBitmap
// commenting out the BitBlt would mean the bitmap is uninitialized.
//
GetDIBits(hdcDesktop, hBitmap, 0, 0, NULL, &bitmapInfo, DIB_RGB_COLORS);
BYTE *pData = new BYTE[bitmapInfo.bmiHeader.biSizeImage];
memset(pData, 0, bitmapInfo.bmiHeader.biSizeImage);  // <-- this is unnecessary.

GetDIBits(hdcDesktop, hBitmap, 0, bitmapInfo.bmiHeader.biHeight, pData, &bitmapInfo, DIB_RGB_COLORS);

您可以通过在应用程序的全局范围内创建 DIBSection、其关联的 BITMAPINFO 和 pData 缓冲区来优化您的代码。它的尺寸在相当长一段时间内都有效......您必须通过处理 WM_DISPLAYCHANGE 消息来注意屏幕分辨率的变化(https://msdn.microsoft.com/en-us/library/windows/desktop/ dd145210(v=vs.85).aspx )。

这将为您节省对 CreateCompatibleBitmap() 的重复调用。

不过,我看不到使用 BitBlt() 和 GetDIBits() 获取桌面位的解决方法。

于 2017-06-26T15:54:07.870 回答