(转)如何抓取屏幕并显示在SDI中?

文章来自VC知识库:http://www.vckbase.com/vckbase/default.aspx

 建立名为My的SDI工程.在CMyView中加入函数:TakeScreen()函数.
    如下:
    HBITMAP CMyView::TakeScreen()
    {
         HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
         HDC hScreenDC = ::GetDC(hWnd);   //获得屏幕的HDC.
         HDC MemDC = ::CreateCompatibleDC(hScreenDC);
         RECT rect;
         ::GetWindowRect(hWnd,&rect);
         SIZE screensize;
         screensize.cx=rect.right-rect.left;
         screensize.cy=rect.bottom-rect.top;
         HBITMAP Bitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
         HGDIOBJ hOldBMP = ::SelectObject(MemDC,Bitmap);
         ::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY);
         ::SelectObject(MemDC,hOldBMP);
         ::DeleteObject(MemDC);
         ::ReleaseDC(hWnd,hScreenDC);
         return Bitmap;
    }//抓取屏幕的HBITMAP.

    在CMyView::OnDraw()中调用TakeScreen():
    void CGetScreenBmpView::OnDraw(CDC* pDC)
    {
         CGetScreenBmpDoc* pDoc = GetDocument();
         ASSERT_VALID(pDoc);
         // TODO: add draw code for native data here
         CBitmap *Bitmap;
         Bitmap=CBitmap::FromHandle(TakeScreen());
         CDC MemDC;
         MemDC.CreateCompatibleDC(pDC);
         CBitmap *pOldBitmap=MemDC.SelectObject(Bitmap);
         BITMAP bm;
         Bitmap->GetObject(sizeof(BITMAP),&bm);
         pDC->BitBlt(10,10,bm.bmWidth,bm.bmHeight,&MemDC,0,0,SRCCOPY);
         MemDC.SelectObject(pOldBitmap);
    }//显示抓取来的HBITMAP.

你可能感兴趣的:((转)如何抓取屏幕并显示在SDI中?)