第9回投稿は

Bitmapの扱いについて。


先日「Dockしたいけど他の部品も追加したい」で作った

コンボボックスで選択した写真を表示するツール。

http://ameblo.jp/se-natsu/entry-10144928216.html



splitContainer+pictureBox

このプログラムはこうなっています。


//-------------正解プログラム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;
}

//-----------------------------------------

タスクマネージャを表示すると、

コンボボックス操作してもずっと平坦なままなので

解決できてることがわかります。