15,979
社区成员
发帖
与我相关
我的任务
分享
void CBitmapDlg::OnBtnBitmap()
{
// TODO: Add your control notification handler code here
CClientDC dc( this );
CDC dcMem;
CRect rect;
GetClientRect( &rect );
// 位图文件头
BITMAPFILEHEADER bmfh;
// 位图信息头
BITMAPINFO bmih;
BYTE *pBytes;
bmih.bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
bmih.bmiHeader.biWidth = rect.Width();
bmih.bmiHeader.biHeight = rect.Height();
bmih.bmiHeader.biPlanes = 1;
bmih.bmiHeader.biBitCount = 16;
bmih.bmiHeader.biCompression = BI_RGB;
bmih.bmiHeader.biSizeImage = 0;
bmih.bmiHeader.biXPelsPerMeter = 0;
bmih.bmiHeader.biYPelsPerMeter = 0;
bmih.bmiHeader.biClrUsed = 0;
bmih.bmiHeader.biClrImportant = NULL;
bmfh.bfType = 0x4d42;
bmfh.bfSize = ( DWORD )( sizeof( BITMAPFILEHEADER ) + bmih.bmiHeader.biSize + bmih.bmiHeader.biClrUsed * sizeof( RGBQUAD ) + bmih.bmiHeader.biSizeImage);
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = ( DWORD )( sizeof( BITMAPFILEHEADER ) + bmih.bmiHeader.biSize + bmih.bmiHeader.biClrUsed * sizeof( RGBQUAD ) );
dcMem.CreateCompatibleDC( &dc );
dcMem.SetBkMode( TRANSPARENT );
dcMem.MoveTo( 0, 0 );
dcMem.LineTo( 100, 100 );
CreateDIBSection( dcMem.m_hDC, &bmih, DIB_PAL_COLORS, ( void** )&pBytes, NULL, 0 );
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();
}
dcMem.DeleteDC();
}