プログラム講座 中級編21
- PICTファイルをPICTリソースにする -
中級編21です。今回は「PICTファイルをPICTリソースにする」というプログラムです。今までリソースについては、ほとんど触れることはありませんでした。というのも、あまり必要性がないサンプルプログラムが多かったためですf(^^b
◆データフォークとリソースフォーク
リソースについての説明は初級講座で解説したいと思います。
Macのファイルシステムは「データフォーク」「リソースフォーク」と2つに分かれています。分かれていると言っても個別のファイルになるのではなく1つのファイルに対して複数のリソースが付随しているという仕組みになります。
有名な割に使いにくい某太郎(笑)は、テキストファイルと属性を示すファイルを2つ作成します。これがMacだとテキストファイルは1つだけになり、そのファイルの別の部分に属性を示す「リソース」が作成される事になります。
標準で付属してくるSimpleTextなどは、フォントサイズや文字属性を設定できますが、このファイルを他のテキストエディタでも開くことができ、その場合設定された属性などは反映されません(スタイルをサポートしているエディタでは機能しますが)。これがテキストファイルの中にフォントサイズ等を入れてしまった場合、テキストファイル中に、属性値が出てきたり変な文字が表示されてしまいます(注意)。裏を返すと最低限データを読み書きできるようになっているという事です。
能書きはこれくらいにして、PICTリソースを作成する事にしましょう。
- 注意
- RTF、HTML等のように一応の規定がある場合は良いのですが、通常ソフトによって属性値はバラバラです。
◆リソース作成の手順
まずリソース作成の手順ですが、新規追加を行う場合は以下のようになります。
- CREATERESFILEを呼び出してリソースを扱えるようにする
- OPENRESFILEを呼び出してリソースファイルをオープンする
- ADDRESOURCEを呼び出してリソースを追加する
- CLOSERESFILEを呼び出してリソースファイルを閉じる
リソースの更新は別の方法を使用します。
PICTリソースの作成方法ですが、まず最初にPICTファイルを読み込みます。すでに存在するPICTデータがある場合は、そのまま流用します。
PICTファイルの読み込みについては何回もやっているので他の講座を参照して下さい。PICTハンドルが得られれば、ADDRESOURCEでリソースに追加するだけです。この場合PICTリソースであるという指定は、
_"PICT"
となります。アンダーバーで始まりダブルクオーテーション内の4文字はファイルタイプやリソースタイプの指定をするときに使われます。ちなみに直接32ビットの数値で指定する事もできます(でも、わかりにくくなるので_"PICT"や_"TEXT"のように指定して下さい)。
このままPICTファイルから読み込んだPICTデータをリソースに追加しても真っ白けで何も出てきません。この場合PICTファイルの先頭512バイトを削除する必要があります。先頭512バイトを削除しリソースに追加すれば正しくPICTリソース画像が表示されます。
リソースを追加したら最後にリソースをクローズします。
PICTハンドルを破棄するのを忘れないようにしましょう。
◆終わりに
リソースに関しては、今まで全然というほど手を付けていませんでしたので、独自リソースの追加等の処理も行いたいと思います。
◆今回のプログラムリスト
'-------------------------------------------------------------
' "PICTファイルをオープンしてPICTリソースとして書き込む"
'-------------------------------------------------------------
LOCAL FN openPICTFile
resNo% = 128: ' "PICTリソース番号"
pictName$ = "myPICT": ' "PICTリソースの名前"
fileName$ = FILES$(_fOpen,"PICT",,vRefNum%): ' "ファイル選択ダイアログを表示"
OPEN "I",#1, fileName$,,vRefNum%: ' "ファイルを開く"
fileSize& = LOF(1,1): ' "ファイルサイズを求める"
pictHandle& = FN NEWHANDLE(fileSize&)
LONG IF pictHandle&
err% = FN HLOCK(pictHandle&): ' "ハンドルをロック"
LONG IF err% = 0
READ FILE #1, [pictHandle&], fileSize&: ' "ファイルサイズ分読み込み"
BLOCKMOVE [pictHandle&]+512,[pictHandle&],fileSize& - 512:' "先頭512バイト削除"
err = FN HUNLOCK(pictHandle&): ' "ハンドルロック解除"
err = FN SETHANDLESIZE(pictHandle&, fileSize&-512):' "ハンドルサイズを設定"
CALL CREATERESFILE(fileName$): ' "リソースファイルの作成"
refNum% = FN OPENRESFILE(fileName$): '"リソースファイルを開く"
CALL ADDRESOURCE(pictHandle&,_"PICT",resNo%,pictName$)
CALL CLOSERESFILE(refNum%): ' "リソースファイルを閉じる"
END IF
err% = FN DISPOSHANDLE(pictHandle&): ' "PICTハンドルを破棄"
END IF
END FN
FN openPICTFile