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)