我在CView里绘了一些图形。我想把它保存成位图。保存位图我会。
因为绘图都是在OnDraw里绘的,如果在这个函数里保存没问题。但是这样好像不够模块化。我想点击一下按钮然后保存图片。但是当在其它按钮中保存图片时,又获取不到那些LineTo之类的绘图操作,所以保存出来的都是漆黑一片。我想问问如何不在OnDraw中把我绘图的结果保存下来。
因为绘图都是在OnDraw里绘的,如果在这个函数里保存没问题。但是这样好像不够模块化。我想点击一下按钮然后保存图片。但是当在其它按钮中保存图片时,又获取不到那些LineTo之类的绘图操作,所以保存出来的都是漆黑一片。我想问问如何不在OnDraw中把我绘图的结果保存下来。
在OnDraw里绘制的时候同时更新这个变量。
这样你在别的按钮里想保存位图的话,把这个变量保存就可以了。
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的那些数组指针返回到这个参数里。希望大家能够帮助解决一下,谢谢了!!