掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
スクロールバーのグレー化 (ID:71520)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> カスタムコントロールとして配置した際にコールされない これについてだけど、MFCの問題、というか仕様だと思われる。 サブクラス化って、要するに SetWindowLongPtr(HWND, GWLP_WNDPROC) して既存のウィンドウプロシージャを独 自ウィンドウプロシージャに置き換えてメッセージ処理する事。 で、SetWindowLongPtr(HWND) しようとするならば、HWND が作成済みである必要がある。 つまり、サブクラス化は作成済みWindowに対してのみ可能。故に、WM_CREATE 等のWindow作成完了前に発生する メッセージはCWnd派生クラスでは拾えないという事になる。 けど、実際はMFCが頑張って(Window作成時のイベントをHookして WM_CREATE 等が発行される直前にサブクラス 化している)のでCWnd派生に届いている。 ただ、ダイアログの場合 CreateDialog() 等のAPIでダイアログと共に子コントロールも一気に作成してれう。 そうなると、子コントロールが作成された際の通知をHookして拾っても、この時点では誰(どのCWnd派生クラス )とサブクラス化して良いか判らない(実際にコントロールとCWnd派生クラスが結び付けられるのは CDialog:: OnInitDialog() でDDXが実行された時)ので作成通知は無視されてしまう。 > カスタムコントロールとして配置した際にコールされない 結果、WM_CREATE 等が発行された時点ではコントロールとCWnd派生が結びついていないので↑になっちゃう。 ちなみに、CWnd派生::Create() と自分でした場合は、誰と結びつければ良いか判明しているのでWindow作成イ ベントをHook時にサブクラス化してくれる。 昔調べた時にはこんな動作してたと思う。けど、最新のMFCでもコレが当て嵌まるのかは未確認
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.