Macintosh Programming (3) - 最初のMacプログラム - 2000.July 5. 最初のMacなGUIプログラム さぁ。やっとここだ。以下はIM:Overviewの最初に載っているPascal ProgramのC版 です。こいつをそのままMPWで入力して動くことは確認済み。 あ。こいつはSIOWではなくてApplicationを選んでね。 #注意:以下のソースには目一杯、日本語なコメントを付けてますが、実際のMPWは 日本語を表示できません。MPWで日本語を表示させることも可能かもしれませんが、 私は追求してません。 私個人は、公私に渡りソースに日本語なコメントを書くことはほとんどないです。 (このページみたいに純然たる説明のためで無ければ、ということ) 何故かと言うと、日本語が使えるような環境って私には超特殊。という過去が あったし、日本語なぞを使おうものならトラブルよ、こんにちわ。という現実が 厳然とあったんで、それがトラウマになっているようです(^^;; ---
/* Simple but modal dialog */ #include <Windows.h> // 何となく不安だけど、コンパイルはこれだけで通りますです QDGlobals qd; // Quick DrawのGlobalの宣言。必須のようです int main() // int main(void)の方がより良いかも { WindowPtr gWin; Str255 gStr = "\pHello, MAC world!"; // Pascal定数文字列の定義 Rect gRc; InitGraf(&qd.thePort); // 以下、各種マネージャ群の初期化 InitFonts(); InitWindows(); InitCursor(); SetRect(&gRc, 100, 100, 400, 200); // Rectへの代入。ウィンドウサイズを指定している // ウィンドウの作成。引数の意味は気にしないのが吉 gWin = NewWindow(nil, &gRc, "\p ", true, dBoxProc, (WindowPtr) -1, false, 0); SetPort(gWin); // 描画APIがどのウィンドウを対象にするかを指定する /*do{*/ // Window中央に文字表示開始位置を設定 MoveTo((gWin->portRect.right - gWin->portRect.left) / 2 - StringWidth(gStr) / 2, (gWin->portRect.bottom - gWin->portRect.top) / 2); TextFont(systemFont); // フォントを指定…… DrawString(gStr); /*}*/ while (!Button()); // マウスのボタンが押されるまでループ return 0; // ANSI Cではvoid main()というのは規格違反なので、とりあえず0を返す } #ちなみにMPWの色使いってマジでこんな感じ。目に余り優しくない……(*_*;
実行すると、「Hello, MAC world!」と表示されるウィンドウが表示され、マウスボタンを 押すと終了する。ということになるはずです。 #ここで実は良く分からないのがWindowPtr。そもそもHogePtrってのはポインタ。HogeRefは HogePtrへのポインタ(つまりポインタのポインタとなる)。というのがMacでのお約束のはず。 つまり明白に異なる型。 しかし、見る資料によって同じAPIの引数がWindowPtrだったりWindowRefだったりするのは 何故?ごっちゃに使っても平気で何故か動くし? 普通、**fooと*fooを間違えると即刻クラッシュすると思うのだが……(コンパイルができる というのも謎。幾らCでも、その程度の型チェックはしてると思うのだが[?])。 元々、..Ptrってのはポインタ。ガベッジコレクションでは動かせない、Mac OSから見たら 迷惑千万なメモリブロック。一方、..Refというのはポインタのポインタ。Ptrより4バイト程 余計に管理領域が必要だけど、ガベッジコレクションで再配置可能な分、Mac OSから見て ありがたいメモリブロック。の、はずなんだが……。 #というぐらいレベルの低いあたしがお送りしております、Macプログラマ日記です(爆) PS. OS 8/9なApple社のサイトにあるAPIのアルファベット順一覧を見る限り、WindowPtrが正しい模様 (EOF)