|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"矩形をグラデーションで塗りつぶす"
Windows98で追加されたAPIである GradientFill を使用して
矩形をグラデーションで塗りつぶす関数です。
Delphi 4J/5JのWINDOWS.PASで定義されている TTriVertex 構造体で
使用している COLOR16 という型が間違っているため、そのままでは
うまく動作しません(誤:shortint→正:smallintまたはWORD)。
interface
type
TGradientType = (gtVert, gtHorz);
function DrawGradRect(ACanvas:TCanvas; ARect:TRect; StartCol,EndCol:TColor;
GradType:TGradientType):boolean;
implementation
type
AyaCOLOR16 = WORD;
PAyaTriVertex = ^TAyaTriVertex;
_AYATRIVERTEX = packed record
x: Longint;
y: Longint;
Red: AyaCOLOR16;
Green: AyaCOLOR16;
Blue: AyaCOLOR16;
Alpha: AyaCOLOR16;
end;
TAyaTriVertex = _AYATRIVERTEX;
AYATRIVERTEX = _AYATRIVERTEX;
function AyaGradientFill(DC: HDC; var p2: TAyaTriVertex; p3: ULONG;
p4: Pointer; p5, p6: ULONG): BOOL; stdcall;
external 'msimg32.dll' name 'GradientFill';
function DrawGradRect(ACanvas:TCanvas; ARect:TRect; StartCol,EndCol:TColor;
GradType:TGradientType):boolean;
procedure GetRGB(Col:TColor; var R,G,B:AyaCOLOR16);
var
c : TColor;
begin
c:=ColorToRGB(Col);
R:=(c AND $FF) SHL 8;
G:=((c SHR 8) AND $FF) SHL 8;
B:=((c SHR 16) AND $FF) SHL 8;
end;
const
grad : array[TGradientType] of ULONG = (
GRADIENT_FILL_RECT_V,
GRADIENT_FILL_RECT_H
);
var
tv : array[0..1] of TAyaTriVertex;
gr : TGradientRect;
begin
// 左上
WITH tv[0] DO BEGIN
x:=ARect.left; y:=ARect.top; alpha:=0;
GetRGB(StartCol,Red,Green,Blue);
END;
// 右下
WITH tv[1] DO BEGIN
x:=ARect.Right; y:=ARect.Bottom; alpha:=0;
GetRGB(EndCol,Red,Green,Blue);
END;
// グラデーションの基準点となるTTriVertexのインデックスを指定する
gr.UpperLeft:=0; // tv[0]
gr.LowerRight:=1; // tv[1]
// 実行
result:=AyaGradientFill(ACanvas.Handle,tv[0],2,@gr,1,grad[GradType]);
end;
市丸 剛(HGD00106)
Original document by 市丸 剛 氏 ID:(HGD00106)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|