大虾指教下如何操作区域截图呢?
是不是首先把整个屏幕截取下来,然后显示在整个屏幕上,然后就是在自己截取下的屏幕上进行鼠标的选取操作?如果是,那截取下的屏幕是放在剪贴板上的,如何显示出来覆盖整个窗口呢?如果不是,该如何解决呢

解决方案 »

  1.   

    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 hBitmap = ::CreateCompatibleBitmap(hScreenDC,screensize.cx,screensize.cy);
    HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
    ::BitBlt(MemDC,0,0,screensize.cx,screensize.cy,hScreenDC,rect.left,rect.top,SRCCOPY);
    ::SelectObject(MemDC,hOldBMP);
    ::DeleteObject(MemDC);
    ::ReleaseDC(hWnd,hScreenDC);
    这段代码就可以获得整个屏幕的拷贝,如何把它全屏呢
      

  2.   

    简单的截图程序是这样,截取桌面dc图像,建立一个对话框(放大到全屏),把桌面dc图像显示到这个对话框上, 这个对话框的wndproc来处理鼠标左键按下和释放
    我也做过这个东西,不过这种方法截取不到任务栏
      

  3.   

    vckbase.com里有一个跟QQ一样的小程序,可以下载来看看
    http://www.vckbase.com/document/viewdoc/?id=1673
      

  4.   

    我作过类似的程序,可以截取全屏,包括任务拦lpRect ----- 需要截取屏幕的区域
    HBITMAP GetBMPFormScreen(CRect* lpRect)
    {
    // 屏幕和内存设备描述表
    HDC       hScrDC, hMemDC;      
    // 屏幕和内存设备描述表
    HBITMAP    hBitmap, hOldBitmap;   
    // 位图句柄
    int       nX, nY, nX2, nY2;      
    // 选定区域坐标
    int       nWidth, nHeight;      
    // 位图宽度和高度
    int       xScrn, yScrn;         
    // 屏幕分辨率 // 确保选定区域不为空矩形
        if (IsRectEmpty(lpRect))
    return NULL;
    //为屏幕创建设备描述表
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    //为屏幕设备描述表创建兼容的内存设备描述表
    hMemDC = CreateCompatibleDC(hScrDC);
    // 获得选定区域坐标
    nX = lpRect->left;
        nY = lpRect->top;
        nX2 = lpRect->right;
        nY2 = lpRect->bottom;
        // 获得屏幕分辨率
        xScrn = GetDeviceCaps(hScrDC, HORZRES);
        yScrn = GetDeviceCaps(hScrDC, VERTRES);
        //确保选定区域是可见的
        if (nX < 0)
        nX = 0;
    if (nY < 0)
        nY = 0;
        if (nX2 > xScrn)
        nX2 = xScrn;
        if (nY2 > yScrn)
        nY2 = yScrn;
    nWidth = nX2 - nX;
    nHeight = nY2 - nY;
        // 创建一个与屏幕设备描述表兼容的位图
    hBitmap = CreateCompatibleBitmap
    (hScrDC, nWidth, nHeight);
        // 把新位图选到内存设备描述表中
        hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
        // 把屏幕设备描述表拷贝到内存设备描述表中
    BitBlt(hMemDC, 0, 0, nWidth, nHeight,
    hScrDC, nX, nY, SRCCOPY);
        //得到屏幕位图的句柄
        hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);

        //清除 
        DeleteDC(hScrDC);
        DeleteDC(hMemDC);
    return hBitmap;
    }
      

  5.   

    多谢各位的帮忙,看来不少人和我有一样的疑问
      
     cdo(Everything has a favourable turn)
    提供的例子很不错,在此谢过了