unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus,
RXShell,
StyleMenus, BareOpenGL, BareOpenGLExt, BareGraphics, GraphTools, GLCtrls;
type
TAnimatedForm = class(TForm)
TrayIcon: TRxTrayIcon;
PopupMenu: TPopupMenu;
ExitMenuItem: TMenuItem;
AboutMenuItem: TMenuItem;
N1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ExitMenuItemClick(Sender: TObject);
private
FBitmap: TFastBitmap;
FBuffer: TOpenGLBuffer;
FTex: array[0..3] of GLuint;
procedure BufferLoad(Sender: TObject);
procedure BufferUnload(Sender: TObject);
procedure BufferDraw(Sender: TObject);
procedure UpdateLayers;
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
end;
var
AnimatedForm: TAnimatedForm;
implementation
{$R *.dfm}
{ Texture resources }
{$R images.res}
procedure TAnimatedForm.FormCreate(Sender: TObject);
begin
FBitmap := CreateFastBitmap(200, 200, pd32);
FBuffer := TOpenGLBuffer.Create(Self);
FBuffer.Height := FBitmap.Height;
FBuffer.Width := FBitmap.Width;
FBuffer.OnLoad := BufferLoad;
FBuffer.OnUnload := BufferUnload;
FBuffer.OnDraw := BufferDraw;
FBuffer.RefreshKind := rkThread;
Width := FBitmap.Width;
Height := FBitmap.Height;
UpdateLayers;
TMenuStylizer.Create(Self);
end;
procedure TAnimatedForm.FormDestroy(Sender: TObject);
begin
DestroyFastBitmap(FBitmap);
end;
procedure TAnimatedForm.BufferLoad(Sender: TObject);
begin
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glColor4f(1, 1, 1, 1);
glClearColor(0, 0, 0, 0);
glGenTextures(4, @FTex);
BindTexture(1500, FTex[0], tfPng);
BindTexture(1501, FTex[1], tfPng);
BindTexture(1502, FTex[2], tfPng);
BindTexture(1503, FTex[3], tfPng);
end;
procedure TAnimatedForm.BufferUnload(Sender: TObject);
begin
glDeleteTextures(4, @FTex);
end;
procedure TAnimatedForm.BufferDraw(Sender: TObject);
procedure DrawBox(Angle: GLfloat; Texture: GLuint);
const
X = 64;
begin
glPushMatrix;
glRotate(Angle, 0, 0, 1);
glBindTexture(GL_TEXTURE_2D, Texture);
glBegin(GL_QUADS);
glTexCoord(0, 0);
glVertex(-X, X);
glTexCoord(0, 1);
glVertex(-X, -X);
glTexCoord(1, 1);
glVertex(X, -X);
glTexCoord(1, 0);
glVertex(X, X);
glEnd;
glPopMatrix;
end;
begin
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity;
glxBeginOrtho(200, 200);
glTranslate(100, 100, 0);
DrawBox(Sin(FBuffer.Timer.Time) * 10 - 190, FTex[0]);
DrawBox(FBuffer.Timer.Time * -80 + 90, FTex[1]);
DrawBox(FBuffer.Timer.Time * 80 + 90, FTex[2]);
DrawBox(FBuffer.Timer.Time * 80 * 2 + 90, FTex[3]);
glxEndOrtho;
glReadPixels(0, 0, FBitmap.Width, FBitmap.Height, GL_BGRA, GL_UNSIGNED_BYTE, FBitmap.Bits);
UpdateLayers;
end;
procedure TAnimatedForm.UpdateLayers;
var
Blend: TBlendFunction;
P: TPoint;
S: TSize;
DC: HDC;
begin
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
with Blend do
begin
BlendOp := AC_SRC_OVER;
BlendFlags := 0;
SourceConstantAlpha := $FF;
AlphaFormat := AC_SRC_ALPHA;
end;
DC := GetDC(0);
P := Point(0, 0);
S.cx := FBitmap.Width;
S.cy := FBitmap.Height;
UpdateLayeredWindow(Handle, DC, nil, @S, FBitmap.DC, @P, 0, @Blend, ULW_ALPHA);
ReleaseDC(0, DC);
end;
procedure TAnimatedForm.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTCAPTION;
end;
procedure TAnimatedForm.ExitMenuItemClick(Sender: TObject);
begin
Close;
end;
end.