2012-08-07 150 views
0

我有一個使用CDC繪製網格的應用程序(它具有文本,矩形和位圖)。我想在保存完成的網格時截取它,並將該截圖用作文件的「預覽」。MFC C++屏幕截圖

如何截取我的應用程序並保存它?

謝謝

回答

0

最後,我終於實現了這種方式,因爲我想捕捉即使窗口的隱蔽部位(由於內容超出屏幕和要求滾動):

CDC* WindowToCaptureDC = AfxGetMainWnd()->GetWindowDC(); 
CDC CaptureDC; 
CDC MemDC; 
MemDC.CreateCompatibleDC(WindowToCaptureDC); 
CaptureDC.CreateCompatibleDC(WindowToCaptureDC); 

CBitmap CaptureBmp; 
CBitmap ResizeBmp; 
int pWidth = grid.tableWidth + grid.marginLeft*2; 
int pHeight = grid.tableHeight + grid.marginBottom; 

CaptureBmp.CreateCompatibleBitmap(WindowToCaptureDC, pWidth, pHeight); 
CaptureDC.SelectObject(&CaptureBmp); 

CBrush brush(RGB(255, 255, 255)); 
CaptureDC.SelectObject(&brush); 
CaptureDC.Rectangle(0, 0, pWidth, pHeight); 

///德魯物品進入CaptureDC像我一樣的OnDraw中的位置///

double width = //desired width; 
double height = //desired width; 

    //maintain aspect ratio 
if(pWidth!=width || pHeight!=height) 
{ 
    double w = width/pWidth; 
    double h = height/pHeight; 
    if(w < h) 
     height = height*w; 
    else 
     width = width*h; 
} 

ResizeBmp.CreateCompatibleBitmap(WindowToCaptureDC, width, height); 
MemDC.SelectObject(&ResizeBmp); 

MemDC.StretchBlt(0, 0, width, height, &CaptureDC, 0, 0, pWidth, pHeight, SRCCOPY); 

CImage TempImageObj; 
TempImageObj.Attach((HBITMAP)ResizeBmp.Detach()); 
CString filePath = _T("LOCATION\\image.bmp"); 
TempImageObj.Save(filePath); 
0

回答is here

void CScreenShotDlg::OnPaint() 
{ 
    // device context for painting 
    CPaintDC dc(this); 

    // Get the window handle of calculator application. 
    HWND hWnd = ::FindWindow(0, _T("Calculator")); 

    // Take screenshot. 
    PrintWindow(hWnd, 
       dc.GetSafeHdc(), 
       0); 
} 
+0

感謝您指點我在正確的方向 – mgalal 2012-08-07 23:49:31

+0

雖然我結束了使用不同的方法來截圖。我需要捕捉窗口的隱藏部分,PrintWindow也沒有捕獲它。 – mgalal 2012-08-08 00:01:23