• ベストアンサー

子ウィンドウのデフォルトウィンドウプロシージャについて

ある本に例えばトップレベルウィンドウがいずれもキーボード入力のメッセージを処理せず、デフォルトウィンドウプロシージャに渡していたするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと渡されると載っていたのですが、どういった場合がそうなるのでしょうか?できればプログラムでわかりやすくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

その本は読んだことがありませんが、分かりにくい説明ですね。 どうも、推測通りウィンドウクラスの説明がしたいように思えます。 であれば、ここでいう「親ウィンドウ」は、その「ベースクラスのウィンドウプロシージャ」を指していると思われます。 ただ、「親ウィンドウ」という表現にはWindowsにおいて別の意味がありますから(※)、 その本の表現は混同を招く不適切なものだと思います。 ※例えばCreateWindowsExに渡すhWndParentがまさしく「親ウィンドウ」だと思いますが、ここでの意味とは違います。 Windowsにおけるウィンドウは「ウィンドウクラス登録」と「ウィンドウ生成」の二段階になっています。 ベース⇔サブというのはクラス登録に関する話です。一方、親子というのは実際のウィンドウの話です。 当該記述は前者の説明が後者の用語でなされています。専門書ではなさそうなので、まぁそんなものかもしれません。 > 実はデフォルト・ウィンドウ・プロシージャには、 > そのウィンドウで必要としなっかたメッセージはすべてその「親ウィンドウ」にそのままメッセージを伝播させる、 > という仕組み備わっています。 そうですね。Windowsでは、ウィンドウを作成する際にまずそのクラスを登録します。(参照:RegisterClassEx) この際に、そのウィンドウの動作を決定付けるウィンドウプロシージャを指定します。 サブクラス化というのは、この動作の一部を書き換えるためのテクニックですが、 自分が処理しなかったメッセージはベースクラスのウィンドウプロシージャに渡すのが原則です。 Base classとParent windowを区別せずに「親ウィンドウに伝播」といっているのでしょう… > 「例えばトップレベルウィンドウがいずれもキーボード入力のメッセージを処理せず、デフォルトウィンドウプロシージャに渡していたするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと伝播されます」 上記の方がまだウィンドウクラスの説明として理解できます。(親ウィンドウ⇒ベースクラス > 「例えば、トップレベルの下に3つのウィンドウが配置されて、その3つのウィンドウがいずれもキーボード入力の処理せずデフォルト・ウィンドウ・プロシージャに渡していたとするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと伝播されます。」です これはまた別の話のように見えます。 例えば「トップレベルウィンドウの子ウィンドウ」で、デフォルトウィンドウプロシージャにメッセージをフォワードしたとして、 それで全て「トップレベルウィンドウ」に伝播したりはしません。 その3つのウィンドウに、もし「デフォルトの動作として親ウィンドウに通知する子ウィンドウ」を用いれば、 子ウィンドウがデフォルトプロシージャを呼び出すことで親ウィンドウに通知されるでしょうが、 それはその子ウィンドウのクラスがそのように振舞っているだけであって、 「ベースクラスのプロシージャへの伝播」と「親ウィンドウへの伝播」は意味的に別物です。

その他の回答 (2)

  • oldman50
  • ベストアンサー率29% (8/27)
回答No.2

 横から失礼します。  その書籍よりも、以下のサイトの記述の方が分かりやすいのではないかと思います。 http://www.kab-studio.biz/Programing/PragmaTwice/Main/183.html http://www.kab-studio.biz/Programing/PragmaTwice/Main/184.html

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> 「例えばトップレベルウィンドウがいずれもキーボード入力のメッセージを処理せず、デフォルトウィンドウプロシージャに渡していたするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと渡される ・トップレベルウィンドウは処理しないのにトップレベルウィンドウに渡される? ・トップレベルなのに更にその親ウィンドウに? 上記で言わんとすることがそもそも分からないのですが、 ・本当に一字一句こう書かれているのですか? ・なんという本の何処ですか? 「(本か質問者さんか?)どこかに誤解がありそう」としか見えません。 憶測としては、「親ウィンドウ」と書かれているのは、 親ウィンドウではなくて親ウィンドウクラスなんじゃないかなぁと。 (本の説明がどうなのか分かりませんが)色々推測してみると、 「質問者さんがサブクラスと混同している」と見るのが私には一番腑に落ちます。 トップレベル云々とは別の概念ですが、「ウィンドウのサブクラス化」というものをご存知ですか。 もしかしてその本の説明はこれに対するものではありませんか。

79562
質問者

お礼

はい。一文一句こう書かれています。 本はなぜwindowは動くのかの183ページです。「デフォルトウィンドウ・プロシージャはあるウィンドウプロシージャにおいて「興味がある」メッセージだけを処理し、それ以外のメッセージに関してはすべてそのウィンドウのデフォルトに任せる、といった場合使われます。実はデフォルト・ウィンドウ・プロシージャには、そのウィンドウで必要としなっかたメッセージはすべてその「親ウィンドウ」にそのままメッセージを伝播させる、という仕組み備わっています。 つまり、ツリー状に構築されたウィンドウで、枝の先端の方で発生したメッセージは、途中のウィンドウでそのメッセージが捨てられない限り、すべてその親へと伝播されるのです。例えばトップレベルウィンドウがいずれもキーボード入力のメッセージを処理せず、デフォルトウィンドウプロシージャに渡していたするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと伝播されます」 と書かれています。

79562
質問者

補足

「例えばトップレベルウィンドウがいずれもキーボード入力のメッセージを処理せず、デフォルトウィンドウプロシージャに渡していたするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと伝播されます」 は間違いで、「例えば、トップレベルの下に3つのウィンドウが配置されて、その3つのウィンドウがいずれもキーボード入力の処理せずデフォルト・ウィンドウ・プロシージャに渡していたとするとそのメッセージは親ウィンドウすなわちトップレベルウィンドウへと伝播されます。」です

関連するQ&A