我用下面的代码来获取VIEW区域。但我发现只能保存在屏幕的显示的VIEW部分,对于未显示的部分保存的却是屏幕的内容。我曾看到类似的帖子有人说可以用双缓冲模式,对内存区域做同样的操作,我想问这种方式具体如何操作,有代码就更好了,谢谢了!!
HDC hBufDC;
HBITMAP hBitmap, hBitTemp;

//创建设备上下文(HDC)
hBufDC = CreateCompatibleDC(hDC);

//创建HBITMAP
hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

//得到位图缓冲区
// StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
// hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
StretchBlt(hBufDC, 0, 0, 200, 200,
hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);

//得到最终的位图信息
hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

//释放内存

DeleteObject(hBitTemp);
::DeleteDC(hBufDC);

return hBitmap;

解决方案 »

  1.   

    StretchBlt(hBufDC, 0, 0, 200, 200,
    hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
    这样拷贝是不行的。
    你用View的重画函数在hBufDC上进行绘制。就可以将视图区的内容画到内存位图上了。
      

  2.   

    我试着重新调用OnDraw,但看起来保存的图片好象是黑的!!
    我再试一下!!
      

  3.   

    我用LineTo重画了一下,但是保存下来的图片是黑色的,根本没有画上去。不知道是不是因为背景本来就是黑色的缘故啊??
      

  4.   

    不是调用OnDraw。你将OnDraw中的绘制程序单独建立一个函数。参数为CDC。在OnDraw中调用。然后,在你上面的程序中,调用这个函数,将内存DC作为参数传入就可以了。
      

  5.   

    怎么好象还是黑的。我建立了一个新的函数,把所以的绘图程序部分拷贝过去,OnDraw再调用这个函数,然后在我上面的保存函数在调用这个函数绘一次,对吗??我上面那个绘图函数要不要做什么改动呢??下面的改动对的吗??
    HDC hBufDC;
    HBITMAP hBitmap, hBitTemp;

    //创建设备上下文(HDC)
    hBufDC = CreateCompatibleDC(hDC);

    //创建HBITMAP
    hBitmap = CreateCompatibleBitmap(hDC, BitWidth, BitHeight);
    hBitTemp = (HBITMAP) SelectObject(hBufDC, hBitmap);

    //得到位图缓冲区
    // StretchBlt(hBufDC, 0, 0, BitWidth, BitHeight,
    // hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
    // StretchBlt(hBufDC, 0, 0, 200, 200,
    // hDC, 0, 0, BitWidth, BitHeight, SRCCOPY);
             OnDrawImage(hBufDC);//这样不对吗??

    //得到最终的位图信息
    hBitmap = (HBITMAP) SelectObject(hBufDC, hBitTemp);

    //释放内存

    DeleteObject(hBitTemp);
    ::DeleteDC(hBufDC);

    return hBitmap;
      

  6.   

    对啊。我把它保存为BMP。有一个函数用来保存。
      

  7.   

    应该没有问题吧。
    我用没有修改前的函数保存过没有问题,不过它保存的是屏幕的内容,而不是VIEW的内容。
    所以只能保存显示的区域。我的QQ是275481506,能不能交个朋友啊??