You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.6 KiB

  1. program SimpleLoadFromFile;
  2. {$mode objfpc}{$H+}
  3. uses
  4. {$IFDEF UNIX}{$IFDEF UseCThreads}
  5. cthreads,
  6. {$ENDIF}{$ENDIF}
  7. Classes, Windows, SysUtils, dglOpenGL, glBitmap, Helper;
  8. var
  9. oglWindow: TOpenGLWindow;
  10. running: Boolean = true;
  11. function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
  12. var
  13. data: TglBitmapData;
  14. begin
  15. case Msg of
  16. WM_DESTROY: begin
  17. running := false;
  18. end;
  19. WM_KEYDOWN: begin
  20. if wParam = VK_RETURN then begin
  21. data := TglBitmapData.Create; // create texture data object
  22. try
  23. TglBitmap2D.GrabScreen(0, 0, 800, 600, tfRGBA8ui1, data); // read pixels from frame buffer
  24. data.SaveToFile( // save data to file
  25. ExtractFilePath(ApplicationName) +
  26. 'screen.bmp', ftBMP);
  27. WriteLn('screen saved to screen.bmp');
  28. finally
  29. FreeAndNil(data); // free texture data object when done
  30. end;
  31. end;
  32. end;
  33. end;
  34. result := DefWindowProc(hWnd, Msg, wParam, lParam);
  35. end;
  36. procedure RenderLoop;
  37. begin
  38. glBegin(GL_TRIANGLES);
  39. glColor4f(1, 0, 0, 1); glVertex2f(400, 100);
  40. glColor4f(0, 1, 0, 1); glVertex2f(100, 500);
  41. glColor4f(0, 0, 1, 1); glVertex2f(700, 500);
  42. glEnd;
  43. end;
  44. begin
  45. oglWindow := CreateOpenGLWindow('GrapScreen (hit enter to grab screen)', 800, 600, @WindowProc);
  46. while running and ProgressMesages do begin
  47. RenderLoop;
  48. SwapBuffers(oglWindow.DC);
  49. end;
  50. DestroyOpenGLWindow(oglWindow);
  51. end.