これでDirect3Dの初期化に入ろうとした皆さん。まだ早いです。その前にやるべき事があるのです。そしてそれが今回のタイトルメッセージループなのです。
「プログラムはメッセージをやりとりしています」こう言って分かる人間はWinAPIについて知識があるのかと思います。
メッセージの1例としてはクリックがあります。マウスの入力はまずOS(この場合はWindows)が受け取ります。そして、どれかのプログラムの上でマウスの入力が起きた場合にはOSがプログラムに対して「マウスがクリックされたよ」というメッセージを送るのです。これはキーボードやタイマーでも同じです。プログラムがタイマーを利用していれば時間が来るとOSはプログラムに対して「時間が来たよ」というメッセージを送ります。
このとき、プログラム側ではメッセージを受け取って処理をする必要があります。当たり前の事です。それをしないと、ポストが壊れてしまいます。そのため、プログラムは常にメッセージをチェックします。これはたいていの場合whileで行われます。
while(){ //メッセージが来ているときは処理する。 }
そして、これこそがメッセージループなのです。つまりメッセージループとは「メッセージをチェックするためのループ」なのです。
3Dの処理は大抵重い物です。しかも、環境によって処理能力がバラバラなため、タイマーによる割り込みを行う事が出来ません。もし環境が1秒間に30フレームしか描画できないのにタイマーで100回描画しようとすれば、プログラムがフリーズしたような状態になってしまうかもしれません。それを防ぐために利用する仕組みがメッセージループなのです。
メッセージループではメッセージがあるときだけメッセージを処理します。当たり前ですね。無いときは何も処理しません。何もないときはプログラムはフリーです。つまり暇です。と言う事はここで重い処理を行ってもこのプログラムとっては害がないという事です。
while(){ if(メッセージがあるかチェック){ //メッセージが来ているとき //メッセージを処理する。 }else{ //メッセージがないとき //3Dを描画する } }
このようにプログラムが暇なときだけ描画するこの仕組みを実現するためにメッセージループを使うのです。
using System.Windows.Forms; using System.Drawing; namespace Project1 { /// <summary> /// md3d1 の概要の説明です。 /// </summary> public class md3d1:Form { //クライアント領域のサイズ const int clientHeight =600; const int clientWight =800; public md3d1():base() { //最小サイズを設定 this.MinimumSize = new Size(60,60); //下は任意です。 //固定サイズのフォーム //this.FormBorderStyle = FormBorderStyle.FixedSingle; //サイダかボタン無し //this.MaximizeBox = false; //クライアント領域サイズ this.ClientSize =new Size(clientWight,clientHeight); //ウィンドウの名前(かっこいいのを付けてあげてください) this.Text ="Direct3D-My"; } } /// <summary> /// エントリクラス /// </summary> class Program { public static void Main() { using(MD3D1 dxform =new MD3D1()) { //ウィンドウを表示 dxform.Show(); //メッセージループ //フォームがある間だけまわるようにする while(dxform.Created) { //たまっているメッセージを処理する Application.DoEvents(); //描画する dxform.Render(); } } } } }
whileの所でフォームが存在するかをチェックしています。こうする事によってフォームの閉じるボタンを押せばメッセージループから抜け出せるようになります。実行すると普通のウィンドウが出ると思います。それを確認したら今回はOKです。
次からはいよいよ「3D」に入ります。と言っても初期化ですけど。