[[COOL LIB BORLAND C++]]
[RETURN]
COOL LIB 01 WINDOWS BASIC PARTS
まず、クラスは部品で無くてはならない。自分の考え方で言えば、部品というのは、最小の形で存在すべきなのだ。機能を細かく区切れば区切るほど、それは、再利用の利く形に収まるのである。そのために、機能を細かく区切って考える事にした。しかしながら、細かく区切りすぎると、実際のアクションのタイミングが掴めなくなってくるのも事実なのだ。即ち、実際のアクションを頭に入れた区切り方で設計しなくてはならないのである。その様な葛藤の中,以下が、自分の出した一つの回答である。
尚、これらのクラスは、COOLBSC.H,COOLBSC.CPPに登録されているが、ユーザが直接使うことはあまり無いと考えて、詳しい説明については割愛する。

  • アプリケーションインスタンスクラス(CoolWndApp)
    『アプリのインスタンスをどう扱うべきか?』
    最初に悩ましいのがここなのである。WinMainに対して、最初に届けられるアプリのインスタンスは、その後、様々な場所,WNDCLASSに登録する時,Windowを開くとき,ダイヤログを開くとき等々で使うのであるが、ユーザが持ち回るのは、非常に面倒臭いのだ。更に、子Windowを開く時は、これに加えて、親Windowのハンドルが必要になってくる。インスタンスは、アプリに唯一の存在であるから、最初に登録してしまえば何とでもなるのだが、親Windowのハンドルは、幾つかWindowを開くユーザも居るだろうし、子Windowの子を造る様な場合も有るので、ちょっと簡単には扱えないのである。今回採用した方法は、自分としては、かなりの力技なので、正解とは言えない方法なのだが、アプリに唯一存在するものを集めて登録しておく仕組みをクラスで実現する事にしてみた。このクラスは、アプリ内に複数有ってはならないので、ユーザから隠蔽し、ライブラリの中で完結する形とし、なおかつ無くてはならないものであるから、静的な宣言が1つだけ、ライブラリの中に存在する事になる。こうなると、問題は、親Windowのハンドルである。これについては、色々考えたのだが、的確な答えが出なかったので、このクラス内にHWNDを配列で用意し、登録順にウインドウ番号を発行し、ウインドウ番号で呼び出して貰えば、必要な情報が取得出来る形とした。ついでであるが、ちょっと使わないコマンドラインの文字列も登録/参照出来る様にした。

  • WNDCLASSのクラス化(CoolWndClass)
    WinMainで、最初に面倒だな…と感じる部分,これは、WNDCLASSの設定と、登録に他ならないだろう?これをクラス化するには…最低限必要な情報で初期化し、その他に必要な情報が有れば、ユーザが追加設定を行って登録すれば良いのである。

  • CreateWindowのクラス化(CoolBaseWnd)
    フレームウインドウであれ、ボタンであれ、エディットだろうが、データをいくら掻き集めても、最終的に、このCreateWindowに辿り着かなければ、ただのゴミなのだ。従って、これから定義されるボタンやエディット等のコントロールに継承されて使われるCreateWindowのクラスを定義しておく。即ち、再利用可能な形にまとめなければならないのである。このクラスの目的は、必要なデータの収集と、必要最低限の共通操作の実装である。勿論,生成された場合はウインドウハンドルはクラス内に保存するので、いつでも取り出せる訳だし、親ウインドウとして振る舞うのであれば、ハンドルを登録し、ウインドウ番号を取得して保持しているので、いつでも取り出して使う事が出来る訳である。
    尚、実際にCreateWindow(Ex)を行っているのは、CreateWnd()関数の中なのであるが、この関数は、protectedとなっている。即ち、このクラス内若しくは、このクラスを継承した何れかのクラスからしか呼べない事になるのだが、なぜ、この様な仕組みにしたかと言うと、これから作成する各クラス内にも、ウインドウハンドルを管理させる為である。CoolBaseWndにも保持するものを、各実行単位のクラス内にも保持するという事は、2度手間的な操作になるのだが、各実行単位のクラス内で使おうとする時,いちいちGetHandleして取り出すのが面倒だったので、わざとこの様な仕様を採用した。
2002/05/24
HomeSweetHome2
Ozzy's Software