BK 2650 VBA Script26.dec 2010
#define _AFXDLL #include <afxtempl.h> #include <windows.h> void CaptureScreen(const char* filename, CHAR*bitmap, int width, int height) { // create file CFile file; file.Open( CString(filename), CFile::modeCreate | CFile::modeWrite ); // save bitmap file headers BITMAPFILEHEADER fileHeader; BITMAPINFOHEADER infoHeader; fileHeader.bfType = 0x4d42; fileHeader.bfSize = 0; fileHeader.bfReserved1 = 0; fileHeader.bfReserved2 = 0; fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 2*4; infoHeader.biSize = sizeof(infoHeader); infoHeader.biWidth = width; infoHeader.biHeight = height; infoHeader.biPlanes = 1; infoHeader.biBitCount = 8; infoHeader.biCompression = BI_RGB; infoHeader.biSizeImage = 0; infoHeader.biXPelsPerMeter = 3780; infoHeader.biYPelsPerMeter = 3780; infoHeader.biClrUsed = 0; infoHeader.biClrImportant = 0; file.Write((char*)&fileHeader, sizeof(fileHeader)); file.Write((char*)&infoHeader, sizeof(infoHeader)); // palette for (int i=0; i<256; i++) { DWORD clr = (i==1) ? RGB(0, 0, 0) : RGB(255, 255, 255); file.Write(&clr, 4); } // dibsection information BITMAPINFO info; info.bmiHeader = infoHeader; for (int y=height-1; y>=0; y--) file.Write(bitmap+y*width, width); file.Close(); } void main() { const int nScreenWidth = 512; const int nScreenHeight = 370; CFile f; f.Open( _T("C:\\Temp\\spectrum.bin"), CFile::modeRead ); //f.Open( _T("COM1:"), CFile::modeRead ); // dont forget to setup baud rate and enable DTR&RTS int x = 0, y = 0; BYTE bRead; int nCount = 0; BYTE bitmap[nScreenHeight][nScreenWidth] = {0}; while ( f.Read(&bRead, 1) ) { if ( bRead == 0x1b ) { f.Read(&bRead, 1); if ( bRead == 'l' ) { CHAR count[5] = {0}; f.Read( count, 4 ); nCount = atoi(count); _ASSERT(nCount == 370); for (x=0; x<nCount; x++) { union { WORD pix; BYTE b[2]; } p; f.Read( &p.b[1], 1 ); f.Read( &p.b[0], 1 ); for ( int z = 0; z < 16; z++ ) if ( p.pix & (1<<(15-z)) ) { int _x = y*16+z; int _y = x; _ASSERT( _x < nScreenWidth && _y < nScreenHeight ); bitmap[nScreenHeight-_y-1][_x] = 1; } } y++; printf("line=%d\n", y); if (y==22) break; } continue; } } f.Close(); CaptureScreen( "c:\\temp\\spectrum.bmp", (char*)bitmap, nScreenWidth, nScreenHeight ); }