简单截图代码win32 MFC

来源:互联网 发布:淘宝自动回复优美语句 编辑:程序博客网 时间:2024/04/30 03:33
void CPicDlg::OnBnClickedOk()
{
    // TODO: 在此添加控件通知处理程序代码
    
    HDC hDC = ::GetWindowDC( GetDesktopWindow()->GetSafeHwnd() );

    if( hDC )
    {
        HDC hOldDC = CreateCompatibleDC( hDC );
        HDC hMemDC = CreateCompatibleDC( hDC );

      
        TCHAR fileName[MAX_PATH] = {0};
        OPENFILENAME ofn ;//
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.lpstrFilter = TEXT("位图(*.bmp)\0*.bmp;\0");
        ofn.lpstrDefExt         = TEXT("bmp");
        ofn.lStructSize         = sizeof(OPENFILENAME);
        ofn.hwndOwner           = m_hWnd ;
        ofn.hInstance           = NULL;
        ofn.nFilterIndex        = 1;
        ofn.lpstrCustomFilter   = NULL;
        ofn.nMaxCustFilter      = 0;
        ofn.lpstrFile           = fileName;
        ofn.nMaxFile            = MAX_PATH;
        ofn.lpstrFileTitle      = NULL;
        ofn.nMaxFileTitle       = 0;
        //ofn.lpstrInitialDir     = ;
        ofn.lpstrTitle            = TEXT("保存交汇地图信息");
        ofn.Flags               = OFN_HIDEREADONLY ;
        ofn.nFileOffset         = 0;
        ofn.nFileExtension      = 0;        
        ofn.lCustData           = 0L;
        ofn.lpfnHook            = NULL;
        ofn.lpTemplateName      = NULL;
        //保存文件接口

        RECT rtDestRect = {0};
        ::GetClientRect(  GetDesktopWindow()->GetSafeHwnd(),  &rtDestRect );
        HBITMAP hOldBM = CreateCompatibleBitmap( hDC, rtDestRect.right - rtDestRect.left, rtDestRect.bottom - rtDestRect.top );
        SelectObject( hOldDC, hOldBM );
        BitBlt( hOldDC, 0, 0, rtDestRect.right - rtDestRect.left, rtDestRect.bottom - rtDestRect.top, hDC, 0, 0, SRCCOPY );

//         int height = rtDestRect.bottom - rtDestRect.top;
//         int weight = rtDestRect.right  - rtDestRect.left;

        Sleep( 200 );
        HBITMAP hMemBM = CreateCompatibleBitmap( hOldDC,rtDestRect.right - rtDestRect.left, rtDestRect.bottom - rtDestRect.top ) ;
        SelectObject( hMemDC , hMemBM );
        StretchBlt( hMemDC, 0, 0, rtDestRect.right - rtDestRect.left, rtDestRect.bottom - rtDestRect.top, hOldDC, 0, 0, rtDestRect.right - rtDestRect.left, rtDestRect.bottom - rtDestRect.top, SRCCOPY );
LOOP:       
        if (!GetSaveFileName(&ofn))      
        {
            DeleteDC( hMemDC );
            DeleteObject( hMemBM );
            ::ReleaseDC( GetDesktopWindow()->GetSafeHwnd(), hDC );
            return;
        }

        UINT num = 0, size = 0;
        Gdiplus::ImageCodecInfo* pImageCodeInfo = NULL;

        Gdiplus::GetImageEncodersSize( &num, &size );

        if ( 0 == size )
        {
            DeleteDC( hMemDC );
            DeleteObject( hMemBM );
            ::ReleaseDC( GetDesktopWindow()->GetSafeHwnd(), hDC );
            return ;
        }

        pImageCodeInfo = ( Gdiplus::ImageCodecInfo* )new BYTE[size];

        if ( NULL == pImageCodeInfo )
        {
            DeleteDC( hMemDC );
            DeleteObject( hMemBM );
            ::ReleaseDC( GetDesktopWindow()->GetSafeHwnd(), hDC );
            return ;
        }

        GetImageEncoders( num, size, pImageCodeInfo );

        size = 0;

        char m_szImgFile[MAX_PATH] = {0}; //用于保存返回的文件路径
        
        for ( size = 0; size < num; ++size )
        {
            if ( 0 == wcscmp( pImageCodeInfo[size].MimeType, L"image/bmp" ))
            {
                WCHAR wcsFileName[256] = L"";

                MultiByteToWideChar( CP_ACP, 0, fileName, -1, wcsFileName, 256 );

                Gdiplus::Bitmap bitmap( hMemBM, NULL );
                //保存为BMP文件
                bitmap.Save( wcsFileName, &pImageCodeInfo->Clsid );

                WideCharToMultiByte( CP_ACP, 0, wcsFileName, -1, m_szImgFile, 260, NULL, NULL );

                delete pImageCodeInfo;
                DeleteDC( hMemDC );
                DeleteObject( hMemBM );
                ::ReleaseDC( GetDesktopWindow()->GetSafeHwnd(), hDC );
                //AfxMessageBox( "截图成功!" , MB_OK);
                return;
            }
        }

    DeleteDC( hOldDC );
    DeleteObject( hOldBM );

    OnOK();
    }

}



             keybd_event(VK_SNAPSHOT, 0, 0, 0);
             keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);

             Sleep(200);

             HBITMAP hMemBM;
             if (OpenClipboard())
             {
                 hBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
                 if (NULL != hBitmap)
                 {
                     HBITMAP hOld = (HBITMAP)::SelectObject(hMemDC, hBitmap);

                 }
                 CloseClipboard();
             }

这段代码是模拟系统截图

原创粉丝点击