void DemoRasterToMem (HANDLE hLcWnd)
{
double Xmin, Ymin, Xmax, Ymax;
int ImgW, ImgH;
int nBytes, sz, InfoSize, PalSize, ImgSize;
HANDLE hBlock;
BYTE* pMem;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER* pbih;
BYTE* pImgBits;
// get currently visible block
hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_VIEWBLOCK );
// get size of CAD window, pixels
ImgW = lcPropGetInt( hLcWnd, LC_PROP_WND_WIDTH );
ImgH = lcPropGetInt( hLcWnd, LC_PROP_WND_HEIGHT );
// get extents of currently visible drawing's area
Xmin = lcPropGetFloat( hLcWnd, LC_PROP_WND_XMIN );
Ymin = lcPropGetFloat( hLcWnd, LC_PROP_WND_YMIN );
Xmax = lcPropGetFloat( hLcWnd, LC_PROP_WND_XMAX );
Ymax = lcPropGetFloat( hLcWnd, LC_PROP_WND_YMAX );
// get required size for the memory buffer
nBytes = lcBlockRasterizeMem( hBlock, NULL, Xmin, Ymin, Xmax, Ymax, ImgW,ImgH );
// allocate memory buffer
pMem = new BYTE[nBytes];
// write the block's image into the buffer
nBytes = lcBlockRasterizeMem( hBlock, pMem, Xmin, Ymin, Xmax, Ymax, ImgW,ImgH );
// just for testing, let's save the memory buffer as an image file
// in order to see the image contents
FILE* df = _wfopen( L"d:\\View.bmp", L"wb" );
if (df){
pbih = (BITMAPINFOHEADER*)pMem;
ImgSize = pbih->biSizeImage;
switch( pbih->biBitCount ){
case 1:
PalSize = 2 * 4;
break;
case 4:
PalSize = 16 * 4;
break;
case 8:
PalSize = 256 * 4;
break;
default:
PalSize = 0;
}
InfoSize = 40 + PalSize;
// write BMP file header
sz = sizeof(bfh);
memset( &bfh, 0, sz );
bfh.bfType = 0x4D42; // BM
// file size
bfh.bfSize = 14 + nBytes;
// offset to bitmap bits
bfh.bfOffBits = 14 + InfoSize; // sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + Palette
fwrite( &bfh, sz, 1, df );
// write bitmap info header
fwrite( pbih, InfoSize, 1, df );
// write image bits
pImgBits = pMem + InfoSize;
fwrite( pImgBits, ImgSize, 1, df );
fclose( df );
}
// free the memory buffer
delete[] pMem;
}