unit PrtScr;
INTERFACE
Uses SysUtils, windows, dglOpenGL;
Type
BITMAPFILEHEADER = packed record
bfType: Word;
bfSize: DWORD;
bfReserved1: Word;
bfReserved2: Word;
bfOffBits: DWORD;
end;
BITMAPINFOHEADER = packed record
biSize: DWORD;
biWidth: Longint;
biHeight: Longint;
biPlanes: Word;
biBitCount: Word;
biCompression: DWORD;
biSizeImage: DWORD;
biXPelsPerMeter: Longint;
biYPelsPerMeter: Longint;
biClrUsed: DWORD;
biClrImportant: DWORD;
end;
Procedure ScreenShot(const FileName: string; NumChar: Char);
IMPLEMENTATION
Procedure ScreenShot(const FileName: string; NumChar: Char);
var F : file;
FileInfo : BITMAPINFOHEADER;
FileHeader : BITMAPFILEHEADER;
pPicData : Pointer;
Viewport : array[0..3] of integer;
FileNameNr : string;
i : word;
Begin
// Nummerierung (Falls es DateiNamen schon gibt)
i := 0;
Repeat
inc(i);
FileNameNr := FileName;
Insert(NumChar + inttostr(i), FileNameNr, Length(FileNameNr)-3);
Until (not FileExists(FileNameNr));
// Speicher für die Speicherung der Header-Informationen vorbereiten
ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
// Größe des Viewports abfragen
glGetIntegerv(GL_VIEWPORT, @Viewport);
// Initialisieren der Daten des Headers
FileHeader.bfType := 19778; //$4D42 = 'BM'
FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
// Schreiben der Bitmap-Informationen
FileInfo.biSize := SizeOf(BITMAPINFOHEADER);
FileInfo.biWidth := Viewport[2];
FileInfo.biHeight := Viewport[3];
FileInfo.biPlanes := 1;
FileInfo.biBitCount := 32;
FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div <!-- s8) --><img src=\"{SMILIES_PATH}/icon_cool.gif\" alt=\"8)\" title=\"Cool\" /><!-- s8) -->;
// Größenangabe auch in den Header übernehmen
FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;
// Speicher für die Bilddaten reservieren
GetMem(pPicData, FileInfo.biSizeImage);
try
// Bilddaten von OpenGL anfordern
glReadPixels(0, 0, Viewport[2], Viewport[3], GL_BGRA, GL_UNSIGNED_BYTE, pPicData);
// Bilddaten in die Datei schreiben
AssignFile(f, FileNameNr);
Rewrite(f, 1);
try
BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
BlockWrite(F, pPicData^, FileInfo.biSizeImage );
finally
CloseFile(f);
end;
finally
// Angeforderten Speicher wieder freigeben ...
FreeMem(pPicData, FileInfo.biSizeImage);
end;
End;
end.