既存のプログラムにあるボタンをオーナードローに変更しようとしています。
概要としては、以下のとおりです。
・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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
-
4
リストビューで選択行の背景を変える
C言語・C++・C#
-
5
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
6
リストボックスのオーナードローでInsertStringした文字列の取得
C言語・C++・C#
-
7
ClistBoxでオーナードローがよくわかりません。
C言語・C++・C#
-
8
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
9
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
10
VC;;6.0のMFCで線を簡単に引けますか?
C言語・C++・C#
-
11
文字の行間
C言語・C++・C#
-
12
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
13
OnPaintとOnDraw関数の違いについて
C言語・C++・C#
-
14
VC++のコンボボックスの各項目の背景色と文字色を変える方法
C言語・C++・C#
-
15
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
16
リストビューの選択状態を取得するメッセージはありますか?
C言語・C++・C#
-
17
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
18
タブコントロール上のリストコントロール(再描画されない)
C言語・C++・C#
-
19
VisualStudio MFC変数が追加できない
C言語・C++・C#
-
20
MFCでOnPaintのタイミング
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
Delphi6でVB.NETで作成のDLL呼出
-
Visual C++ 6.0 でクラス表示が...
-
DebugクラスとTraceクラスの違い
-
循環参照の問題に関して。
-
関数重複の問題
-
C# 別プロジェクトのフォームを...
-
C#で通常のbuttonコントロール...
-
MFC モードレスDlgについて
-
C++で継承元のクラスの代入演算...
-
Serialize で困ってます!!
-
DataGridViewのセルに斜線を引...
-
ダイアログクラスのコントロー...
-
c#でファクトリークラスの使い方
-
ダイアログ表示時にチェックボ...
-
VC++6.0で作成したクラスをVB6....
-
CViewクラスの切り替え
-
MFCのドラッグ&ドロップについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
ダイアログクラスのコントロー...
-
C++ protectedにアクセス不可
-
DebugクラスとTraceクラスの違い
-
DataGridViewのセルに斜線を引...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
継承を重ねた場合のコストはど...
-
エディットコントロールでEnter...
-
ボタンのオーナードローについて
-
C#で通常のbuttonコントロール...
-
MFCのCListCtrlでスクロールを検出
-
【C++】相互参照
-
関数の呼び出し元の検索
おすすめ情報