2010-07-11 6 views
1

내가 GDI를 사용하고 + 윈도우 스냅 샷을 코드는 다음과 같습니다WinAPI/GDI : 대형 윈도우의 스냅 샷에 작업 표시 줄이 포함되어있는 이유는 무엇입니까?

있는 hDC 함께 이전에 설정되어
CComBSTR bstrfname (fname); 

HDC hdc = CreateCompatibleDC (hDC); 
HBITMAP hbmp = CreateCompatibleBitmap (hDC, CFG_WIDTH, CFG_HEIGHT); 
HBITMAP hbmp0 = (HBITMAP)SelectObject (hdc, hbmp); 
BitBlt (hdc, 0, 0, CFG_WIDTH, CFG_HEIGHT, hDC, 0, 0, SRCCOPY); 

Gdiplus::Bitmap *bmp = new Gdiplus::Bitmap (hbmp, NULL); 
CLSID encoderClsid; GetEncoderClsid (L"image/png", &encoderClsid); 
bmp->Save (bstrfname, &encoderClsid, NULL); 
delete bmp; 

SelectObject (hdc, hbmp0); 
DeleteObject (hbmp); 
DeleteDC (hdc); 

:

hWnd=CreateWindowEx(...); hDC=GetDC(hWnd); 

이 작은 창 완벽하게 작동하지만, 나는 를 창은 더 큰하려고하면 화면보다, 그 결과는 다음과 같습니다

http://yfrog.com/5n70452691p

즉, 작업 표시 줄이

을 받고있다 구원 받았다. 뭐라 구요?

+0

저는 BitBlt 대신 PrintWindow를 시도했습니다. 작업 표시 줄이 없지만 창 내용이 없습니다. ( – anon

+0

아직 확실하지 않지만 "픽셀 소유권 테스트"와 관련 있다고 생각합니다. http://www.opengl.org/resources/ faq/technical/rasterization.htm # rast0070 (그 창에서 OpenGL을 사용하고 있기 때문에) – anon

답변

3

이것은 정상적인 현상이며, 이와 같은 스크린 샷은 모니터에서보고있는 것과 정확히 일치합니다. 작업 표시 줄 포함. 캡처 할 영역을 캡처 할 창의 경계로 제한해야합니다. GetWindowRect()를 사용하여 BitBlt()에 전달한 인수와 비트 맵의 ​​크기를 적절하게 조정하십시오.

PrintWindow는 대상 창이 WM_PRINT 및 WM_PRINTCLIENT 메시지를 구현하는 경우에만 작동합니다. 구현하기 쉽지만 종종 간과됩니다.

+0

고마워,하지만 실제로이 큰 창을 나 자신으로 만들고있어. 우연히 나가서 그 자리를 벗어나는 것 같지는 않다. 위의 링크는 내가 원하는 것처럼 보이지 않을 수도 있습니다. – anon

+0

아마도 다른 질문을 던져야 할 것입니다. 어둡거나/오프 스크린 된 영역을 포함하여 창을 캡처하는 방법은 무엇입니까? – anon

+1

글쎄, 그렇기 때문에 PrintWindow가 있습니다. 그러나 창에서 지원하지 않거나 지원하지 않는 하위 창을 포함하면 완료됩니다. –