今回は前回予告した通り、それぞれの処理をやります。 つまり、「それぞれの処理1.マウスの処理」です。 結構濃い内容になるので頑張ってください。 ***処理の流れ*** まず、どこでクリックされたかという情報をとりだします。返ってくる値としては、システムウィンドウ(めったに使いませんが、サポートしておく必要があります。システム側に処理を任せる関数を呼びだすだけです。)、ウインドウの中、ドラッグ領域(ウインドウのタイトル部)、クローズボックス、グローボックス(ウインドウの右下部の四角い部分)、ズームボックスなどです。そして、それぞれのするべき処理(後述)、言い換えれば、ユーザーが望む処理をします。 今回のソースコードは、この前のソースコードからmouseDownの部分だけを取り出し、それに、マウス関連の関数を新たに作ったものとなります。なお、プロトタイプ宣言等は省略します。あしからず。 void EventLoop( void ) { EventRecord* event; char theChar; event = (EventRecord*)NewPtr( sizeof( EventRecord ) ); while( !gDone ) { WaitNextEvent( everyEvent, event, 20L, NULL ); switch( event->what ) { case mouseDown : HandleMouseDown( event ); break; } } } void HandleMouseDown( EventRecord* event ) { WindowPtr window; short thePart; GrafPtr oldPort; long windSize; thePart = FindWindow( event->where, &window ); //ウインドウの中でクリックされたか、そうなら、 //どのウインドウのどこでクリックされたかなどの //情報をthePartに入れる。 switch( thePart ) { case inSysWindow : SystemClick( event, window ); //システムに処理を任せる。 break; case inContent : SelectWindow( window ); //複数のウインドウがある場合、ウインドウを選択 //し、アクティブな状態にします。 //また、その他のクリック処理などもします。 //(ここはプログラム次第なので記述しません。) break; case inDrag : DragWindow( window, event->where, &qd.screenBits.bounds ); //ウインドウを動かす関数ですが、最後の引数は、 //動かすことを可能にする領域。この状態では、画面 //上はすべて動かせるようになっています。 break; case inGoAway : if( TrackGoAway( window, event->where ) ) { DisposeWindow( window ); } //TrackGoAwayでクローズボックスのうえで、マウ //スが放されていたか(違う場所にマウスを動か //したらクローズボックスの色が元に戻りますよね) //を調べ、そうだったら、そのウインドウを破棄し //ます。破棄した後のwindowを参照するとバスエ //ラーもしくはそれに準ずる障害が発生しますので、 //参照しないでください。 break; //case inGrow : //うーん。サイズの変更なんてめったにやらないからいい //や。もし、どうしてもサイズの変更がしたいのなら、参 //考書を買うか、K仲川氏のページとかマック素人プログ //ラマの会とかを参考にしてください。内容は結構面倒く //さいです。 //break; //case inZoomIn : //case inZoomOut : //ウインドウの右上の方にあるいつも9:00の時計みた //いなボタン見たいなものの処理ですが、inGrowと //同じ理由で省略。 //break; } } 実は、マウス処理からもメニューにアクセスできなきゃいけないんだけど、今回は略。メニューの回を作ります。 |