VC++でGDI+ そにょ2 〜基本的な使い方〜

リファレンス嫁はさすがにアレなので、とっかかりになれるぐらいの基本的な操作だけでも簡単に書いておく。

Graphicsオブジェクトの作成

基本的な描画操作はGraphicsオブジェクトに対して行う。Graphicsクラスのコンストラクタは4つあるが、クライアント領域に描画する場合は基本的に以下の2つ。hWndは描画する対象のウィンドウハンドルである。

HDC hdc = BeginPaint(hWnd, &PS);
Graphics graphics(hdc);

または

Graphics graphics(hWnd);

背景色は白であるが、他の色で初期化したい場合はClearメソッドを用いる。ちなみにColorクラスのコンストラクタの引数はARGBの順である。Aはアルファ値、255で不透明、0で透明。

Color blueColor(255, 0, 0, 255);
graphics.Clear(blueColor);

図形の描画

GraphicsクラスのDraw〜メソッドやFill〜メソッドを用いる。例以外のメソッドはリファレンス参照。Penの作り方は各メソッドのサンプルコードを参考に。

HDC hdc = BeginPaint(hWnd, &PS);
Graphics graphics(hdc);

Pen blackPen(Color(255, 0, 0, 0), 3);
Pen redPen(Color(255, 255, 0, 0), 3);
Pen greenPen(Color(255, 0, 255, 0), 3);
SolidBrush blueBrush(Color(255, 0, 0, 255));

// 線を引く
// DrawLine(const Pen *pen, INT x1, INT y1, INT x2, INT y2);
graphics.DrawLine(black&Pen,0,0,100,200);

// 長方形を描く
// DrawRectangle(const Pen *pen, INT x, INT y, INT width, INT height);
graphics.DrawLine(&redPen,20,40,200,300);

// 弧を描く
// DrawArc(const Pen *pen, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle);
graphicsDrawArc(&greenPen,100,100,150,150.0f,0,270.0f);

// パスを塗りつぶす
// FillPath(const Brush *brush, const GraphicsPath *path);
GraphicsPath path;
PointF points[] = {PointF(30.0f, 40.0f), PointF(120.0f, 120.0f), PointF(150.0f, 70.0f)};
path.AddPolygon(points, 3);
graphics.FillPath(&blueBrush, &path);

文字の描画

// DrawString(const WCHAR *string, INT length, const Font *font, 
//         const RectF &layoutRect, const StringFormat *stringFormat, const Brush *brush);
WCHAR string[] = L"GDI+ DrawString";
Font fontTahoma(L"Tahoma", 16);
StringFormat format;
format.SetAlignment(StringAlignmentCenter);
SolidBrush blackBrush(Color(255, 0, 0, 0));
graphics.DrawString(string, 12, &fontTahoma, RectF(0.0f, 0.0f, 200.0f, 300.0f),
                                                                 &format, &blackBrush);

フォントとして指定できるものはTrueTypeフォントだけである。OpenTypeフォントは指定できない。OpenTypeフォントを使いたい場合はSjaak Priester氏のQGraphicsTextなどを使うと良い。

アンチエイリアス

アンチエイリアスをかけてなめらかに図形を描画したい場合はSetSmoothingModeメソッドを用いる。

graphics.SetSmoothingMode(SmoothingModeAntiAlias);