- ベストアンサー
ボタンのオーナードローについて
- 既存のプログラムにあるボタンをオーナードローに変更しようとしています。
- MainFrame-CDialogBar((1))-CWnd((2))のような重なりになっています。開発環境は、VC++6.0です。
- 変更後のOnDrawItem()にイベントが飛んでこない場合、どこを調べれば良いか教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
解決方法としては2種類考えられます (1)のCDialogBarの派生クラスを作成し、こちらでWM_DRAWITEMもメッセージマップとOnDrawItemをオーバーライドする方法 (2)のCWnd派生クラスに DrawItemメソッドと仮想関数のOnChaildNotifyを実装する 仮想関数の中身はMFCのソースのCButton::OnChaildNotifyを参考にすればいいでしょう OnChaildNotifyの中でWM_DRAWITEM以外は CWnd::OnChaildNotifyを呼び出してリターン WM_DRAWITEMの場合はlParamを LPDRAWITEMSTRUCTにキャストして呼び出せばいいようですよ 今回の構成ではCMainFrmaeまでオーナー描画が通知されません 通知されるのは (2)の親の CDialogBarまでのようです CMainFrameの子ウィンドウとしてオーナー描画のコントロールを追加した場合にはCMainFrame::OnDrawItemが呼ばれるようです
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
(2)って CButtonの派生クラスなのでしょうか? それとも 単なるCWndの派生クラスですか … (1)のダイアログリソースのボタンを配置してボタンのプロパティのスタイルタブの『オーナー描画』にチェックを入れて検証してみてください CDialogBarの派生クラスまたは親のCFrameWnd(CMainFrm)のOnDrawItemがコールされるはずですよ これらで処理されない場合 CButtonの派生クラスなら CButton::DrawItemが呼び出されて アサートが発生するはずです
補足
何度も申し訳ありません。 こちらのクラスですが、CWndの派生クラスになります。 ダイアログリソースで作成せずに、ソースのメソッド内でCreateした後で、ModifyStyle()にて、BS_OWNERDRAWを付加しております。 ご回答をヒントにCWndの派生からCButtonの派生クラスとしてみましたが、やはり結果は同じでした。 SPY++にて、プロセスレベルでWM_DRAWITEMが来ていないかの確認を行いましたが、やはり飛んできていません。
- redfox63
- ベストアンサー率71% (1325/1856)
オナードローは 読んで字のごとくそのコントロールを所有するウィンドウが描画処理を担うといったことになります WM_DRAWITEMメッセージの処理ハンドラ(OnDrawItewm)およびメッセージマップはON_WM_DRAWITEMは (1)のCDialogBarの派生クラスに実装する必要がありますよ
お礼
ご回答ありがとうございます。 早速、試してみました。 ですが、OnDrawItem()がコールされません。 親子関係も正しく設定されているため、飛んでくるかと期待したのですが・・・
お礼
ご回答ありがとうございました。 その後、色々調べていくと、(2)のCWnd派生クラスの中のCreate()メソッドからコールされているのが、CretaeControlメソッドであることに気づきました。 OleControlを作成していることが問題のようで、通常のCWnd、CButton等のクラスをCreateすると、問題なくWM_DRAWITEMメッセージが飛んできました。 # 他人が作ったソースで読みきれておらず、ご迷惑をおかけしました。 よって、原因としては、「OleControlではオーナードローできない」ことだろうと推測しております。 実施したいことについては、別手段を検討いたします。 redfox63様> 丁寧なご対応に誠に感謝しております。この度は、色々とありがとうございました。