プロが教えるわが家の防犯対策術!

既存のプログラムにあるボタンをオーナードローに変更しようとしています。
概要としては、以下のとおりです。
・MainFrame-CDialogBar((1))-CWnd((2))のような重なりになっています。
・上記(2)のクラスにてオーナードローできるようにしたいのです。
・開発環境は、VC++6.0です。

変更点は以下のとおりです。
・(2)にメッセージマップの追加(ON_WM_DRAWITEM())
・(2)にメッセージハンドラの追加(OnDrawItem())
・(1)メソッド内で、(2)をCreate後、(2)にModifyStyle()にて、BS_OWNERDRAWを付加

ところが、変更後のOnDrawItem()にイベントが飛んできません。
自分で調べたことは、以下のとおりです。
・SPY++でメッセージの確認(→飛んできていません)
・GetWindowLong()にて、ボタンスタイルの確認(→追加スタイルが付加されてました)

このような場合、他にどこを調べて良いか教えて頂きたいのです。
拙い文章ですが、何卒、よろしくお願い致します。

A 回答 (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が呼ばれるようです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

その後、色々調べていくと、(2)のCWnd派生クラスの中のCreate()メソッドからコールされているのが、CretaeControlメソッドであることに気づきました。
OleControlを作成していることが問題のようで、通常のCWnd、CButton等のクラスをCreateすると、問題なくWM_DRAWITEMメッセージが飛んできました。
# 他人が作ったソースで読みきれておらず、ご迷惑をおかけしました。

よって、原因としては、「OleControlではオーナードローできない」ことだろうと推測しております。
実施したいことについては、別手段を検討いたします。

redfox63様>
丁寧なご対応に誠に感謝しております。この度は、色々とありがとうございました。

お礼日時:2008/08/17 10:32

(2)って CButtonの派生クラスなのでしょうか?


それとも 単なるCWndの派生クラスですか …

(1)のダイアログリソースのボタンを配置してボタンのプロパティのスタイルタブの『オーナー描画』にチェックを入れて検証してみてください
CDialogBarの派生クラスまたは親のCFrameWnd(CMainFrm)のOnDrawItemがコールされるはずですよ

これらで処理されない場合 CButtonの派生クラスなら CButton::DrawItemが呼び出されて アサートが発生するはずです

この回答への補足

何度も申し訳ありません。

こちらのクラスですが、CWndの派生クラスになります。
ダイアログリソースで作成せずに、ソースのメソッド内でCreateした後で、ModifyStyle()にて、BS_OWNERDRAWを付加しております。

ご回答をヒントにCWndの派生からCButtonの派生クラスとしてみましたが、やはり結果は同じでした。

SPY++にて、プロセスレベルでWM_DRAWITEMが来ていないかの確認を行いましたが、やはり飛んできていません。

補足日時:2008/08/16 20:11
    • good
    • 0

オナードローは 読んで字のごとくそのコントロールを所有するウィンドウが描画処理を担うといったことになります



WM_DRAWITEMメッセージの処理ハンドラ(OnDrawItewm)およびメッセージマップはON_WM_DRAWITEMは (1)のCDialogBarの派生クラスに実装する必要がありますよ
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

早速、試してみました。
ですが、OnDrawItem()がコールされません。

親子関係も正しく設定されているため、飛んでくるかと期待したのですが・・・

お礼日時:2008/08/16 17:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています