- {***************************************************************************
 - Screenshot erstellen
 - ****************************************************************************}
 - procedure TForm1.ScreenShot(sender: TObject);
 - var
 - BMPname : string;
 - FileInfo : BITMAPINFOHEADER;
 - FileHeader : BITMAPFILEHEADER;
 - Viewport : array[0..3] of integer;
 - RohBild,
 - Bild : TBitmap;
 - i : integer;
 - begin
 - // Testweise um ein unkontrolliertes Rendern während des Speicherns zu verhindern - bringt
 - // aber auch nix...
 - Timer1.enabled := false;
 - // Backgrund = weiss
 - glClearColor(1, 1, 1, 0);
 - // Bisheriges Bild löschen
 - glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 - // Bild neu aufbauen; letzte Zeile in Render ist übrigens glFinish;
 - Render;
 - //Snapshotroutine von WhiteHunter
 - glGetIntegerv(GL_VIEWPORT, @Viewport);
 - Rohbild := TBitmap.Create;
 - try
 - Rohbild.Width := Viewport[2];
 - Rohbild.Height := Viewport[3];
 - Rohbild.PixelFormat := pf24bit;
 - for i := 0 to Viewport[3] - 1 do
 - glReadPixels(0, Viewport[3] - i, Viewport[2], 1, GL_BGR, GL_UNSIGNED_BYTE, Rohbild.ScanLine[i]);
 - // Eigentliches Bitmap mit Übermass erstellen
 - Bild := TBitmap.Create;
 - Bild.PixelFormat := pf24bit;
 - Bild.Width := RohBild.Width + 225;
 - Bild.Height := RohBild.Height + 100;
 - // Beschriftungen einfügen
 - Bild.Canvas.textout(10,Bild.Height-70 ,MaskEdit1.Text);
 - Bild.Canvas.textout(10,Bild.Height-50 ,MaskEdit2.Text);
 - Bild.Canvas.textout(10,Bild.Height-30 ,MaskEdit3.Text);
 - .
 - .
 - .
 - // Gepuffertes Bitmap ins eigentliche Bitmap
 - Bild.Canvas.Draw ( 225,0,Rohbild);
 - // Fertiges Bitmap speichern
 - BMPname := Dateipfad + '-' + DateToStr(Date);
 - SaveDialog1.FileName := BMPname;
 - if SaveDialog1.Execute then BMPname:=SaveDialog1.FileName;
 - Bild.SaveToFile(BMPname);
 - finally
 - // Bild.Free; ---> Diese auskommentierten Einträge bedeuten
 - // RohBild.Free; ---> einen sicheren Programmabsturz ?!?
 - end;
 - // Background wieder auf schwarz stellen
 - glClearColor(0, 0, 0, 0);
 - glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
 - // Timergesteuertes Rendern wieder freigeben
 - Timer1.enabled := true;
 - end;
 
