[[BORLAND C++]]
INDEX
Section.16 AnotherWindow
アプリを造っているとき、計算結果をグラフに表示したいとか、他のWindowにログを表示したいとか思ったことは無いだろうか?ここで、1枚のWindowを開いている時、別のウインドウを開く方法を簡単に説明する。

  • 開くのは簡単だ
    要は、ボタンやエディットコントロールと同じ様に、CreateWindowしてしまえば出来るのである。但し、クラス名は、RegisterClassした時の、親Windowのものと同じものを指定しなければならないので、Windowプロシージャは、親Windowのものを共有する事になる。

  • 幾つかの方法があるのだ
    まず、親Windowを決める。これは、CreateWindowにて指定する親Windowのハンドルを何にするか?という事であるが、親をどれにするかで、色々と特徴が有ると思うので、場合によって使い分ければ良い。後は、WS_OVERLAPPED,WS_VISIBLE,WS_CHILD等の属性を決めてやれば良いのである。幾つかの例を紹介しよう。
    • 親Windowが、メインウインドウと同じNULL又はHWND_DESKTOPの場合,
      系列としては、同列にあるので、兄弟ウインドウと呼ばれる。これに、WS_CHILDの属性を付けると、上手く動作しないので注意!
    • 親Windowがメインウインドウであるとき
      ボタンやエディットコントロールと同列の子ウインドウとして造られるが、WS_CHILDの属性を付けなければ、親Windowとオーバラップして表示する事が出来る(サンプル参照)。これに、WS_OVERLAPPEDWINDOW,WS_CHILDの属性が付加されると、親Windowのフレーム内にしか表示されないWindowとなる。
      また、子ウインドウの子(孫ウインドウ)も可能である。
      注意!この手のウインドウは、WM_PAINTのイベントが同じなので、OutTextで出力した文字は、全てのウインドウに出力される。
  • どうしても、Windowプロシージャを分けたい場合
    今まで書いてきた方法だと、どうしてもWindowプロシージャが共通になってしまうし、メニューやアイコンも共通になってしまう。もし、メインとは違うメニューを持ちたいとか、アイコンを変えたい場合,Windowプロシージャを別々に持って、制御を分けたいという場合は、最初にRegisterClass()した時と同じ様に、違うクラス名と、違うWindowプロシージャ(アイコン等を変えても良い…)で、2個目のウインドウクラスを登録すれば良いのである。2個目のクラスで登録したクラス名で、Windowを作成すれば、全く違うWindowが作成出来るのである。

  • 特定のウインドウを閉じたい
    子ウインドウを開くまでは簡単だが、いざ、特定のウインドウだけを閉じようとすると、アプリ全体が終了してしまったり…という事は無いだろうか?恥ずかしながら、自分は、この問題に一昼夜ハマっていたのだ。閉じるコマンドは、PostMessage()で、目的のウインドウに、WM_CLOSEを送信すれば良いのだ(多分,DestroyWindow()でも可?)が、閉じる側のウインドウプロシージャのWM_DESTROY:ハンドラ部分に、PostQuitMessage()が記述されていると、そのウインドウを閉じた時点で、アプリ全部が消えてしまうのである。どうやら、PostQuotMessage()は、アプリ全体の終了命令の様だ。WM_CLOSEのイベントが発生すると、当然、WM_DESTROYも発生するから、PostQuitMessageが発行されてしまっていた訳だ。一応、この記述を消したら、目的のウインドウを消す事が出来た。では、ウインドウプロシージャを持たない、子Windowに対しては、どの様にすれば良いのだろうか? 実験はしていないが、多分,それぞれのWindowのプロシージャを、フッキング(キーイベントの項の追記で書いた様にするか、SetWindowHookExというファンクションを使えば良いらしい)して、WM_DESTROYのメッセージを、自家製のプログラム内で、消化させてしまえば良いのである。

  • WNDCLASSとWNDCLASSEXの違い
    いや、前から書こう書こうと思いつつ、こんな場違いな場所に書くとは…。ここの違いは即ち、RegisterClassRegisterClassExの違いなのである。CreateWindowCreateWindowExの違いには、直接リンクしていない様である(実は、CreateWindowCreateWindowExは、許容される属性が幾つか追加されているだけの様である)。この2つの構造体の構成メンバの違いは、WNDCLASSに、WNDCLASSEXのサイズ及びスモールアイコンの2項目が追加されただけである。実質,大きいアイコンと、小さいアイコンを変える事が出来るだけの違いか…と思うのは、早合点なのである。WNDCLASSEXのサイズが、構造体の先頭に追加されている所を見ると、マイクロソフトの考えている事が分かるだろう? そう、今後の拡張が有るという事である。つまり、今後、WIN32APIが拡張されて、更にたくさんのパラメータが、この構造体に積み込まれた場合、API側は、この数値を見て、判断出来るという仕組みである。


サンプル017のソース
2002/05/08
HomeSweetHome2
Ozzy's Software