OpenGLの画像をダイアログに貼ったピクチャーに表示するようなプログラムを作成していま
す。
OpenGLの画像をWindowのクライント領域全部に表示するプログラムとダイアログに貼ったピ
クチャーに線を描くプログラムを元にしています。
::OnCreate関数内で、
CWnd * h = GetDlgItem(IDC_PICTURE1);
m_pDC = h->GetDC();
(ちなみに CDC* m_pDC;です。)
を実行すると、GetDlgItem関数の戻り値がおかしいようです。
(GetDlgItemの戻り値0x00000000です。)
OpenGLの画像をピクチャーに表示する事は、可能ですか?
GetDlgItem関数をOnCreate内で使っている事が間違っているのでしょうか?
根本的にGetDlgItem関数の使い方を間違っているのでしょうか?
Win98+VC6.0+SP3でMFCのSDIを使用しています。
アドバイスお願いします。
まず、GetDlgItem()呼び出しの直後にGetLastError()を呼び出し、
エラーコードを調べてください。
> GetDlgItem関数をOnCreate内で使っている事が間違っているのでしょうか?
これについては、GetDlgItem()をOnCreate以外の関数から
呼び出してうまく行くかどうかを調べることで確認できます。
dairygoods様
アドバイスありがとうございます。
GetDlgItem()の呼び出しの直後にGetLastError()とFormatMessage()でエラーをチェックし
たところ、「操作は正常に終了しました。」とメッセージが表示されましたので問題ないようで
すが、戻り値(0x00000000)がやはりおかしいようです。
そこで、ダイアログにボタンを貼り付けて、ボタンが押されたら全ての処理をするように変更
したら問題なくOpenGLの画像が表示されました。
推測ですが、関数は問題なく終了しているが、::OnCreate()でGetDlgItem(IDC_PICTURE1)
のような使い方が間違っているようです。
(元にしたサンプルは、DetDlgItem()をOnDraw()内で使用していました。)
::OnCreate()内でピクチャーのハンドルを取得できるような方法をお知りでしたら、アドバ
イス頂けないでしょうか。
とりあえずピクチャーに表示されたので問題解決できました。アドバイスありがとうございま
した。
詳しくは分かりませんが、ダイアログウィンドウが作られて
OnCreate()が呼び出された段階では、まだ、各コントロールは
作成されていないのではないでしょうか。
ダイアログの初期化であれば、普通OnInitDialog()で行うと思います。
dairygoods様
アドバイスありがとうございます。
MFCの雛型の説明が不足してたので説明します。
MFCのAppWizardにてプログラムの雛型を作成しました。
step1: SDIを選択
step2: そのまま
step3: ActiveXコントロールのチェックをはずす。
step4: 全てのチェックをはずす。
step5: そのまま
step6: 基本クラスの項目を「CFormView」に変更。
step6で基本クラスの項目CFormViewにして、ダイアログベースのプログラムのようにしていま
す。上記の方法で作成した物はOnInitDialog()が存在してないようです。
step1でダイアログベースを選択するとOnInitDialog()があるようです。
上記の雛型で、OnInitDialog()と同じようなイベントを探しました。OnInitialUpdate()が
同じイベントのようだったのでOnInitialUpdata()でGetDlgItem()を実行させると期待した戻
り値が返ってきました。MFCのSDIでは、OnInitialUpdate()でダイアログの初期化をするべき
なんですか??
間違っていたら指摘していただけると助かります。
そうですね、Viewの場合はOnInitialUpdate()で初期化をするのが良いと思います。