角が丸い四角形を作りたかったので多角形と扇形の組み合わせで表現しています。
もっとシンプルな方法がありそうですが見つけられませんでした。
今回は図形の描画と塗りつぶしを同時に行う機能を使っていますが、ぺイントソフトでよくある同一色の領域を塗りつぶす機能はあるのでしょうか?
また、せっかく動的に画像を作成しているのに各種設定値をハードコーディングしているあたりが残念です。
最小限のパラメータを元に計算で割り出せればよかったのですが見た目が悪かったので断念しました。
ソース
using System;
using System.Windows.Forms;
using System.Drawing;
//
// 画像に扇形と多角形と文字を描く
//
namespace MyForm
{
class Form1 : Form
{
PictureBox picbox;
/////////////////////////////
// Main
/////////////////////////////
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
// コンストラクタ
public Form1()
{
picbox = new PictureBox{
Dock = DockStyle.Fill,
SizeMode = PictureBoxSizeMode.Zoom,
};
var message = "NowPrinting"; // 描画する文字列
var w = 256; // 画像の幅
var h = 256; // 画像の高さ
var backgroundColor = Color.Lime; // 背景色
var forgroundColor = Color.WhiteSmoke; /// 前景色
var bmp = new Bitmap(w, h);
using (var g = Graphics.FromImage(bmp)) {
// ブラシ
var brash = new SolidBrush(backgroundColor);
// 左上の角
g.FillPie(brash, 10, 10, 50, 50, 180, 90);
// 右上の角
g.FillPie(brash, 195, 10, 50, 50, 270, 90);
// 左下の角
g.FillPie(brash, 10, 195, 50, 50, 90, 90);
// 右下の角
g.FillPie(brash, 195, 195, 50, 50, 0, 90);
// 内部
Point[] p = {
new Point(10+25,10+25),
new Point(10+25,10),
new Point(256-10-25,10),
new Point(256-10-25,10+25),
new Point(256-10,10+25),
new Point(256-10,256-10-25),
new Point(256-10-25,256-10-25),
new Point(256-10-25,256-10),
new Point(10+25,256-10),
new Point(10+25,256-10-25),
new Point(10,256-10-25),
new Point(10,10+25),
};
g.FillPolygon(brash , p);
var top = 100;
var fnt = new Font("MS UI GOTHIC", 32);
var sb = new SolidBrush(Color.DimGray);
var fb = new SolidBrush(forgroundColor);
g.DrawString(message, fnt, sb, 12+2, top+2); // 文字の影
g.DrawString(message, fnt, fb, 12, top); // 文字の描画
}
picbox.Image = bmp;
Controls.Add(picbox);
}
}
}
コンパイル
PS>csc ./NowPrinting.cs
mono
$mcs NowPrinting.cs /r:System.Windows.Forms.dll /r:System.Drawing.dll
実行
PS>./NowPrinting.exe
mono
$mono ./NowPrinting.exe
コメント