GDI+で描画 ~Delphiソースコード集
DelphiでGDI+を使って描画する方法をサンプルソースコードで解説します。
GDI+を使用するには Uses に GDIPAPI, GDIPOBJ, GDIPUTIL を追加します。
uses GDIPAPI, GDIPOBJ, GDIPUTIL;
GDI+で描画するには TGPGraphics クラスのインスタンスを作成(オブジェクト)して使用します。
var GPGraphics:TGPGraphics;
begin GPGraphics := TGPGraphics.Create( 描画先のTCanvas.Handle ); //GPGraphicsを使って描画処理を行う GPGraphics.Free; end;
以下のサンプルソースコードは、フォームにTImageとTButtonをドラッグ&ドロップして、
Button1をクリックした時に
Image1.Picture.Bitmap に
赤色、太さ6.5 で 座標(10,50)-(290,50)に線を引くサンプルです。
procedure TForm1.Button1Click(Sender: TObject); var GPGraphics:TGPGraphics; GPPen:TGPPen; begin Image1.Width:=300; Image1.Height:=300; Image1.Picture.Bitmap.Width:=300; Image1.Picture.Bitmap.Height:=300; //TGPGraphicsオブジェクトの作成 GPGraphics := TGPGraphics.Create(Image1.Picture.Bitmap.Canvas.Handle); //ペンの作成 赤色、太さ6.5 GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5); //線の描画 (10,50)-(290,50) GPGraphics.DrawLine(GPPen, 10,50, 290,50); GPPen.Free; GPGraphics.Free; end;
TGPGraphicsクラス
メソッド | 解説 | サンプル |
---|---|---|
SetSmoothingMode(スムージングモード); |
スムージングモードを 以下の値から設定します。
|
var GPGraphics:TGPGraphics; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //アンチエイリアス(スムージング)を無効にする GPGraphics.SetSmoothingMode(SmoothingModeNone); //アンチエイリアス(スムージング)を有効にする GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias8x4); GPGraphics.Free; end; |
DrawLine(TGPPen, x1,y1, x2,y2); | 指定したペン(TGPPen)で (x1,y1)-(x2,y2)に線を引く |
var GPGraphics:TGPGraphics; GPPen:TGPPen; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //太さ6,5の赤色ペンの作成 GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5); //線の描画 (10,50)-(290,50) GPGraphics.DrawLine(GPPen, 10,50, 290,50); //ペンを太さ10の半透過青色に設定 GPPen.SetWidth(10); GPPen.SetColor(MakeColor(128, 0,0,255)); //線の描画 (250,0)-(250,100) GPGraphics.DrawLine(GPPen, 250,0, 250,100); GPPen.Free; GPGraphics.Free; end; |
DrawRectangle(TGPPen, TGPRect); | 指定したペン(TGPPen)で 指定した矩形(TGPRect)を描画(輪郭線のみ) |
var GPGraphics:TGPGraphics; GPPen:TGPPen; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //太さ6,5の赤色ペンの作成 GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5); //左上座標(100,150)、幅300、高さ50 の矩形領域に隣接する楕円を描画(線のみ) GPGraphics.DrawRectangle( GPPen, // (左上x,左上y, 幅,高さ) MakeRect(100,150, 300,50) ); GPPen.Free; GPGraphics.Free; end; |
FillRectangle(TGPBrush, TGPRect); | 指定したブラシ(TGPBrush)で 指定した矩形領域(TGPRect)を塗り潰す |
var GPGraphics:TGPGraphics; GPBrush:TGPBrush; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //ソリッド(べた塗り)ブラシの作成 GPBrush:=TGPSolidBrush.Create(MakeColor(128, 0,255,0)); //左上座標(100,100)、幅300、高さ50 の矩形領域を塗り潰す GPGraphics.FillRectangle( GPBrush, // (左上x,左上y, 幅,高さ) MakeRect(100,100, 300,50) ); GPBrush.Free; GPGraphics.Free; end; |
DrawEllipse(TGPPen, TGPRect); | 指定したペン(TGPPen)で 指定した矩形領域(TGPRect)に 隣接する楕円を描画(輪郭線のみ) |
var GPGraphics:TGPGraphics; GPBrush:TGPBrush; GPPen:TGPPen; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //線形グラデーションブラシの作成 GPBrush:=TGPLinearGradientBrush.Create( MakePoint(100,200), //座標1 MakePoint(400,250), //座標2 MakeColor(255, 255,0,0), //座標1の色 赤 MakeColor(255, 0,0,255) //座標1の色 青 ); //太さ16,5で 線形グラデーションブラシを適用したペンの作成 GPPen := TGPPen.Create(GPBrush, 16.5); //左上座標(100,150)、幅300、高さ50 の矩形領域に隣接する楕円を描画(線のみ) GPGraphics.DrawEllipse( GPPen, // (左上x,左上y, 幅,高さ) MakeRect(100,150, 300,50) ); GPBrush.Free; GPPen.Free; GPGraphics.Free; end; |
FillEllipse(TGPBrush, TGPRect); | 指定したブラシ(TGPBrush)で 指定した矩形領域(TGPRect)に隣接する 楕円領域を塗り潰す |
var GPGraphics:TGPGraphics; GPBrush:TGPBrush; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //線形グラデーションブラシの作成 GPBrush:=TGPLinearGradientBrush.Create( MakePoint(100,200), //座標1 MakePoint(400,250), //座標2 MakeColor(255, 255,0,0), //座標1の色 赤 MakeColor(255, 0,0,255) //座標1の色 青 ); //左上座標(100,200)、幅300、高さ50 の矩形に隣接する楕円領域を塗り潰す GPGraphics.FillEllipse( GPBrush, // (左上x,左上y, 幅,高さ) MakeRect(100,200, 300,50) ); GPBrush.Free; GPGraphics.Free; end; |
DrawPie(TGPPen, TGPRect, 開始角度, 描画角度); |
指定したペン(TGPPen)で 指定した矩形領域(TGPRect)に隣接する楕円で 開始角度(右方向を0度とする時計回りの度単位) から描画角度分の円弧と中心線までの線(パイ形状)を描く。 (輪郭線のみ) |
var GPGraphics:TGPGraphics; GPPen:TGPPen; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //太さ16,5で緑色のペンの作成 GPPen := TGPPen.Create(MakeColor(255, 0,255,0), 16.5); //左上座標(100,150)、幅100、高さ80 の矩形に隣接する楕円の //22.5度から270度分のパイ形状を描く GPGraphics.DrawPie( GPPen, // (左上x,左上y, 幅,高さ) MakeRect(100,150, 100,80), 22.5, 270 ); GPPen.Free; GPGraphics.Free; end; |
FillPie(TGPBrush, TGPRect, 開始角度, 描画角度); |
指定したペン(TGPPen)で 指定した矩形領域(TGPRect)に隣接する楕円で 開始角度(右方向を0度とする時計回りの度単位) から描画角度分の円弧と中心線までの線(パイ形状)を塗りつぶす。 |
var GPGraphics:TGPGraphics; GPBrush:TGPBrush; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //ハッチブラシの作成 GPBrush:=TGPHatchBrush.Create( HatchStyle.HatchStyleVertical, //縦ハッチ MakeColor(255, 0,0,255), //前方色 MakeColor(255, 255,255,255) //後方色 ); //左上座標(100,150)、幅100、高さ80 の矩形に隣接する楕円の //22.5度から270度分のパイ形状を塗りつぶす GPGraphics.FillPie( GPBrush, // (左上x,左上y, 幅,高さ) MakeRect(100,150, 100,80), 22.5, 270 ); GPBrush.Free; GPGraphics.Free; end; |
DrawArc(TGPPen, TGPRect, 開始角度, 描画角度); |
指定したペン(TGPPen)で 指定した矩形領域(TGPRect)に隣接する楕円で 開始角度(右方向を0度とする時計回りの度単位) から描画角度分の円弧を描く。 |
var GPGraphics:TGPGraphics; GPPen:TGPPen; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //太さ6,5の赤色ペンの作成 GPPen := TGPPen.Create(MakeColor(255,0,0), 6.5); //左上座標(150,200)、幅100、高さ50 の矩形に隣接する楕円の //22.5度から270度分の円弧を描く GPGraphics.DrawArc( GPPen, // (左上x,左上y, 幅,高さ) MakeRect(150,200, 100,50), 22.5, 270 ); GPPen.Free; GPGraphics.Free; end; |
DrawLines(TGPPen, PGPPoint, Count); |
指定したペン(TGPPen)で PGPPointで与えた頂点を結ぶ線を描く 但しCount個分の頂点のみ |
以下の例の場合、引数に PGPPoint(@GPPoints[1]), 3 を与えているので、GPPoints[1]~GPPoints[3] を結ぶ線を描画します。 var GPGraphics:TGPGraphics; GPPen:TGPPen; GPPoints:Array of TGPPoint; //TGPPointFも存在します begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); SetLength(GPPoints,5); GPPoints[0]:=MakePoint(0,0); GPPoints[1]:=MakePoint(200,100); GPPoints[2]:=MakePoint(300,100); GPPoints[3]:=MakePoint(300,200); GPPoints[4]:=MakePoint(200,400); //太さ10の赤色ペンの作成 GPPen := TGPPen.Create(MakeColor(255,0,0), 10); //ペンの描画開始形状を丸に設定 GPPen.SetStartCap(LineCapRound); //ペンの接合形状を面取り(ベベル)に設定 GPPen.SetLineJoin(LineJoinBevel); //ペンの描画終了形状を矢印に設定 GPPen.SetEndCap(LineCapArrowAnchor); //アンチエイリアス(スムージング)を有効にする GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias8x4); //GPPoints[1]~GPPoints[3]を結ぶ線を描画 GPGraphics.DrawLines( GPPen, PGPPoint(@GPPoints[1]), 3 ); GPPen.Free; GPGraphics.Free; end; |
TGPPen(ペン)クラス
メソッド | 解説 | サンプル |
---|---|---|
Create(TGPColor, 線の太さ); | 指定色、指定太さのペンを作成 |
var GPGraphics:TGPGraphics; GPPen:TGPPen; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //太さ3.2の不透明の赤色ペンの作成 GPPen := TGPPen.Create(MakeColor(255, 255,0,0), 3.2); //線の描画 (150,0)-(250,100) GPGraphics.DrawLine(GPPen, 150,0, 250,100); GPPen.Free; GPGraphics.Free; end; |
Create(TGBrush, 線の太さ); |
TGBrushを適用した 指定太さのペンを作成 |
var GPGraphics:TGPGraphics; GPPen:TGPPen; GPBrush:TGPBrush; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); //ハッチブラシの作成 GPBrush:=TGPHatchBrush.Create( HatchStyle.HatchStyleCross, //クロスハッチ MakeColor(255, 0,0,255), //前方色 MakeColor(255, 255,255,255) //後方色 ); //太さ10のハッチブラシを適用したペンの作成 GPPen := TGPPen.Create(GPBrush, 10); //線の描画 (150,0)-(250,100) GPGraphics.DrawLine(GPPen, 150,0, 250,100); GPBrush.Free; GPPen.Free; GPGraphics.Free; end; |
SetWidth(ペンの太さ); | ペンの太さ(幅)を変更する |
var GPGraphics:TGPGraphics; GPPen:TGPPen; GPPoints:Array of TGPPoint; Dash:Array of Single; begin GPGraphics := TGPGraphics.Create(Form1.Canvas.Handle); SetLength(GPPoints,3); GPPoints[0]:=MakePoint(200,100); GPPoints[1]:=MakePoint(300,100); GPPoints[2]:=MakePoint(300,200); //太さ12の不透明の赤色ペンの作成 GPPen := TGPPen.Create(MakeColor(255, 255,0,0), 12); //ペンの太さを2に変更 GPPen.SetWidth(2); //ペンの色を半透過の赤色に変更 GPPen.SetColor(MakeColor(128, 255,0,0)); //アンチエイリアス(スムージング)を有効にする GPGraphics.SetSmoothingMode(SmoothingModeAntiAlias8x4); //ペンの描画開始形状を丸に設定 GPPen.SetStartCap(LineCapRound); //ペンの描画終了形状を矢印に設定 GPPen.SetEndCap(LineCapArrowAnchor); //ペンの接合形状を面取り(ベベル)に設定 GPPen.SetLineJoin(LineJoinBevel); //カスタムの破線を設定 SetLength(Dash, 4); Dash[0]:= 4/GPPen.GetWidth; Dash[1]:= 4/GPPen.GetWidth; Dash[2]:= 16/GPPen.GetWidth; Dash[3]:= 4/GPPen.GetWidth; GPPen.SetDashPattern(PSingle(@Dash[0]), Length(Dash)); //GPPoints[0]~GPPoints[2]を結ぶ線を描画 GPGraphics.DrawLines( GPPen, PGPPoint(@GPPoints[0]), Length(GPPoints) ); GPPen.Free; GPGraphics.Free; end; |
SetColor(TGPColor); | ペンの色をTGPColorに変更する | |
SetStartCap(ペンの描画開始形状); |
ペンの描画開始形状を変更する
|
|
SetEndCap(ペンの描画終了形状); |
ペンの描画終了形状を変更する 指定できる値は上記の SetStartCap と同じ |
|
SetLineJoin(ペンの描画接合形状); |
ペンの描画接合形状を変更する (線と線の接合部分の形状)
|
|
SetDashPattern(PSingle, Count); | カスタム破線を設定する |
TGPBrush(ブラシ)派生クラス
以下はブラシの派生クラスの一部抜粋です。
クラス | 解説 | サンプル |
---|---|---|
TGPSolidBrush.Create(TGPColor); | 指定色のべた塗りブラシを作成 |
var GPBrush:TGPBrush; begin //緑色のブラシを作成 GPBrush:=TGPSolidBrush.Create(MakeColor(0,255,0)); GPBrush.Free; //青色の半透過ブラシを作成 GPBrush:=TGPSolidBrush.Create(MakeColor(128, 0,0,255)); GPBrush.Free; end; |
TGPLinearGradientBrush.Create(p1,p2:TGPoint ; Color1,Color2:TGPColor); | 座標p1の色Color1から、座標p2の色Color2のグラデーションブラシを作成 |
var GPBrush:TGPBrush;
begin
//線形グラデーションブラシの作成
GPBrush:=TGPLinearGradientBrush.Create(
MakePoint(100,200), //座標1
MakePoint(400,250), //座標2
MakeColor(255, 255,0,0), //座標1の色 赤
MakeColor(255, 0,0,255) //座標1の色 青
GPBrush.Free;
end;
|
TGPHatchBrush.Create(Style:TGPHatchStyle, ForeColor,BackColor:TGPColor); |
指定したスタイル、前方色(ForeColor)、後方色(BackColor)のハッチブラシを作成 スタイルには以下のような値を指定できる(一部抜粋) HatchStyleHorizontal:水平ハッチ HatchStyleVertical:縦ハッチ HatchStyleForwardDiagonal:左上から右下ハッチ HatchStyleBackwardDiagonal:左下から右上ハッチ HatchStyleCross:クロスハッチ HatchStyleDiagonalCross:45度クロスハッチ HatchStyle10Percent:10%のドットハッチ |
var GPBrush:TGPBrush; begin //ハッチブラシの作成 GPBrush:=TGPHatchBrush.Create( HatchStyle.HatchStyleCross, //クロスハッチ MakeColor(255, 0,0,255), //前方色 MakeColor(255, 255,255,255) //後方色 ); GPBrush.Free; end; |