我在CView里绘了一些图形。我想把它保存成位图。保存位图我会。
因为绘图都是在OnDraw里绘的,如果在这个函数里保存没问题。但是这样好像不够模块化。我想点击一下按钮然后保存图片。但是当在其它按钮中保存图片时,又获取不到那些LineTo之类的绘图操作,所以保存出来的都是漆黑一片。我想问问如何不在OnDraw中把我绘图的结果保存下来。

解决方案 »

  1.   

    是不是可以在doc里面生成一个存储位图的变量。
    在OnDraw里绘制的时候同时更新这个变量。
    这样你在别的按钮里想保存位图的话,把这个变量保存就可以了。
      

  2.   

    定义成员CBitmap m_bmp;用它创建兼容位图,先选入内存DC,在内存DC画,再贴出来,保存m_bmp的内容就行了。
      

  3.   

    看了shunruo的解答感觉有点理解了。但是在实践的时候我还有点小问题。我原来在绘图过程中保存的代码: // 位图文件头
    BITMAPFILEHEADER bmfh; // 位图信息头
    BITMAPINFO bmih;
    BYTE *pBytes; dcMem.CreateCompatibleDC( &dc );
    hBitmap = CreateDIBSection( dcMem.m_hDC, &bmih, DIB_PAL_COLORS, ( void** )&pBytes, NULL, 0 );
    m_Bitmap.Attach( hBitmap );
    dcMem.SelectObject( &m_Bitmap );
    dcMem.SetBkMode( TRANSPARENT );
    dcMem.SelectObject( &pen );
    dcMem.FillRect( &rect, &brush );
    dcMem.MoveTo( 0, 0 );
    dcMem.LineTo( 100, 100 ); CFile file;
    if( file.Open( "c:\\Test.bmp", CFile::modeWrite | CFile::modeCreate ) )
        {
            file.Write( &bmfh, sizeof( BITMAPFILEHEADER ) );
            file.Write( &bmih, bmih.bmiHeader.biSize + bmih.bmiHeader.biClrUsed * sizeof( RGBQUAD ) + bmih.bmiHeader.biSizeImage );
            file.Write( pBytes, rect.Width() * rect.Height() * 16 / 8 );
            file.Close();
        }
    采用了shunruo的方法时我是改成下面的样子: BYTE *pBytes; // 获取位图数组指针
    m_Bitmap.GetBitmapBits( bmih.bmiHeader.biWidth * bmih.bmiHeader.biHeight,( void** )&pBytes ); // 创建兼容DC
    dcMem.CreateCompatibleDC( &dc );
    dcMem.SelectObject( &m_Bitmap ); CFile file;
    if( file.Open( "c:\\Test.bmp", CFile::modeWrite | CFile::modeCreate ) )
        {
            file.Write( &bmfh, sizeof( BITMAPFILEHEADER ) );
            file.Write( &bmih, bmih.bmiHeader.biSize + bmih.bmiHeader.biClrUsed * sizeof( RGBQUAD ) + bmih.bmiHeader.biSizeImage );
            file.Write( pBytes, rect.Width() * rect.Height() * 16 / 8 );
            file.Close();
        }结果运行时产生ASSERT错误,查了一下就是file.Write( pBytes, rect.Width() * rect.Height() * 16 / 8 );这一句引起的。pBytes指针为空。也就是说并没有在GetBitmapBits中获得地址。对于GetBitmapBits函数我不太熟悉,它的最后一个参数是需要一个已经申请内存的指针还是把m_Bitmap的那些数组指针返回到这个参数里。希望大家能够帮助解决一下,谢谢了!!