前回はレイヤーのサイズを変更できるようにしましたが、今回は表示される大きさを変更できるようにします。
画像がディスプレイの大きさを超えていることはよくあります。これは縮小なしのそのままのサイズで表示させた場合です。
下は50%に縮小して表示させたものです。これなら全体をみながら編集できます。
まずメニューをつくりましょう。
これは現在の拡大率/縮小率にかんするプロパティです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public partial class Form1 : Form { int rateReduction = 100; int RateReduction { get { return rateReduction; } set { rateReduction = value; pictureBox1.Invalidate(); } } } |
メニューが選択されたらRateReductionプロパティに値をセットします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public partial class Form1 : Form { private void Percent100MenuItem_Click(object sender, EventArgs e) { RateReduction = 100; } private void Percent150MenuItem_Click(object sender, EventArgs e) { RateReduction = 150; } private void Percent200MenuItem_Click(object sender, EventArgs e) { RateReduction = 200; } private void Percent75MenuItem_Click(object sender, EventArgs e) { RateReduction = 75; } private void Percent50MenuItem_Click(object sender, EventArgs e) { RateReduction = 50; } private void Percent30MenuItem_Click(object sender, EventArgs e) { RateReduction = 30; } } |
また現在の拡大率/縮小率がどうなっているかわかるようにメニューにチェックがつくようにします。メニューの[表示]がドロップダウンするときにRateReductionプロパティを調べてメニューにチェックマークをつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public partial class Form1 : Form { private void RateReductionMenuItem_DropDownOpening(object sender, EventArgs e) { Percent100MenuItem.Checked = false; Percent150MenuItem.Checked = false; Percent200MenuItem.Checked = false; Percent75MenuItem.Checked = false; Percent50MenuItem.Checked = false; Percent30MenuItem.Checked = false; if(RateReduction == 100) Percent100MenuItem.Checked = true; if(RateReduction == 150) Percent150MenuItem.Checked = true; if(RateReduction == 200) Percent200MenuItem.Checked = true; if(RateReduction == 75) Percent75MenuItem.Checked = true; if(RateReduction == 50) Percent50MenuItem.Checked = true; if(RateReduction == 30) Percent30MenuItem.Checked = true; } } |
RateReductionプロパティをセットしようとするとPictureBox.Invalidate()メソッドがよばれるようになっているので、あとはイベントハンドラpictureBox1_Paintで適切な処理をするだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { private void pictureBox1_Paint(object sender, PaintEventArgs e) { List<Layer> layers = Layers.ToList(); layers.Reverse(); foreach(Layer layer in layers) { if(layer.Bitmap != null) { Rectangle srcRect = new Rectangle(new Point(0, 0), new Size(layer.Bitmap.Width, layer.Bitmap.Height)); int rate = this.RateReduction; int x = layer.X * rate / 100; int y = layer.Y * rate / 100; int width = layer.Width * rate / 100; int height = layer.Height * rate / 100; Rectangle destRect = new Rectangle(new Point(x, y), new Size(width, height)); e.Graphics.DrawImage(layer.Bitmap, destRect, srcRect, GraphicsUnit.Pixel); } } } } |