Macintosh Programming (8) - モーダルなアプリケーション -	2000.Sep.

1. モーダルなアプリケーション
ということで、これ。5行追加してモーダルでムーバブルなダイアログに
なってます。
普通のモーダルダイアログにするには、ResEditでタイトルバーのないものを
選択し、タイトルバーに文字列を追加してる所とか、タイトルバーのマウス
イベントを処理してるコードを削ればOKね。

	全ソースはここ。smdlg3.lzh.bin (4,608 byte)。ソースのみ。
	実行ファイルは各自でコンパイルしてね。
	#なお、展開したソースはsmdlg2.cとかになってますが、気のせいです(^^;;

読:「おい。これって前に#define TARGET_CPU_PPCとか探してた割に全部コメント
 になってるじゃねぇか?」
私:「(視線をそらして)え?いやそれは日本得意の時間差攻撃って奴でして……。」
読:「…何の話をしておる?」
私:「(時間やら空間やら……。ではなくて……)もちろん、女子バレーです。東京
   オリンピックでの……」
 効果音:「バキッ!ドカッ!!グシッッ!!!」
読:(はぁはぁ)「他に何か言い遺すことがあるか?もれなく聞き漏らしてやるが!」
私:「…ひ、ひどいわ、ひどいわ〜。ちゃんと1ヶ所、#define、生きてるのにぃぃ」
読:「野郎が泣いても可愛くない!減点100!!」
 効果音:<検閲により削除>

…えーとぉ(某戦艦の第三艦橋よろしく、瞬時に回復する私)。
このアプリケーションはもちろん、「作ってはいけないアプリ」です。何せ
モーダルなダイアログを出すのです。

つまり「起動したが最後、他のアプリに切り替えることができない」んですから。
…いやでしょ?そんなの(しつこい?)。

しかし、こいつはメニューを持ちます。で、Aboutは持ってるけど、出せません(笑)
だって、モーダルだもん。わかってぇ(はーと)← この気持ち悪いギャグ(書いてる
私自身の背中に思わず悪寒が走った)の元ネタが分かったあなたは、魔女っ子アニメ
のファンですね?(Y/y)

2. ポイント
モードレスなダイアログを出すアプリはこの後に予定してます。が、それと比べて
みてね。Copy/Cut/Pasteとかの処理をこいつは何もしてません。が、ちゃんと動く
でしょう?そしてそれ以外のメニューは自動的に動作禁止になります。
メニューのClearが選択できないのはそういうOSの仕様だからですね。

モードレスな場合、いちいち処理が必要なのと比べて下さい。つまりそれだけ
モーダルなダイアログの処理は楽ができるのです。

ちなみに、このソースのサイズと次のモードレスダイアログなソースのサイズを
比べて下さい。約2倍になってます。まぁモードレスなソースにはいささか余分な
コントロールも載ってますけどね。モードレスの方が簡単。というのはこういう
ことです。

自作関数の説明:
void pushButton(DialogPtr dlg, short item);
 [OK]や[Cancel]をマウスでなくEnterやESCで*押した*時、ボタンを一瞬反転
 させる処理。前にAlertでも使った奴

void curChange(WindowPtr dlg, EventRecord *event);
 テキストエディットの上にマウスカーソルが移動した場合、カーソルを
 矢印から「I」に変更したり戻したりする

pascal Boolean mproc(DialogPtr dlg, EventRecord *event, short *item);
 ダイアログのコールバック関数。だから頭にpascalを付けて呼び出し規約を
 変更している

void drawDefButton(DialogPtr dlg);
 デフォルトボタンに黒く縁を付けるという、これも既出の奴

void getEditString(DialogPtr dlg, short item, Str255 s);
 テキストエディットから文字列を取り出す。というただそれだけの奴

void setDlgInitial(DialogPtr dlg);
 起動時、テキストエディットにデフォルト文字列を入れ、その文字を選択・
 反転させるという処理を行う

int main(void);
 プログラムエントリ。各種マネージャ群の初期化、メニュー作成、ダイアログ
 表示を行う。

ちなみにこいつ、試しにPPC専用、68K専用(っていってもPPCマシンで動作できる
けど)、FATバイナリの3種類作ってみました(*1)。

 PPC専用: 8KB
 68K専用: 9KB
 FAT  :12KB

ですね。ソースは同じでMPWで3つのメークファイルを作ってそれぞれアプリを
作成するのです。

ちょっと意外だったのは、PPCより68Kの方がでかくなったこと。PPCってRISKな
CPUだったのでは?
だとしたらCISKな68Kよりでかくなって当然。とか思ってたのですが。う〜む。
オプチマイザの問題?それとも何か誤解、してたのかな?

(*1)この数字はここでは提供してないSmplDlg2の場合。途中でムーバブル・
 モーダルダイアログが作れると分かったので、提供はSmplDlg3のみとしてます。
 んで、SmplDlg3では5行の追加の他にタイトルバーに文字を入れてみたり、
 アイコンを表示しようとしてたりしますので、サイズが多少違うかも。

 …アイコンは、カラーの奴ではなく白黒の奴しか表示されない(;_;)という
 結果に終わったので本文中では触れてませんけど

(EOF)