VC++を始めて2週間の初心者です。
環境はWinXP VisualStudio.NET2003 VC++ MFC です。
雰囲気がWindowsのヘルプのようなものを作っています。
ダイアログの左上がツリービュー、左下がエディットボックスで説明の表示
右に説明に合った画像を表示します。
ツリービューを選ぶと説明が出る部分はできました。
ピクチャーコントロールを張り、プロパティでリソースのIDを指定しました。
実行すると画像が表示されます。
実行中に同じダイアログにある、ツリービューやボタンを押すことでその画像を消して、違う画
像に変えたいのですが変え方がわかりません。
もしご存知の方がいらっしゃったらお教えください。
予めピクチャボックスにメンバ変数(コントロール)を割り当てておきます。
CBitmap::LoadBitmapでリソースIDからビットマップを読み込みます。
CStatic::SetBitmapで読み込んだビットマップをコントロールに割り当てます。
コントロールのピクチャが変わります。
上手く再表示がされない場合(ビットマップだけ編集した場合とか)は適当に
CWnd::InvalidateRect。
Win32APIでやる場合は
CBitmap::LoadBitmapの代わりにLoadBitmap
CStatic::SetBitmapの代わりにSendMessage(STM_SETIMAGE)
が使えます。
ウィンドウサイズとかはコントロールのスタイルで多少いじれたような。
なお、古いビットマップの開放とかはキッチリ面倒見ないとリソース/メモリ使用量
がやばいです。
配置したピクチャーコントロールを右クリックして変数の追加を選ぶと
「IDC_STATICを持つコントロールにメンバ変数を追加することはできません。」
と表示されて変数の追加ができません。
追加の仕方を教えてください。
IDC_STATIC を何か別のID(IDC_ST_BITMAPなど)に変えてから、
もう一度やってみてください。
変数の追加ができました。
ありがとうございました。
別の画像を表示する時に、今表示している画像は消えますか?
それとも下に残ってて次々開くと、どんどん重くなる感じですか?
>IDC_STATIC
「操作したいコントロール」は静的にして置いても仕方が無いし、区別のためにも
ID振ります。
>別の画像を表示する時に、今表示している画像は消えますか?
表示上は消える。
メモリ上には残る。
#なお、古いビットマップの開放とかはキッチリ面倒見ないとリソース/メモリ使用量
#がやばいです。
SetBitmapで古いビットマップが戻ってきたと思うので古いほうを毎回削除すれば
良いと思うけど、初期状態で割り当てた分がどうなるかはちょっと…VS6のMSDN
で載ってる所知らないし。
あと、多分CBitmapはデストラクタでハンドル消したりするんじゃないかと思うか
ら、そこ注意。まぁ、ビットマップは結局HBITMAP越しに触ることになるから
CBitmap使う意味は元々薄いかも。
というか自分で調べましょうよ。SetBitmapみれば古いビットマップ返すことは明
白で、ハンドルが有効なまま帰ってくるということはメモリも確保されっぱなしってこ
とです。ハンドルが手元にあるのに放置していったら手の付けられないゴミの山が
残ります。
…MFCはこういうハンドルもラップして扱ってくれれば後腐れが無いのだが。
そもそも聞くだけでは根本解決にはならないので、キーワードが分かったら自分で
も調べましょう。レスする人も完璧じゃないのですし……
ありがとうございました。
MSDNによると XP からalpha含んだbitmap使えるようになってたんだね。
今更にして知ったよ。
http://msdn.microsoft.com/en-us/library/bb760782(VS.85).aspx
> Important
>
> STM_SETIMAGEで設定したbitmapの後始末は全てお前が看ろよ。俺は一切関知しないから。
> 後、XP(要visualstyle適用)でalpha値含んだbitmapを指定するときは注意しろよ。俺は
> bitmapのコピーを勝手に作っちゃうけど、それの後片付けなんてしないから。ゴミが残る
> のが嫌ならお前が片付ければ良い事さ!