Google

Monday, March 19, 2007

draw a gradient with alpha channel

{ .... }

interface

{ .... }

type
TTriVertex = packed record
x: Longint;
y: Longint;
Red: Word;
Green: Word;
Blue: Word;
Alpha: Word;
end;
TGradientFillProc = function(DC: HDC; Verteces: Pointer; NumVerteces: DWORD;
Meshes: Pointer; NumMeshes: DWORD; Mode: DWORD): DWORD; stdcall;

{ .... }

var
MSImg32Lib: THandle;
GradientFillProc: TGradientFillProc;

{ .... }

// Example:
// Beispiel:

procedure TForm1.Button1Click(Sender: TObject);
var
cr: Cardinal;
Verteces: array[0..1] of TTriVertex;
GradientRect: TGradientRect;
begin
Verteces[0].x := 0;
Verteces[0].y := 0;
cr := GetSysColor(COLOR_ACTIVECAPTION);
Verteces[0].Red := ((cr and $0F0F) or 8);
Verteces[0].Green := (cr and $0ff00);
Verteces[0].Blue := ((cr and $0ff0000) or 8);
Verteces[0].Alpha := 0;
Verteces[1].x := Width;
Verteces[1].y := Height;
cr := GetSysColor(COLOR_GRADIENTACTIVECAPTION);
Verteces[1].Red := ((cr and $0FF) or 8);
Verteces[1].Green := (cr and $0ff00);
Verteces[1].Blue := ((cr and $0ff0000) or 8);
Verteces[1].Alpha := 0;
GradientRect.UpperLeft := 0;
GradientRect.LowerRight := 1;
GradientFillProc(Canvas.Handle, @Verteces[0], 2, @GradientRect, 1, GRADIENT_FILL_RECT_H);
end;

{ .... }

initialization
GradientFillProc := nil;
MSImg32Lib := LoadLibrary('msimg32.dll');
if MSImg32Lib <> 0 then
begin
GradientFillProc := GetProcAddress(MSImg32Lib, 'GradientFill');
if @GradientFillProc = nil then
begin
FreeLibrary(MSImg32Lib);
MSImg32Lib := 0;
end;
end
else
ShowMessage('Could not load DLL');

finalization
if
@GradientFillProc <> nil then
GradientFillProc := nil;
if MSImg32Lib <> 0 then
begin
FreeLibrary(MSImg32Lib);
MSImg32Lib := 0;
end;
end.

No comments: