既存のプログラムにあるボタンをオーナードローに変更しようとしています。
概要としては、以下のとおりです。
・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#
-
リストビューで選択行の背景を変える
C言語・C++・C#
-
-
4
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
5
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
6
リストボックスのオーナードローでInsertStringした文字列の取得
C言語・C++・C#
-
7
ClistBoxでオーナードローがよくわかりません。
C言語・C++・C#
-
8
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
9
VisualStudio MFC変数が追加できない
C言語・C++・C#
-
10
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
11
文字の行間
C言語・C++・C#
-
12
VC;;6.0のMFCで線を簡単に引けますか?
C言語・C++・C#
-
13
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
14
VC++のコンボボックスの各項目の背景色と文字色を変える方法
C言語・C++・C#
-
15
CStringをwchar_tに変換したい
C言語・C++・C#
-
16
リストビューの選択状態を取得するメッセージはありますか?
C言語・C++・C#
-
17
タブコントロール上のリストコントロール(再描画されない)
C言語・C++・C#
-
18
プロパティシートのタブの名前を変えるには
C言語・C++・C#
-
19
MFCタブコントロールのグラデーション描画
C言語・C++・C#
-
20
VC(Ver6.0)でダイアログサイズの設定
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
ダイアログ表示時にチェックボ...
-
MFCのCListCtrlでスクロールを検出
-
MFCのドラッグ&ドロップについて
-
【C++】相互参照
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
OnInitDialog()の関数の組み込み方
-
privateなメンバ関数をテストす...
-
継承を重ねた場合のコストはど...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
CFrameWnd とCFormView2
-
クラスのアドレスを引数として...
-
Delphi2007のCheckBox.Font.Col...
-
Delphi6でVB.NETで作成のDLL呼出
-
VB6で作成したDLLをVC6で使用す...
-
C++ protectedにアクセス不可
-
関数の呼び出し元の検索
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
ダイアログ表示時にチェックボ...
-
イベントにAddHandlerされてい...
-
ダイアログクラスのコントロー...
-
C++ protectedにアクセス不可
-
DebugクラスとTraceクラスの違い
-
DataGridViewのセルに斜線を引...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
エディットコントロールでEnter...
-
継承を重ねた場合のコストはど...
-
C#で通常のbuttonコントロール...
-
ボタンのオーナードローについて
-
MFCのCListCtrlでスクロールを検出
-
【C++】相互参照
-
SetTimerの行でアサートエラー...
おすすめ情報