第9回投稿は
Bitmapの扱いについて。
先日「Dockしたいけど他の部品も追加したい」で作った
コンボボックスで選択した写真を表示するツール。
http://ameblo.jp/se-natsu/entry-10144928216.html
このプログラムはこうなっています。
//-------------正解プログラム1--------------
array<String^>^ filename;
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
filename = gcnew array<String^>(3);
filename[0] = "C:\\xxxxx.JPG";
filename[1] = "C:\\yyyyy.JPG";
filename[2] = "C:\\zzzzz.JPG";
}
private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
this->pictureBox1->Image = Image::FromFile(filename[this->comboBox1->SelectedIndex]);
}
//-----------------------------------------
FormのLoadイベントでファイル名リストを作成し、
コンボボックスのSelectedIndexChangedイベントで
ファイルからImageを作成してます。
これは問題ありません。
でも、もっと複雑なプログラムにする場合、Bitmapを使います。
//-------------重くなるプログラム------------
Bitmap^ bmp;
private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
bmp = gcnew Bitmap(filename[this->comboBox1->SelectedIndex]);
this->pictureBox1->Image = bmp;
}
//-----------------------------------------
これの何が問題かって
Ctrl+Alt+Delを押してタスクマネージャを表示し、
パフォーマンスを見てみます。
見ればわかりますね。
gcnewだから安心かと思いきや
コンボボックスを操作するたびに使用メモリ領域が増えてる
こりゃ~重いハズだ。
でもBitmap::Disposeは
Imageクラスから継承 はされているけど、何故か
privateだかprotectedだかになっていて
bmp->Dispose();
と書くと
error C2039: 'Dispose' : 'System::Drawing::Bitmap' のメンバではありません。
とか言われる。
で、こうなる。
//-------------正解プログラム2------------
Bitmap^ bmp;
private: System::Void comboBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
if(bmp) delete(bmp);
bmp = gcnew Bitmap(filename[this->comboBox1->SelectedIndex]);
this->pictureBox1->Image = bmp;
}
//-----------------------------------------
タスクマネージャを表示すると、
コンボボックス操作してもずっと平坦なままなので
解決できてることがわかります。