2017-06-19 109 views
0

我今天遇到的一個非常奇怪的問題。在MFC項目的VC6下運行代碼,它是黑屏,它完美的工作,並顯示桌面圖片,如果我拿出評論。然而,這些代碼在無限循環中執行,所以我嘗試減少內存複製和內存花費,如BitBltCreateCompatibleBitmap等。我不明白我的程序如何與這些註釋代碼相關。任何人都知道是什麼原因導致問題,爲什關於GetDIBits和設備上下文的奇怪錯誤

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); 
+0

堆棧溢出不是尋求幫助的地方,可以解釋**你的**代碼。你應該知道,你的代碼是幹什麼的。嚴重的是,VC6?如果你關心性能,升級到在這個千年中寫的東西。 – IInspectable

+0

我很多的項目仍然在VC6中運行,並且它們穩定而且很好...我完全同意,它是一箇舊的編譯器,但是可靠...並且來自VC6的代碼應該在VC6中運行良好。 – flaviu2

+0

@ flaviu2:VC6不支持任何**當前支持的Windows版本(即Windows Vista)。使用不支持你的目標的工具沒有什麼可靠的。另外,實際上仍然理解VC6的C++版本的開發人員羣體正在縮小。 – IInspectable

回答

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()獲取桌面位的解決方法。