こんにちは、お世話になります。
XP(SP2) VC++6.0 MFC ダイアログベース で開発しております。
複数枚のディスク上のBMPファイルを読み込んで複数のピクチャーボックスに表示するプ
ログラムを作りたく、
参考書を買ってみたところファイルダイアログを開き画像を選択するサンプルが載って
いたのでそれを参考に開発しています。
サンプルは「開く」ボタンが押され画像が選択されたらファイルをオープンし、2つのヘ
ッダ部分を読み込み、色情報を取得し、画像ファイルの先頭ヘッダ部をスキップして実
データ部分を読み込んでいます。
そしてOnPaintを呼んでピクチャボックスに画像を描画しています。
<やった事>
ファイルダイアログ表示の部分を画像フォルダにある画像を参照するように書き直しま
した。
OnButton関数(ファイル読み込みからOnPaint呼び出しまで)の処理をループさせて、複数
枚の画像をピクチャボックス1(m_pict1)、ピクチャボックス2(m_pict2)に表示させるよ
うに書き直しました。
<やりたい事>
サンプルのままだと再描画が問題なく出来ているのですが、自分で書き直したプログラ
ムでは再描画されずクリアされてしまいます。
なので画面最小化→画面表示とした時に、クリアされずにきちんと再描画されるように
したいのです。
<思いついた解決策>
読み込んだ画像情報を配列などに記憶しておき、再描画のためにOnPaintが呼ばれた時に
その配列を元に、読み込んである画像数分再描画指示すればよいと思うのですが、その
情報を記憶しておく方法がわかりません。
そこで画像情報の記憶方法について、皆さんのアドバイスを頂きたくこの記事を書き込
みました。
また、これだけじゃ情報が足りない、他にもっと良い方法がある等ありましたらそれら
についてもコメントお願いします。
長文になってしまいましたが、よろしくお願いしますm(_)m
Win32APIのLoadImageでファイルから読み込むんでは駄目なんでしょうか?
これだと読み込んで展開してHBITMAPで返してくれますから
CloseHandleしない限りはメモリ上に保持されます。
MFCで扱いやすくしたいならCBitmap::FromHandleでCBitmapで扱えるように
できますし。
基本的には、読み込み処理をして読み込んだビットマップをメンバー変数上に
保持するようにしておいてInvalidateで画面を無効化して
OnPaintを動かし、OnPaint内でメンバー変数に保持している物を描画と言う流れに
なると思います。
参考にしている参考書はVC++用のものですか?
それにしては、MFCやWin32APIが使われていなくて変な感じですが。
思うにピクチャーボックスに表示するなら
OnPaintでするんじゃなくてピクチャーボックスに
割り当てればすむんじゃ無いかと言う気もしますけれど。
違いますかねぇ。
それなら自前で描画する必要すら有りませんし。
てくもです。コメントありがとうございます。
>Blueさん
そうです。サンプルでも使われていたのであまり理解せず「こういうものなのか」とい
う感じでそのまま流用していましたが、紹介していただいたURL先に詳しく書いてありそ
うなので勉強させていただきます。
>PATIOさん
LoadImage・・・すみません、ググって調べます。
参考書は「新Visual C++ 6.0入門 シニア編」です。
http://shop.sbcr.jp/isbn/0802/index.htm
(↑からサンプルファイルが落とせるようです。僕が参考にしているプログラムは
vcldbmpcです。)
もちろん、いきなりシニア編から読んだのではなく図書館でビギナー編を読みました。
ビギナー編ではリソースからの読み込みしか書いていなかったので、シニア編を注文し
た次第です。
ピクチャーボックスに割り当てるとはリソースから読み込むということでしょうか?
最終的には数十枚の画像の中からランダムで表示させたいので、そうした場合に実行フ
ァイルがでかくなってしまうのでは・・・と思ったので、ディスク上のファイルを読み込む
手法を採りました。
気持ちだけが焦ってよく調べもせずに質問してしまいました。
自分では調べたつもりだったのですが、Blueさんの教えてくれサイトも、LoadImageも知
りませんでした。
この週末を使って少しその辺のことを調べてみようと思います。
理解できたら改めて質問させていただきますので、その時またよろしくお願いしますm
(_)m
ピクチャーボックスにはオーナードローで描画するか、
サブクラスして画像を描画するようにすれば上手くいくと思いますけど。
OnPaint() は親ウインドウですか、それともピクチャーボックスの
OnPaint() でしょうか?あまり MFC には詳しくないですが OnPaint() を
使うのならピクチャーボックスの方に記述します。
親ウインドウの OnPaint() でピクチャーボックスに描画する方法だと
ピクチャーボックス自身の OnPaint() でクリアされると思います。
それなのでピクチャーボックスに対する OnPaint() か、オーナードローの
指定にしてから親ウインドウで画像を描画すれば良いと思う。
OnPaint() の部分のソースとか見ないと良く分からないな~ぁ。
あと MFC ではありませんが次の本に Windows の仕組みとしていろいろと
参考になりそうな技術が載っています。
http://www.amazon.co.jp/dp/4797325453/
私はこちらでお勉強しました。
画像のこととかも載っている。
こんにちは、てくもです。
LoadImage()を調べて使ってみたところ、前回までに表示された画像の全てが再描画され
るように出来ました。
画像の情報を記憶するのではなく、ファイル名を記憶してそこから再描画しているので
効率が良いとは言えないかもしれませんが・・・。
とりあえず今はこのままで先に進もうと思います。
ありがとうございました。
>オレンジフィッシュさん
ピクチャーボックスへのオーナーロード描画という手法についてもやり方が良く分から
ないので、落ち着いたら調べてみます。
それと、今度書店に行ったら紹介していただいた参考書を探してみたいと思います。
ありがとうございました。