お世話になります。
以下の環境でプログラムを作成しております。
WinXP(SP2) VC++2005 Windowsフォームアプリ
プログラムではフォーム上にPictureBoxを貼り付け、そのImageプロパティにBitmapを割
り当ててBitmapに描画をしております。この際、フォームのリサイズに伴いImageプロパ
ティに割り付けたBitmapのサイズを変更する方法を教えてください。
現状はリサイズではなくBitmapの再割り当てで対応しようとしましたが、再割り当てが出
来ていないようです。再割り当ての前にDisposeしようとしましたが、これもできませ
ん。
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^
e) {
pictureBox1->Image = gcnew Bitmap( pictureBox1->Width, pictureBox1-
>Height );
}
private: System::Void pictureBox1_Resize(System::Object^ sender,
System::EventArgs^ e) {
Control ^c = (Control^)sender;
pictureBox1->Image = gcnew Bitmap( c->Width, c->Height );
// 描画更新処理
...
}
なにか基本的なことが理解できていないのかもしれません。
ご教授ください。
Konです。
私もいつも質問する側なので、あまり頼りになりませんが、
どうやら、同じようなプログラムを扱っているようなので、
お役に立てばと思いまして・・・。
”BMPのサイズを変更したい”というのは、
拡大縮小したいということなのでしょうか?
それとも、Formの大きさに合わせて表示サイズを変更したいということでしょうか?
Konさん
返信ありがとうございます。
判りにくい質問ですみません。
やりたいことはリサイズ時の再描画です。
あらかじめ用意したビットマップを拡大縮小するのではなく、
新サイズに合わせたビットマップに描画しなおして表示させたいのです。
リサイズイベント
↓
新サイズにてビットマップ作成
↓
ビットマップに描画
↓
ビットマップを表示
って流れです。
よろしくお願いします。
pictureBox の配置のプロパティに Anchor というのがあります。
RightとBottomも設定しておくと、リサイズの記述が無くても
Formの大きさに合わせてpictureBox のサイズも変更されます。
ご希望の挙動になると良いのですか・・・。
多分、それでやってしまうと元の画像のサイズは変わらずに
ストレッチされてしまうと思います。
やりたいのはそのサイズで作成したビットマップ上に描画したいわけなので
Konさんのやり方では実現できません。
で、考えたんですが、
pictureBoxから作り直しても駄目ですかねぇ。
理屈から行くとImageのすげ替えで出来そうな気もしますけれど、
それで駄目ならpictureBoxから作成しなおせば、うまく行くのでは
ないかと思うんですが。
普段、ネイティブばっかりやっているので
その物ズバリのレスは付けられませんけれど。
そうですか、ストレッチされてしまうんですね。
SizeMode がNormalなら、ストレッチされないと思っていました。
私のソースでは、ストレッチされないので、
何か知らない設定が有るのでしょう。
お役に立てず、ごめんなさいです。
ストレッチされないという事は、小さいビットマップ画像の場合は
画像の無い部分ができてしまうと言うことですか?
なにせC++/CLIでは作らないので確認して無いのですけれど。
画像が無い部分ができてるならストレッチはされていないと思いますけれど、
ビットマップに描画する時には元のサイズの分しか描画されないと思います。
ビットマップの方のサイズが自動で拡張されているとは考えにくいので。
単純にストレッチせずに出しているだけであれば、
ビットマップ自体のサイズを変える必要は無いのではと思います。
今回の目的はビットマップその物のサイズを変更したいと言う話なので
ストレッチされる/されないに関わらず、ビットマップのサイズが
変わらないのであれば、解決できないと思いますよ。
わかりにくいので補足。
> 単純にストレッチせずに出しているだけであれば、
> ビットマップ自体のサイズを変える必要は無いのではと思います。
pictureBixが単純にストレッチせずに表示していると言うだけなら
pictureBoxが設定されているビットマップのサイズをリサイズする
必要は無くてそのまま表示すればいいだけだから、サイズを変えては
いないだろうと言う話です。
Form の方が大きい場合は、画像がない部分ができますね。
>今回の目的はビットマップその物のサイズを変更したいと言う話なので
そうですか、リサイズ時の再描画がしたいということでしたので、
”表示”サイズだけ変われば良いのかなと思い、
Bitmapのビットマップのサイズをリサイズしなくても大丈夫。
と思ったのですが、どうやら、筋違いだったようです。
お騒がせしました。m(_ _)m
PATIOさん、Konさん
返信ありがとうございます。
問題となった現象はPATIOさんがご指摘の通り、エリア拡張時にはビットマップに余白が
付いて表示されておりました。つまり、ビットマップサイズの変更が出来ていない状況で
す。
また、今回はビットマップサイズの変更が目的であったのでKonさんご提案のストレッチ
はやや目的から離れてしまいます。(説明が足りなくてすみませんでした)
で、なんとか自己解決できたのでその方法を記します。
もともとの方法はリサイズのイベントハンドラpictureBox1_Resize()でビットマップのサ
イズ変更を試みてたんですが、この方法が悪かったようで、ペイントのイベントハンドラ
内でサイズ変更を行うとうまくいきました。実際にはリサイズイベントでフラグを立て、
次回のペイントハンドラ内でフラグを確認してビットマップのサイズ変更を行っていま
す。
bool resizeFlg;
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) {
pictureBox1->Image = gcnew Bitmap( pictureBox1->Width, pictureBox1-
>Height );
}
private: System::Void pictureBox1_Resize(System::Object^ sender,
System::EventArgs^ e) {
resizeFlg=true;
}
void pictureBoxXY_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {
if(resizeFlg){
Control ^c = (Control^)sender;
pictureBox1->Image = gcnew Bitmap( c->Width, c->Height );
// 描画更新処理
...
resizeFlg=false;
}
}
なぜ、この方法だと上手くいくのか理解していませんがとりあえず目的の動作は出来まし
た。より賢い方法がありましたら教えてください。
とりあえず終了とさせていただきます。ありがとうございました。