Macintosh Programming (4) - リソースことはじめ - 2000.July 6. アラートのリソース 今度はリソースを作成します。アイコンとかダイアログの類を一括して管理する 仕組みですね(ウルトラ大ざっぱな説明)。 ウィンドウの類を作成する場合、さっきやったようにCのソースでちまちま作る という方法もあるのですが、GUIな代物をそういう方法で作成するのは余に馬鹿 馬鹿しい。ということでApple純正のリソースエディタ、ResEditを使う訳です。 #余談ですが、ResEditで既存のプログラムのリソースを書き換えることもできる みたい。色々なプログラムのリソースをのぞいて見るというのも勉強になりますです。 (うっかりリソースを妙な風に書き換えちゃうと悲惨なことになりそうだけど) ちなみに今回はアラートを作ります。WindowsではMessageBox()に相当するものです。 1. ResEditを起動し、File->New ここでご注意。ファイルの拡張子として.rsrcを指定すること。ResEditとしては 拡張子が何であろうが関係ないようですが、MPWでメークファイルを作る時に困る 気がするので 2. Resource->Create New Resource ぎょーさん選択肢が表示されます。が、アラート、ALRTを指定しますです。 するとにょにょっと窓が開き、何やらMac画面の上に空のダイアログが表示された。 という画面になるはず。こいつがこれから作るアラートの雛形ですね 3. その雛形をダブルクリックすると、DITLのエディタが起動します そう。Macでは表示される窓の定義と、その窓の中味の定義は独立してるんです。 4. ここでメニューからDITL->Align To Gridしておく方が幸せになれると思います ついでにDITL->Show Item Numbersも指定しとけばもっと良いかも 5. 先ず、Buttonを2つ置きます この時、アイテムはドラッグさせること。*横滑りさせる*という表現が分かりやすい? 最初がOKで次がCancel。置いたアイテムをダブルクリックするとボタンの文字列とかを 書き換えることができます。 #いやその。別にButtonを後から配置しても一向に構いませんが、OKのアイテム 番号を1、Cancelを2としたいだけ。アイテム番号の付け替えは簡単に行えるんですが、 どんなに簡単な作業であろうとも、何もしなくてOK。にはかないませんから(^^; 6. 次。Static Textを配置 どこに?何てことは各自の感性にお任せしますのでご自由に。文字列も適当で結構。 まぁ、「^0は^1でした」とでもしてください。ここで「^0」は半角。 この^0とかは何か。というと、後述しますんでここでは略。予想が付く人はもう 感づいてるでしょうがね。 7. ここまででリソースファイルにはALRTとDITLの2つができているはず はい。ここまででOK。Command + Sして保存です。 作るプログラムはこんな感じ。 /* alerts */ // 以下、めったやたらとincludeされてるけど(少なくともMPW付属のSampleを見る // 限り)、Macではこれが当たり前みたい #include <limits.h> #include <Resources.h> #include <Windows.h> //#include <Menus.h> #include <Dialogs.h> //#include <Devices.h> // で、いらなさそうなもんは消してみました //#include <ToolUtils.h> // コンパイルエラーも出ないから良しとする(^^; //#include <Memory.h> // もっと削れるかもしれないけど、未確認 //#include <Processes.h> //#include <SegLoad.h> //#include <Packages.h> //#include <Traps.h> QDGlobals qd; // Quick Draw groval int main(void) { int iRet; Str15 s; // Pascal string, 15 char long InitGraf(&qd.thePort); InitFonts(); InitWindows(); InitCursor(); ParamText("\pfoo", "\p", "\p", "\p"); // つまり^0〜^3まで使えるということ Alert(128, nil); ParamText("\pfoo", "\pStop", "\p", "\p"); iRet = StopAlert(128, nil); /* iRet: kAlertStdAlertOK = 1 kAlertStdAlertCancel= 2 kAlertStdAlertOther = 3 kAlertStdAlertHelpButton = 4 */ sprintf((char*)s, ".#=%d", iRet); // 長さの入る部分を「.」で確保 s[0] = (unsigned char) strlen((char*) s+1); ParamText(s, "\pNote", "\p", "\p"); iRet = NoteAlert(128, nil); ParamText("\pfoo", "\pCaution", "\p", "\p"); iRet = CautionAlert(128, nil); ExitToShell(); return 0; } /* eof */ --- そう。ParamText()はリソース内の文字列、「^0」とかを置き換えてくれるんですね。 え?どのアラートのリソースかを指定する引数がないではないか!って?ええまぁ。私もそこが 疑問でしたが、これでちゃんと動くのだから仕方ないですぅ。 動かしてみて、勝手にくっつくアイコンにメッセージが隠された人はResEditで位置を調整 してね。 ということでして(^^;とにかくこいつを実際に動かしてみてから考えて下さい。 そうそう。MPWでメークファイルを作成する時は忘れないでリソース、*.rsrcもソース ファイル として追加することです。 え?*.rsrcが出てこないって?All Filesにチェック入れました? #ちなみに、KT7.5.5だとESCで[Cancel]ボタンを押せないようです。MacOS 9だとenterやreturnで [OK]、ESCで[Cancel]が押せるのですが。。。 %いわゆる「printfデバッグ」用にDITLで「^0 ^1 ^2 ^3」とだけ書いたALRTリソースを用意して おくと便利かも %*本当の*printfデバッグも可能。puts("hoge");なんてのをプログラム中に入れておくとstdout とかいう(だったと思う……やってみりゃ分かる)テキストファイルに結果が書き出される。これも 便利なんだけど、プログラムがクラッシュするとその内容が信頼できないからね (EOF)