[[BORLAND C++]]
INDEX
Section.19 WindowProc internal ClassInstance
ウインドウプロシージャをクラスの中に閉じこめるというと、簡単に、考えられがちなのだが、これが一筋縄ではいかないのである。

  • 簡単にアドレスを渡してくれない
    自分も、最初は簡単に考えていたのだ。クラスのメンバ関数にして、WNDCLASSに登録してしまえばできるだろう…って、やってみたら、エラーしか出ないのだ。this使ったり、一時的に変数に代入してみたりと、腐る程試したが全く駄目だった。コールバック関数という特殊な関数である為に、仮想関数として扱われ、クラスが実体化していないとアドレスを取り出せない様なのである。

  • 一つの方法は…
    色々調べてみて、最初に見つけた方法は、ウインドウプロシージャをstaticとして、最終的に、その中で振り分けるという方法だった。多分,この後で説明する方法と、結果的には一緒なのだろうが、自分的に、このstaticが、あまり好きでは無いのである。C言語でも、扱いづらい存在だったのは変わらないのだが、C++言語になって、仕様が若干変わったのと、ローカル変数の様な顔をしていて、実は広域変数の様な動作をする点が、許せないのである。(好き嫌い言ってはいけないのだが…)という訳で、しばらくの間、この課題はおざなりになっていたのだ。

  • という訳で、もう一個
    そうこうする間に、どうしても、これを実現しなければならない場面に出くわして、もう一度,本腰を入れて調べ直してみた。そこで見つけた、もう一つの方法は、実際に実行されるウインドウプロシージャ本体を含むクラスの他に、共通で使われるウインドウプロシージャを外部定義してしまい、この関数の中で、ウインドウの持つパラメータを取り出し、そこから目的のクラスインスタンスを割り出して、そのクラスインスタンスのウインドウプロシージャを呼び出すという方法なのである。説明するのは面倒だが、自分的に、この方法、自分の方針にカチッと来てしまったのだ。探せば方法は有るものだね。

  • サンプル
    う〜ん、詳しく説明するのは難しいから、簡単なサンプルを見てもらおう。
    ★マークでコメントした場所がポイントである。
    サンプル23のダウンロード
2002/05/25
HomeSweetHome2
Ozzy's Software