|
分類:[C#]
98334 に続くインスタンスの生成と破棄シリーズ第3弾です(笑)。連投恐れ入ります。
Pb はデザイナーで貼り付けたPictureBox です。以下の@ABに対する疑問に答えていただければ幸いです。
public partial class Form1 : Form { Bitmap bmp;//各イベントハンドラで共有して使うためここで宣言
private void BtnFileOpen_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); if (dialog.ShowDialog() == DialogResult.OK) { try { bmp = new Bitmap(dialog.FileName); if (Pb.Image != null) { Pb.Image.Dispose(); } Pb.Image = bmp; } catch { MessageBox.Show("これは画像ファイルではありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } }
//小さな画像を PictureBox.BackgroundImage に敷き詰める private void BtnTile_Click(object sender, EventArgs e) { if (bmp.Width < 60 || bmp.Width > 120) { return; } if (bmp.Height < 60 || bmp.Height > 120) { return; }
Bitmap backbmp = new Bitmap(bmp.Width, bmp.Height); Graphics g = Graphics.FromImage(backbmp); // @new はなぜ不要なのか? g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); Pb.Width = bmp.Width * 10; Pb.Height = bmp.Height * 8; Pb.BackgroundImage = backbmp; Pb.BackgroundImageLayout = ImageLayout.Tile; Pb.Invalidate(); g.Dispose(); //これはOKで //backbmp.Dispose(); が実行エラーとなるのはなぜか A /* インスタンスの破棄は C# のGCに任せればいいのだろうが、やはり気になるのでネット を検索したら using 文で囲めば Dispose は不要とあったので、見よう見まねで以下のよ うにコーディングしたら、あっさり実行エラー B using (var backbmp = new Bitmap(bmp.Width, bmp.Height)) { Graphics g = Graphics.FromImage(backbmp); g.DrawImage(bmp, 0, 0, bmp.Width, bmp.Height); Pb.Width = bmp.Width * 10; Pb.Height = bmp.Height * 8; Pb.BackgroundImage = backbmp; Pb.BackgroundImageLayout = ImageLayout.Tile; Pb.Invalidate(); } */ } }
|