ich muss folgenden Code von C++ nach Free Pascal portieren (er ist aus einem C++ Forum, ich finde die Quelle grade nicht):
Code: Alles auswählen
#include <Windows.h>
int main(){
HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC hdcCompatible = CreateCompatibleDC(hdcScreen);
int iWidth = GetDeviceCaps(hdcScreen, HORZRES);
int iHeight = GetDeviceCaps(hdcScreen, VERTRES);
HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen,
iWidth,
iHeight);
HBITMAP hbmOldBitmap = (HBITMAP)SelectObject(hdcCompatible, hbmScreen);
BitBlt(hdcCompatible,
0,0,
iWidth,
iHeight,
hdcScreen,
0,0,
SRCCOPY);
/* Nun Speicher für einen Puffer reservieren, der die Daten
der 32-Bit-Bitmap temporär aufnimmt. */
DWORD dwImageSize = (DWORD)(iWidth * iHeight * 32 / 8 );
//void *pImage = HeapAlloc(GetProcessHeap(), 0, dwImageSize); // oder so
void *pImage = new BYTE[dwImageSize];
/* Als Nächstes Daten der 32-Bit-Bitmap in den Puffer laden. */
BITMAPINFO bmi =
{
sizeof(BITMAPINFOHEADER),
iWidth,
iHeight,
1,
32,
BI_RGB,
0,
0,
0,
0,
0
};
GetDIBits(hdcCompatible, hbmScreen, 0, (UINT)iHeight, pImage, &bmi, DIB_RGB_COLORS);
/* Neue Datei erstellen. */
HANDLE hFile = CreateFile(
"screenhot.bmp",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return MessageBox(NULL, "CreateFile failed.", "Failure", MB_ICONERROR);
}
/* Jetzt Header für Bitmap präparieren. */
BITMAPFILEHEADER bmpfh =
{
'MB',
sizeof(BITMAPFILEHEADER),
0,
0,
sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
};
/* Nun Header für Bitmap in Datei schreiben. */
DWORD dwWritten;
if(!WriteFile(hFile, &bmpfh, sizeof(BITMAPFILEHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPFILEHEADER))
{
return MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
}
if(!WriteFile(hFile, &bmi.bmiHeader, sizeof(BITMAPINFOHEADER), &dwWritten, NULL) || dwWritten != sizeof(BITMAPINFOHEADER))
{
return MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
}
/* Anschließend Image in Datei schreiben. */
if(!WriteFile(hFile, pImage, dwImageSize, &dwWritten, NULL) || dwWritten != dwImageSize)
{
return MessageBox(NULL, "WriteFile failed.", "Failure", MB_ICONERROR);
}
SelectObject(hdcCompatible, hbmOldBitmap);
delete pImage;
DeleteObject(hbmScreen);
DeleteDC(hdcScreen);
DeleteDC(hdcCompatible);
}
Code: Alles auswählen
void *pImage = new BYTE[dwImageSize];

Ich hoffe ihr könnt mir helfen
