なにをしたいにしても,
> m_Pict.SetBitmap(m_Bitmap) ; <--ここで落ちる。
がひっかかりますねぇ
m_Bitmapは正しいHBITMAPなのかなぁ
hiroccoさん、ryoさん、仲澤@失業者さん、レスありがとうございます。
<作業上、やりたいこと>
「リソースエディタを使いたい」です。
できれば、クラスウィザードでピクチャーIDに対応して作った変数も使いたいです。
そのほうが、ソースが簡単で、しかも、これから同じようなことをするときの作業効率
もよいので、そう思うのですが、実現できないとなると話はかわってしまいます。
<プログラム全体のイメージ>
「作図を描画させるダイアログ」を「メインになるダイアログ」から、なにがしかの
ボタンを押すとモーダルさせて、その「作図を描画させるダイアログ」内のピクチャー
ボックスに描画し、その下につくった「戻る」ボタンを押すと、ウインドウを閉じ、も
との「メインになるダイアログ」に戻るようなものをイメージしています。今回、つく
っているのは、その一部を独立させたテストのようなものです。
重ねて説明不足をお詫びいたします。
メンバ変数でCBitmapを宣言しておいて,
CBitmap m_bitmap;
IDC_PICTのスタイルにはSS_BITMAPを設定しておいて
後はOnInitDialogで
m_bitmap.LoadBitmap( IDB_BITMAP1 );
GetDlgItem( IDC_PICT )->SetBitmap( m_bitmap.m_hObject );
で十分じゃないかな?
でも、これ何に使うの?
ビットマップファイル読み込むとか
ユーザに描画させるとかはしないのかな?
なんかするなら
WM_PAINTは必須ッス
View側で動的にセットするビットマップを作成して
Staticコントロールに設定したいという話なら
メモリDC上で描画する時はメモリDCに選択した状態で
メモリDCに対して描画をした後、ビットマップの選択状態を
解除して、作成したビットマップをStaticコントロールに
設定すれば、描画その物はStaticコントロールがやってくれるはずです。
実際に似たような事をやった事がありますし。
既に指摘されていますが、ビットマップがどこかのDCに
選択状態のままでは他には転用できないので、
一旦選択状態を解除しないと駄目だと思います。
そういう部分を理解した上でその辺の矛盾がないように
ビットマップを作成してStaticコントロールに設定する
と言う話になると思うのでビットマップの取り回しも含めて
再度検討されてはいかがでしょうか?
任意のビットマップをStaticコントロールに設定したいだけなら
描画その物はStaticコントロールに任せてしまってもよいような気もします。
追記:
m_Bitmapはどういう型の変数なんでしょう。
その答えが提示されていません。
仮にCBitmapの変数だったとして、CBitmap::operator HBITMAPを
期待して m_Pict.SetBitmap(m_Bitmap);してますか?
hirocco さん、レスありがとうございます。
>でも、これ何に使うの?
将来的には、数学の関数表示するつもりです。
例えばユーザにSIN(X)+COS(X)という用に指定させて、あとは、
これを作図して、表示させるといったようなものです。
PATIO さんレスありがとうございます。
>m_Bitmapはどういう型の変数なんでしょう。
その答えが提示されていません。
すいません。ご返答が追いついていません。
m_BitmapはCBitmapです。
>CBitmap::operator HBITMAPを期待して
すいません。勉強不足で。意味がよくわかりません。
> 例えばユーザにSIN(X)+COS(X)という用に指定させて、あとは、
> これを作図して、表示させるといったようなものです
ていうことはビットマップの内容は変わるってことね
だったらぁ
OnInitDialogとかで
CompatibleDCやCompatibleBitmap(スペルあってる?)で
メンバ変数のHDCとHBITMAP(CDCやCBitmap)を作っておいて,
どこかでそれを描画して
WM_PAINTのタイミングでBitBlt等で転送でおしまい
ただ, CStaticを使う意味ないよねぇ
>>CBitmap::operator HBITMAPを期待して
訳
CBitmap≠HBITMAPなのは知っているけど,
普通はそのくらい自動で変換できる機能ぐらいあっても当然でしょって期待して
ちゃんと翻訳できてるかな?
ちと、SetBitmapを試してみたが
NULLや初期化してないもの、すでに関連付けされてるものもしくは同じものを繰り返しても
エラーにならないですね
関数に失敗し0が返るだけで、落ちないです
落ちるのはデバッグモードでウィンドウが無い場合ぐらいでした
最初に言われていた「落ちる」エラーはどんなエラーだったのでしょうか?
ところで、ほんとにダイアログベース?
ダイアログリソースはダイアログベース以外でも使うよ
hiroccoさん、レスありがとうございます。
>ただ, CStaticを使う意味ないよねぇ
確かにそう思えてくるんですが、他にボタンなども使いたいし、
リソースエディタをつかって、簡単にやりたいとおもうのですが・・・
>>訳 CBitmap≠HBITMAPなのは知っているけど, 普通はそのくらい自動で変換できる
機能ぐらいあっても当然でしょって期待して
ハンドルが引数になってるものは、そういう形も使える?ということになる?のです
か?マニュアルには書いてありませんが・・・
PATIOさんのいう
CBitmap::operator HBITMAPは, CBitmapには存在してますよね
その辺を理解してますか?って心配してくれたみたいですよ
これは(HBITMAP)ってキャストするとCBitmap::operator HBITMAPっていうメソッドがよ
ばれて, 内部で確保してる?HBITMAP型のメンバ変数を戻しますってことで,
SetBitmapの引数に, HBITMAPではなくCBitmapをそのまま渡してもいいですよって事です
けど, よくわからないで使うのはつまらないモンね
CStaticを使っておけばリソースエディタでビジュアル的にサイズとかわかるしねぇ
だとしたら, もうそれ非表示にしちゃってダイアログに直接描画でいいと思うの
もしくは, もう決まった描画があって, それをクラス化したいなら, CStaticから派生で
CStatic内のWM_PAINTで問題ないですってね思いますよ
あと, SetBitmap?
私はあんまり使わないねぇ
これが, アニメーションGIFとかが使えるとSetBitmapって, かなり使えるのになぁ
うーーん、
>落ちたのは、ステップ実行して確かめました。
VCのバージョンにもよるのかも知れませんが、ステップでなくブレークで
しらべたほうがいいですね。
まず、
新規にまっさらなCViewのプロジェクトを作成する。
いま考えているビットマップの表示部分をOnDraw()に移植する。
それで、ビットマップが表示しますか?
>ただ, CStaticを使う意味ないよねぇ
ピクチャーコントロールに表示させたいのでしょう。
> CWnd *myWnd;
> myWnd = GetDlgItem(IDC_XXXX);
> pDC = myWnd->GetDC();
IDC_XXXXは、ピクチャーコントロールのID
例として、こうやってDCを取得しないとまずいですね。
たぶん、「hWnd == NULL」等の例外が発生すると思います。
中間報告
CStatic の派生クラス(CStaticOrg)を作り、そのクラスのWM_PAINTメッセージに対応
する関数、OnPaint()の中で次のコーディングしてみる。
(ここまで2分ぐらいでできる)
void CStaticOrg::OnPaint()
{
CPaintDC dc(this); // 描画用のデバイス コンテキスト
// TODO: この位置にメッセージ ハンドラ用のコードを追加してください
dc.LineTo(100,100) ;
// 描画用メッセージとして CStatic::OnPaint() を呼び出してはいけません
}
クラスウィザードでピクチャーボックスをくっつけたダイアログのクラスで、ピクチャ
ーボックスのメンバ変数の追加をし、そのときにコントロールで派生クラス
(CStaticOrg)で宣言する。(このとき、メンバ変数の型の選択にCStaticOrgがでてき
たのを確認)
するとイメージどおり書かれました。
(すべてで5分程度でできました)
まあ、方法論的には色々あるのでこれで無いとだめと言うのは
ないかなと思います。
勿論、目的に合わない方法が駄目と言うのは当たり前の話ですが。
例えば、bitmapにいつも同じ線を書き込んで表示すれば良いなら
CStaticの派生クラスを作成してそのOnPaint中で固定の描画をすれば、
そのクラスでサブクラス化する事で対応可能だと思います。
この辺は常套手段なので覚えておくと良いですね。
bitmap上の描画がユーザーのオペレーションによって変わるとか
ユーザーに書かせようと思っているなら上記の方法だと
派生クラス側でやりたい描画全てに対応できるような実装が必要になります。
上記のようなクラスを使いまわすつもりがあるならそういう設計も有り
だと思います。
結局、どういう事がしたくてどういう実装をしようとしているか
と言う話に尽きるんですよね。なのでご本人が自分がやりたい事、
やるべき事をどこまで掴んでいて、それに対してどういうやり方を
しようとしているかと言う話になると思います。
そこがぐらつくと話が発散してしまって結論にたどり着くのが
難しくなってしまいます。
追伸:
> CBitmap::operator HBITMAPは, CBitmapには存在してますよね
> その辺を理解してますか?って心配してくれたみたいですよ
解説ありがとうございます。
説明内容は私が言いたい事は全て言われているので
私が補足する部分は有りません。
こういう部分の理解って結構大事なので出てくる都度、
きちんと理解して行くようにした方がいいです。
後でまとめてなんてのは多分無理なので。
PATIO さん、レスありがとうございます。
今回は、これでひとまず、解決ということにしたいと思います。
みなさん、ありがとうございました。
今回、すごく勉強になったこと。
>例えば、bitmapにいつも同じ線を書き込んで表示すれば良いなら
>CStaticの派生クラスを作成してそのOnPaint中で固定の描画をすれば、
>そのクラスでサブクラス化する事で対応可能だと思います。
>この辺は常套手段なので覚えておくと良いですね。
今回の質問でよくわかったこと
>本当は何がしたいのか、「したいこと」とを具体的に述べる
いろいろと枝分かれしていったので、皆さんのレス、ひとつひとつにもお答えしていな
いものもありますが、お許しください。
今後ともよろしくおねがいします。