Macintosh Programming (10) - 普通のウィンドウ - 2000.Oct. 1. 説明 さぁきましたよ〜(笑)。極々普通のウィンドウです。 全ソースはここ。fdump.lzh.bin (9,088 byte)。例によってソースのみ。 今回のは今までのような何の役にも立たないよーな奴じゃなくて、ファイルを 16進およびアスキーでダンプする。という代物です。 2. 自作関数の説明 void doLoadFile(WindowPtr win, FSSpec *fs); 指定されたファイルをOpenし、全データをメモリに読み込む。という処理ですな。 超巨大ファイルのことを考えるとこーゆー仕様はよろしくないです。部分的に ファイルを読むべきです。しかぁし。あたしが今してるのはMacなアプリを作って 遊んでいるのであって、ツールを作っておるのではないのであった。 void doOpen(WindowPtr win); ファイルオープンの標準ダイアログを出す処理。動きゃ何だって構わん。とゆー えーかげんさなので追求しないでね。 void scrUpdate(WindowPtr win); ウィンドウサイズが中身よりでかい時、必要なくなったスクロールバーをInactiveに したり、その逆をやったりする。 半端にスクロールしてたらそのスクロールは解除しないとまずい。という処理もする。 void doActivate(WindowPtr dlg, Boolean active); ミソはここでDrawGrawIcon()してること。しないとどーなるかはどうぞお試しあれ。 (OS 8とか9では何も変わらん。とかいう結果になってもあたしゃ責任持ちませんが) void changeWindowSize(WindowPtr win); ウィンドウサイズが変化した時にスクロールバーの位置や設定値を調整するもの。 void doGrow(WindowPtr win, EventRecord* ev); ウィンドウサイズが変わる時に呼ばれる。というか、ウィンドウサイズを変える、 という処理をOSにさせるルーチン。GrowWindow()の最後の引数は、どこまででっかく できるのか?という範囲を指定するもの。 後、わざわざGraw boxをねらい打ちで消しているのは訳がある。どーぞここを コメントにして試して下さいね。結構、解決に悩まされたんだから。これ。 (KT7.5.5だと、Graw boxだけがウィンドウ内に取り残されるのよね……) void doZoom(WindowPtr win, Point loc, short Part); ズームボタンの処理。デフォルトの処理ではおもしろくないので、データが丁度 表示されるか、画面一杯になるまでウィンドウ位置と大きさを調整するって処理に してあります。ただしマルチ画面環境は無視。 void ContentsScrollV(WindowPtr win, ControlHandle hCtl, short Part); 垂直スクロールバーがクリックされた時の処理。そもそもスクロールバーに設定 できる数値ってshortでしかない(short int。MPWでは16bit)。そんなもんを ダンプしたら何万行になるかもしれない(って、今のプログラムの作りではメモリ 制限でそんなでかいもんは扱えないけど)代物の管理に使おうとする訳なので、 ここではどんなファイルがこようとも最大値100。として処理(気持ちとしては%)。 ここのミソは最後に強制的にウィンドウを再描画してること。ここにこれ入れないと スクロールバーの▲とか押したままにした時、ちゃんと再描画してくれないのよね。 本当はここでdrawWin()して全面書き換えなんてやらんで良いはずとか思ってるん ですが、どーしてもうまくできませんでした。誰かヘルプミー、プリーズ。 void ContentsScrollH(WindowPtr win, ControlHandle hCtl, short Part); 水平スクロールバーがクリックされた時の処理。こっちはスクロールバーの最大値が ウィンドウの横幅だよ〜。って処理になってます。 pascal void ScrProc(ControlHandle hCtl, short Part); ▲とかを押しっぱなしにしてるとこのコールバックがシぺぺと呼ばれる。 static void doContents(WindowPtr win, EventRecord *event); ウィンドウの中身がクリックされた場合の処理。もしそれがスクロールバーの部分 だったらそれぞれ場所に応じてビジュアルな動作をさせる。 void getHBarRect(WindowPtr win, Rect *rc); 水平スクロールバーの大きさと位置はどこでしょう?と計算する。 void getVBarRect(WindowPtr win, Rect *rc); 垂直スクロールバーの(以下略) void drawWin(WindowPtr win); ダンプ画面を書く。DOSのツールならこの関数だけでほとんど済むものを……。GUIって 面倒ですな〜。今は面倒なので等幅な非日本語フォントにしてますが、根性あれば 等幅な日本語フォントにしてみてください。ASCIIダンプ部で第一バイトと第二バイトが 泣き別れにならないようにするのが面倒だったのでパスしました。 void doUpdateWindow(WindowPtr win); はい。今度はちゃんとBeginUpdate()とEndUpdate()を呼んでまーす(笑) 呼ばないと無効領域を何度描き直しても無効のままなので、Mac OSちゃんが意地に なってウィンドウをぱたぱた描き直します。お暇ならお試しをば。 static void initScrolls(WindowPtr win); 一番最初にスクロールバーを作成する処理。 後、データ構造としてMWRefConとゆーのを作成してます。fdump.hをご参照。 ここでファイルサイズがunsigned longではなくてsigned longなのは、OSの仕様です。 あたしがボケてるんじゃないですよ(多分)。 その中身: width : ダンプを表示するのに必要な幅。これは実際に書いてみるまで分からない ので、ウィンドウに書くついでに最初の1行でサンプリングして求めてます。 lines : 垂直スクロールで見えなくなっている行数。見えない行を出力するループを 回すのは不毛ですし。。。 Xofst : 水平スクロールで見えなくなっているドット幅 PageLen : 現在のウィンドウの高さで何行表示できるか。表示もされないのに(以下略) #んで、完璧に忘れてたけどこいつ、キーボードからじゃスクロールできません。 わははのは。バグとの戦いが一進一退だったのでそーゆー操作は今の今まで 思い付きもせんかったわい (EOF)