ウィンドウの何たるか

今回はウィンドウについてのお話です。

ウィンドウとは何か?

さて、ウィンドウとはいったい何なのでしょうか?

まあ、誰でも知っていると思いますが、英語でいうところのウィンドウとは「窓」ですよね。コンピュータ上でウィンドウと言えば、アプリケーションによってディスプレイ上に表示されている長方形の領域のこと。まさにアプリケーションの「窓」というわけです。

しかし実際にはこれだけをウィンドウと呼ぶわけではありません。Windowsにおいては、ツールバーやステータスバー、押しボタン、ラジオボタン、チェックボックス、エディットボックス、リストボックス、ツールチップまでもが、実は1つのウィンドウということになっているのです。最初はとっつきにくいと思いますが、そういうものなんだと割り切ってください。

Windowsによるウィンドウの管理

アプリケーションによってウィンドウが作成されると、Windowsはウィンドウハンドルと呼ばれる、ウィンドウを識別するための値を作成されたウィンドウに割り当て、以下のようなすべてのウィンドウを管理するためのテーブル(表)にそのウィンドウの情報を追加します。ハンドルはウィンドウごとに異なった値となっています。ウィンドウに関する情報が必要になったとき、Windowsはウィンドウハンドルを元にそのテーブルを参照することで目的となるウィンドウに関する情報を引き出します。

このような表が作られると考えてください。 (実際は違うかもしれませんが…)

ウィンドウ
ハンドル
座標 サイズ ウィンドウのスタイル
X Y X Y
1001 100 100 520 480 オーバーラップ、境界・タイトルバー・スクロールバーあり、…
1002 303 256 300 400 オーバーラップ、サイズ固定、…
1003 200 400 300 50 子ウィンドウ、縁あり、…
……

アプリケーションがウィンドウに何らかの処理をしたい場合、対象となるウィンドウのハンドルを指定してAPI関数を呼び出せば、目的の処理が実現されるのです。

もちろん、HSPで作成されるウィンドウもそれぞれウィンドウハンドルを持ちます。また、HSPの命令で作られたエディットボックスやコンボボックスなどもそれぞれのウィンドウハンドルを持っています。しかしこれらのハンドルはHSPが内部で処理をしているために普通は私たちの目に触れることはありません。したがって、HSPでのプログラミングはこういったウィンドウハンドルを意識することなく行うことができます。

ウィンドウメッセージとは?

前にも説明した通り、Windowsの主な特徴はGUIとマルチタスクです。これらは、ウィンドウメッセージイベントメッセージ、または単にメッセージと呼ばれることも多い)によって実現されています。メッセージというのは、Windowsからアプリケーションのウィンドウに送られる言わば「お知らせ」のようなものです。

ユーザーがマウスやキーボードによって入力したとき、あるいは、ボタンやメニューを押したとき、これらはまずWindowsによって取得されます。その後、Windowsはこれをそれぞれメッセージとしてアプリケーションに知らせるのです。アプリケーションは、このメッセージによってユーザーがどのような入力を行ったのかを知ることができるのです。

複数のアプリケーションが起動しているとき、Windowsはそれぞれのアプリケーションに順番にメッセージを送っていきます。これらは、非常に短い間隔で実行されているために、私たちから見ると、複数のアプリケーションにおけるメッセージ処理が、あたかも同時に行なわれているかのように見えるのです。

メッセージ駆動方式

Windowsのアプリケーションは一般にメッセージ駆動方式と呼ばれています。この方式では、アプリケーションの処理の流れはメッセージによって決定されます。どういうことかというと、Windowsからメッセージを受け取る手段として、アプリケーションは専用の関数(プログラムコード)を持っていて、Windowsはメッセージを送るときにこの関数を呼び出す、という手段をとります。この関数は、ウィンドウプロシージャ (window procedure) と呼ばれています。ウィンドウプロシージャには送られてくるメッセージに応じた処理をするコードが記述されていて、Windowsからメッセージが送られるたびにこのコードが実行されるようになっているのです。

さて、HSPではどうでしょう?HSPを使っていて、こういったメッセージを処理するスクリプトなどを書いたことはないでしょう。HSPでは、こう言ったメッセージ処理は内部ですべて処理しているために、私たちはこれを意識することなくスクリプトを書くことができるのです。

HSP ver3.0からは、このメッセージを処理するカスタムイベントがサポートされる予定です。現在の最新版(ver2.6)では、キーやマウスがクリックされたときに割り込み実行を行う命令が実装されています。これもまた、そういった機能の1つと考えることができます。