unit Helper; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Windows, dglOpenGL; type TOpenGLWindow = packed record LWndClass: TWndClass; hMainHandle: HWND; DC: HDC; RC: HGLRC; end; function CreateOpenGLWindow(const aCaption: String; const aWidth, aHeight: Integer; const aWndProc: WNDPROC): TOpenGLWindow; function ProgressMesages: Boolean; procedure DestroyOpenGLWindow(const aWindow: TOpenGLWindow); implementation function CreateOpenGLWindow(const aCaption: String; const aWidth, aHeight: Integer; const aWndProc: WNDPROC): TOpenGLWindow; begin //create the window result.LWndClass.hInstance := hInstance; with result.LWndClass do begin lpszClassName := 'MyWinApiWnd'; Style := CS_PARENTDC or CS_BYTEALIGNCLIENT; hIcon := LoadIcon(hInstance,'MAINICON'); lpfnWndProc := aWndProc; hbrBackground := COLOR_BTNFACE+1; hCursor := LoadCursor(0,IDC_ARROW); end; RegisterClass(result.LWndClass); result.hMainHandle := CreateWindow( result.LWndClass.lpszClassName, PAnsiChar(aCaption), WS_CAPTION or WS_MINIMIZEBOX or WS_SYSMENU or WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) - aWidth) div 2, (GetSystemMetrics(SM_CYSCREEN) - aHeight) div 2, aWidth, aHeight, 0, 0, hInstance, nil); // create and activate rendering context result.DC := GetDC(result.hMainHandle); if (result.DC = 0) then begin WriteLn('unable to get DeviceContext'); halt; end; result.RC := CreateRenderingContext(result.DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0); if (result.RC = 0) then begin WriteLn('unable to create RenderingContext'); halt; end; ActivateRenderingContext(result.DC, result.RC); // init OpenGL glViewport(0, 0, aWidth, aHeight); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST); glDisable(GL_CULL_FACE); glMatrixMode(GL_PROJECTION); glLoadIdentity; glOrtho(0, aWidth, aHeight, 0, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity; end; function ProgressMesages: Boolean; var Msg: TMSG; begin result := GetMessage(Msg, 0, 0, 0); if result then begin TranslateMessage(Msg); DispatchMessage(Msg); end; end; procedure DestroyOpenGLWindow(const aWindow: TOpenGLWindow); begin DestroyRenderingContext(aWindow.RC); ReleaseDC(aWindow.hMainHandle, aWindow.DC); end; end.