既存のプログラムにあるボタンをオーナードローに変更しようとしています。
概要としては、以下のとおりです。
・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()にて、ボタンスタイルの確認(→追加スタイルが付加されてました)
このような場合、他にどこを調べて良いか教えて頂きたいのです。
拙い文章ですが、何卒、よろしくお願い致します。
No.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)のCWnd派生クラスの中のCreate()メソッドからコールされているのが、CretaeControlメソッドであることに気づきました。
OleControlを作成していることが問題のようで、通常のCWnd、CButton等のクラスをCreateすると、問題なくWM_DRAWITEMメッセージが飛んできました。
# 他人が作ったソースで読みきれておらず、ご迷惑をおかけしました。
よって、原因としては、「OleControlではオーナードローできない」ことだろうと推測しております。
実施したいことについては、別手段を検討いたします。
redfox63様>
丁寧なご対応に誠に感謝しております。この度は、色々とありがとうございました。
No.2
- 回答日時:
(2)って CButtonの派生クラスなのでしょうか?
それとも 単なるCWndの派生クラスですか …
(1)のダイアログリソースのボタンを配置してボタンのプロパティのスタイルタブの『オーナー描画』にチェックを入れて検証してみてください
CDialogBarの派生クラスまたは親のCFrameWnd(CMainFrm)のOnDrawItemがコールされるはずですよ
これらで処理されない場合 CButtonの派生クラスなら CButton::DrawItemが呼び出されて アサートが発生するはずです
この回答への補足
何度も申し訳ありません。
こちらのクラスですが、CWndの派生クラスになります。
ダイアログリソースで作成せずに、ソースのメソッド内でCreateした後で、ModifyStyle()にて、BS_OWNERDRAWを付加しております。
ご回答をヒントにCWndの派生からCButtonの派生クラスとしてみましたが、やはり結果は同じでした。
SPY++にて、プロセスレベルでWM_DRAWITEMが来ていないかの確認を行いましたが、やはり飛んできていません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- その他(スマホアプリ・スマホゲーム) ゼンリー 友達追加について 1 2022/09/11 23:14
- その他(ブログ) Brogger独自ドメインから独自ドメインへ変更する 1 2022/09/22 13:21
- Excel(エクセル) Excel グラフの軸に「表示単位の変更」の要領でテキストを追加したい 1 2022/06/08 16:27
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2023/04/21 13:46
- JavaScript 追加ボタンを押した際に ok ボタンを押した場合のみ入力値が追記されるようにしたいです 6 2022/05/29 09:57
- Gmail gmailに弾かれて困っています。SPFレコードについて、これは詰んでいるでしょうか 3 2023/06/10 13:08
- LINE ラインの削除方法、完全に新しくしたい。 2 2023/08/07 12:25
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 1 2022/06/18 21:20
このQ&Aを見た人はこんなQ&Aも見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
リストビューで選択行の背景を変える
C言語・C++・C#
-
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
-
4
リストボックスのオーナードローでInsertStringした文字列の取得
C言語・C++・C#
-
5
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
6
VC;;6.0のMFCで線を簡単に引けますか?
C言語・C++・C#
-
7
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
8
ClistBoxでオーナードローがよくわかりません。
C言語・C++・C#
-
9
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
10
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
11
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
12
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
既定のコンストラクタがない?
-
クラスのアドレスを引数として...
-
ボタンのオーナードローについて
-
フォーム間でのオブジェクト又...
-
継承したクラスを、継承元のク...
-
OnInitDialog()の関数の組み込み方
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
MFC モードレスDlgについて
-
このコンパイルエラーの意味に...
-
CreateObjectとはどういう意味...
-
c# ネットワークプログラム
-
C#でのUNZIP32.DLLの利用方法が...
-
オブジェクト型の変数が定義さ...
-
VB.NETで、DLLを頂いたんですが...
-
UMLでの「オブジェクト」と「イ...
-
C#でのコンパイル時のエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
クラスのアドレスを引数として...
-
ダイアログ表示時にチェックボ...
-
(UWSC) 「#32770」の意味わかり...
-
エディットコントロールのイベ...
-
エディットコントロールでEnter...
-
WindowsAPIのリストビューの...
-
CMainFrameクラスの使い方
-
DebugクラスとTraceクラスの違い
-
MessageBoxを継承したい
-
C++ protectedにアクセス不可
-
このコンパイルエラーの意味に...
-
MFCのドラッグ&ドロップについて
-
MFCアプリのコマンドラインでパ...
-
【ASP.NET】 独自で作成したク...
-
C#で通常のbuttonコントロール...
-
ダイアログクラスのコントロー...
-
派生クラスから基本クラスprote...
おすすめ情報