Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Save Screenshot as Bitmap

6 views
Skip to first unread message

Michael Schwarz

unread,
May 9, 2002, 1:40:28 PM5/9/02
to
Hello,

I have problems using CreateDIBSection in EVC. I'd like to save a
screenshot in a bitmap file. If I use the emulation it works fine. Doing
the same on iPAQ or other Pocket PCs an error 87 occures after while
trying to save the bits.

Perhaps anyone can help me finding the problem. I tried already several
forums and newsgroups. I do not want to use thirdparty tools or MFC
because of the size of the distribution.

Best regards,
Michael


I have following code:

<Code>

// test.cpp : Defines the entry point for the application.
//

#include "stdafx.h"


void CreateBMPFile(HWND, LPTSTR, PBITMAPINFO, HBITMAP, HDC); PBITMAPINFO
CreateBitmapInfoStruct(HWND, HBITMAP);


int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.

// prepare DCs, bitmaps,..
HDC hScreenDC = GetWindowDC(0);

HDC hmemDC = CreateCompatibleDC(hScreenDC);
int ScreenWidth = GetDeviceCaps(hScreenDC, HORZRES);
int ScreenHeight = GetDeviceCaps(hScreenDC, VERTRES);
HBITMAP hmemBM = CreateCompatibleBitmap(hScreenDC,
ScreenWidth,ScreenHeight);
SelectObject(hmemDC, hmemBM);

// copy screen to memory DC
BitBlt(hmemDC, 0, 0, ScreenWidth, ScreenHeight, hScreenDC, 0,
0,SRCCOPY);

CreateBMPFile(0,
_T("\\test.bmp"),CreateBitmapInfoStruct(0,hmemBM),hmemBM, hmemDC);

DeleteObject(hmemBM);
DeleteDC(hmemDC);
ReleaseDC(0, hScreenDC);

return 0;
}

PBITMAPINFO CreateBitmapInfoStruct(HWND hwnd, HBITMAP hBmp)
{
BITMAP bmp;
PBITMAPINFO pbmi;
WORD cClrBits;

TCHAR szError[100]; // error message

// Retrieve the bitmap's color format, width, and height.
if (!GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp))
{
wsprintf (szError,TEXT("GetObject Error:%ld"),GetLastError ());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);

return NULL;
}

// Convert the color format to a count of bits.
cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);

if (cClrBits == 1)
cClrBits = 1;
else if (cClrBits <= 4)
cClrBits = 4;
else if (cClrBits <= 8)
cClrBits = 8;
else if (cClrBits <= 16)
cClrBits = 16;
else if (cClrBits <= 24)
cClrBits = 24;
else cClrBits = 32;

// Allocate memory for the BITMAPINFO structure. (This structure
// contains a BITMAPINFOHEADER structure and an array of RGBQUAD
// data structures.)

if (cClrBits != 24)
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * (1<< cClrBits));

// There is no RGBQUAD array for the 24-bit-per-pixel format.

else
pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
sizeof(BITMAPINFOHEADER));


// Initialize the fields in the BITMAPINFO structure.

pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmi->bmiHeader.biWidth = bmp.bmWidth;
pbmi->bmiHeader.biHeight = bmp.bmHeight;
pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
if (cClrBits < 24)
pbmi->bmiHeader.biClrUsed = (1<<cClrBits);

// If the bitmap is not compressed, set the BI_RGB flag.
pbmi->bmiHeader.biCompression = BI_RGB;

// Compute the number of bytes in the array of color
// indices and store the result in biSizeImage.
// For Windows NT/2000, the width must be DWORD aligned unless
// the bitmap is RLE compressed. This example shows this.
// For Windows 95/98, the width must be WORD aligned unless the
// bitmap is RLE compressed.

pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth *
cClrBits+31) & ~31) /8
* pbmi->bmiHeader.biHeight;

// Set biClrImportant to 0, indicating that all of the
// device colors are important.

pbmi->bmiHeader.biClrImportant = 0;

return pbmi;
}


void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
HBITMAP hBMP, HDC hDC)
{
HANDLE hf; // file handle
BITMAPFILEHEADER hdr; // bitmap file-header
PBITMAPINFOHEADER pbih; // bitmap info-header

LPBYTE lpBits; // memory pointer


DWORD dwTotal; // total count of bytes
DWORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
DWORD dwTmp;

TCHAR szError[100]; // error message

pbih = (PBITMAPINFOHEADER) pbi;
lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

if (!lpBits)
{
wsprintf (szError,TEXT("lpBits Alloc Error: %ld"),GetLastError ());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);

return;
}

// Retrieve the color table (RGBQUAD array) and the bits
// (array of palette indices) from the DIB.

// GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits,
pbi,DIB_RGB_COLORS))

HBITMAP m_hSignatureBoxBMP = CreateDIBSection(hDC, pbi, DIB_RGB_COLORS,
(void**)&lpBits, NULL, 0);
HDC m_hMemDC = CreateCompatibleDC(hDC);
SelectObject(m_hMemDC, m_hSignatureBoxBMP);

BitBlt(m_hMemDC,0,0,pbih->biWidth, pbih->biHeight,hDC,0,0,SRCCOPY);


// for testing
// HDC hScreenDC = GetWindowDC(0);
// BitBlt(hScreenDC, 0, 100, pbih->biWidth, pbih->biHeight, m_hMemDC ,
0, 0, SRCCOPY);


DeleteDC(m_hMemDC);


// Create the .BMP file.

hf = CreateFile(pszFile,
GENERIC_READ | GENERIC_WRITE,
(DWORD) 0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
(HANDLE) NULL);

if (hf == INVALID_HANDLE_VALUE)
{
wsprintf (szError,TEXT("Datei konnte nicht angelegt werden:
%ld"),GetLastError ());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);
return;
}

hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"

// Compute the size of the entire file.
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof(RGBQUAD) + pbih->biSizeImage);

hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;

// Compute the offset to the array of color indices.

hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
pbih->biSize + pbih->biClrUsed
* sizeof (RGBQUAD);

// Copy the BITMAPFILEHEADER into the .BMP file.
if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
(LPDWORD) &dwTmp, NULL))
{
wsprintf (szError,TEXT("Fehler beim Schreiben (1): %ld"),GetLastError
());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);
CloseHandle(hf);
return;
}


// Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD),
(LPDWORD) &dwTmp, ( NULL)))
{
wsprintf (szError,TEXT("Fehler beim Schreiben (2): %ld"),GetLastError
());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);
CloseHandle(hf);
return;
}


// Copy the array of color indices into the .BMP file.
dwTotal = cb = pbih->biSizeImage;


hp = lpBits;

if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
{
wsprintf (szError,TEXT("Fehler beim Schreiben (3): %ld"),GetLastError
());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);
CloseHandle(hf);
return;
}

// Close the .BMP file.
if (!CloseHandle(hf))
{
wsprintf (szError,TEXT("Fehler beim Schließen: %ld"),GetLastError ());
MessageBox(NULL, szError, TEXT("Fehler"), MB_OK);
return;
}

MessageBox(NULL, pszFile, _T("Bitmap gespeichert"), MB_OK);

// Free memory.
GlobalFree((HGLOBAL)lpBits);
}

</Code>

0 new messages