:図形の塗りつぶし、文字列の描画 など
提出フォロー:演習17 同心円を描こう
・フォームの中央から外側に向かって半径を10ずつ増やしながら9個の同心円を描こう
作成例
//演習17 同心円を描こう
using System; //C#標準クラス用
using System.Windows.Forms; //Application、Formクラス用
using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用
class Program : Form { //Formクラスの派生クラス
Image backi, playeri; //画像ファイル用変数
protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
base.OnPaint(e); //元のメソッドの内容を呼び出す
e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置
e.Graphics.DrawImage(playeri, backi.Width / 2 - playeri.Width / 2,
backi.Height - playeri.Height * 2); //自機を中央下部に描画
Pen pCyan2 = new Pen(Color.Cyan, 2); //水色の太さ2のペンを生成
int mx = backi.Width / 2, my = backi.Height / 2; //【以下追加】中心座標
for(int i = 1; i <= 9; i++) { //9個
e.Graphics.DrawEllipse(pCyan2, mx - i * 10, my - i * 10, i * 20, i * 20); //円を描く
}
}
public Program() { //コンストラクタ
try { //例外処理対象
backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む
playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む
} catch (Exception e) { //例外処理内容
MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
}
KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録
}
void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド
if (e.KeyCode.ToString() == "Escape") { //押されたキーのコードを文字列化したらEscape?
Close(); //フォームアプリケーションを終了
}
}
static void Main() { //実行用メソッド(publicはなくてOK)
Program f = new Program(); //自クラスのインスタンスを生成
f.Text = "Game"; //Form名を設定
f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定
Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成
f.Location = p; //インスタンスプロパティで初期位置を設定
f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化
f.ControlBox = false; //コントールボックスの非表示
f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定
Application.Run(f); //生成済のインスタンスを実行
}
}
テーマ18 矩形の塗りつぶし
・矩形の塗りつぶしには、DrawRectangleの代わりに、FillRectangleを用いる ・また、Penの代わりにBrushを用いる ・Brushは、System.Drawing.Brushクラスを指すが、これは抽象クラスであり、実際の描画ではBrushクラスの派生クラスを用いる https://learn.microsoft.com/ja-jp/dotnet/api/system.drawing.brush ・複数ある派生クラスの中で、最もシンプルなのがSystem.Drawing.SolidBrushクラスで、このクラスのコンストラクタに Color列挙体の列挙子を渡すことで、単色の塗りつぶし用のブラシが得られる ・書式例: Brush sb = new SolidBrush(Color.色名); ・FillRectangleメソッドにブラシと左上座標、幅、高さを渡すことで矩形の塗りつぶしが可能 ・書式例: e.Graphics.FillRectangle(ブラシ, 左上X座標, 左上Y座標, 幅, 高さ);
演習18 チェス盤を描こう
・画面上に8行8列の升目を描こう ・座標(10, 20)から各マスを30×30で、枠線の色はCyan、枠線の太さは2とする ・1行目の1マス目はCyanで塗りつぶし、1つおきに塗りつぶす ・演習17の同心円は削除する
作成例
//演習18 チェス盤を描こう
using System; //C#標準クラス用
using System.Windows.Forms; //Application、Formクラス用
using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用
class Program : Form { //Formクラスの派生クラス
Image backi, playeri; //画像ファイル用変数
protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
base.OnPaint(e); //元のメソッドの内容を呼び出す
e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置
e.Graphics.DrawImage(playeri, backi.Width / 2 - playeri.Width / 2,
backi.Height - playeri.Height * 2); //自機を中央下部に描画
Pen pCyan2 = new Pen(Color.Cyan, 2); //水色の太さ2のペンを生成
Brush bCyan = new SolidBrush(Color.Cyan); //【以下追加】水色の塗りつぶしブラシを生成
for(int i = 0; i < 8; i++) { //8列
for(int j = 0; j < 8; j++) { //8行
if ((i + j) % 2 == 0) { //1つおきに
e.Graphics.FillRectangle(bCyan, 10 + i * 30, 20 + j * 30, 30, 30); //塗りつぶす
} else {
e.Graphics.DrawRectangle(pCyan2, 10 + i * 30, 20 + j * 30, 30, 30); //枠を描く
}
}
}
}
public Program() { //コンストラクタ
try { //例外処理対象
backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む
playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む
} catch (Exception e) { //例外処理内容
MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
}
KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録
}
void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド
if (e.KeyCode.ToString() == "Escape") { //押されたキーのコードを文字列化したらEscape?
Close(); //フォームアプリケーションを終了
}
}
static void Main() { //実行用メソッド(publicはなくてOK)
Program f = new Program(); //自クラスのインスタンスを生成
f.Text = "Game"; //Form名を設定
f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定
Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成
f.Location = p; //インスタンスプロパティで初期位置を設定
f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化
f.ControlBox = false; //コントールボックスの非表示
f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定
Application.Run(f); //生成済のインスタンスを実行
}
}
演習19 チェス盤を描こう・改
・木目の画像を用意してImageとして用いることで、リアルなチェス盤を描こう ・mokume0.pngmokume1.png
・合わせて升目のサイズを50×50にしよう
作成例
//演習19 チェス盤を描こう・改
using System; //C#標準クラス用
using System.Windows.Forms; //Application、Formクラス用
using System.Drawing; //Size、Graphics、Image、Penクラス、Color構造体用
class Program : Form { //Formクラスの派生クラス
Image backi, playeri, chess0, chess1; //【変更】画像ファイル用変数
protected override void OnPaint(PaintEventArgs e) { //描画処理のオーバライド
base.OnPaint(e); //元のメソッドの内容を呼び出す
e.Graphics.DrawImage(backi, 0, 0); //画像をフォーム左上に配置
e.Graphics.DrawImage(playeri, backi.Width / 2 - playeri.Width / 2,
backi.Height - playeri.Height * 2); //自機を中央下部に描画
Pen pCyan2 = new Pen(Color.Cyan, 2); //水色の太さ2のペンを生成
Brush bMokume0 = new TextureBrush(chess0); //【変更】木目テクスチャブラシ0を生成
Brush bMokume1 = new TextureBrush(chess1); //【変更】木目テクスチャブラシ1を生成
for(int i = 0; i < 8; i++) { //8列
for(int j = 0; j < 8; j++) { //8行
if ((i + j) % 2 == 0) { //1つおきに
e.Graphics.FillRectangle(bMokume0, 10 + i * 50, 20 + j * 50, 50, 50); //【変更】木目0
} else {
e.Graphics.FillRectangle(bMokume1, 10 + i * 50, 20 + j * 50, 50, 50); //【変更】木目1
}
}
}
}
public Program() { //コンストラクタ
try { //例外処理対象
backi = Image.FromFile("backb2.bmp"); //背景画像ファイルを読み込む
playeri = Image.FromFile("player.gif"); //自機画像ファイルを読み込む
chess0 = Image.FromFile("mokume0.png"); //【追加】チェス画像ファイル0を読み込む
chess1 = Image.FromFile("mokume1.png"); //【追加】チェス画像ファイル1を読み込む
} catch (Exception e) { //例外処理内容
MessageBox.Show(e.ToString()); //内容をメッセージボックスに表示
}
KeyDown += new KeyEventHandler(OnKeyDown); //キー押し下げ時のメソッドを登録
}
void OnKeyDown(object o, KeyEventArgs e){ //キー押し下げ時に呼ばれるメソッド
if (e.KeyCode.ToString() == "Escape") { //押されたキーのコードを文字列化したらEscape?
Close(); //フォームアプリケーションを終了
}
}
static void Main() { //実行用メソッド(publicはなくてOK)
Program f = new Program(); //自クラスのインスタンスを生成
f.Text = "Game"; //Form名を設定
f.StartPosition = FormStartPosition.Manual; //「手動設定」を設定
Point p = new Point(300,0); //X座標とY座標のPointインスタンスを生成
f.Location = p; //インスタンスプロパティで初期位置を設定
f.FormBorderStyle = FormBorderStyle.FixedSingle; //フォームサイズの固定化
f.ControlBox = false; //コントールボックスの非表示
f.ClientSize = new Size(640, 480); //クライアントサイズの幅と高さを指定
Application.Run(f); //生成済のインスタンスを実行
}
}
テーマ19 文字列の描画
・コンソールアプリケーションでは既定のフォントによりデバッグコンソールに文字列を表示しているが、フォームアプリケーションでは
画像などと同様にフォーム上に文字列を描画する
・よって、色や大きさに加えてフォントも指定できる
・文字列の描画にはDrawString()メソッドを用い、色の指定にはブラシを用いる
・フォントの指定にはSystem.Drawing.Fontクラスのオブジェクトを用いる
・Fontクラスには複数のコンストラクタがあるが、シンプルなのはFont("フォント名", ポイント数)
例: Font f = new Font("メイリオ", 15);
・DrawStringメソッドにブラシと左上座標、幅、高さを渡すことで矩形の塗りつぶしが可能
・書式例: e.Graphics.FillRectangle(文字列, フォント, ブラシ, 左上X座標, 左上Y座標);
提出:演習19 チェス盤を描こう・改
mokume1.png
・合わせて升目のサイズを50×50にしよう