取るに足らない雑多な話
◆Gestalt Manager
メニューの回で「Aquaかどうか」を調べたGestalt関数の他の使用例。
/* システムバージョン(例:9.1→0x0910) */
long SystemVersion(void) {
long systemVersion;
if (Gestalt(gestaltSystemVersion, &systemVersion) != noErr)
return 0;
return systemVersion;
}
/* CarbonLibバージョン(例:1.6→0x0160) */
long CarbonVersion(void) {
long carbonVersion;
if (Gestalt(gestaltCarbonVersion, &carbonVersion) != noErr)
return 0;
return carbonVersion;
}
/* QuickTimeバージョン(例:6.0.3→0x0603) */
long QuickTimeVersion(void) {
long qtVersion;
if (Gestalt(gestaltQuickTimeVersion, &qtVersion) != noErr)
return 0;
/* 怪しげなシフト */
return qtVersion >> 16;
}
◆Internet Config
ブラウザを使ってURLにジャンプします。説明は省略ー。否、分からん……。(←
/* アプリケーションのクリエータコード */
#define APP_CREATOR FOUR_CHAR_CODE('XXXX')
...
/* URLにジャンプ!(URLはPascal文字列) */
void LaunchURL(ConstStr255Param url) {
ICInstance ic;
if (ICStart(&ic, APP_CREATOR) == noErr) {
long start, end;
start = 0;
end = url[0];
ICLaunchURL(ic, "\p", &url[1], url[0], &start, &end);
ICStop(ic);
}
}
◆Carbon Help Manager
ヘルプメニューをもらうサンプルです。
/* (後ろの引き数はいらなかったらNULL) */
if (HMGetHelpMenu(&helpMenu, &firstCustomItemIndex) == noErr) {
/* ここで項目の追加とか…… */
/* firstCustomItemIndexが追加項目の先頭 */
...
次に、ヘルプタグ(マウスを乗せると出てくる四角いあれ)のサンプルです。
HMHelpContentRec helpTag; ... /* 下2行はこのままで…… */ helpTag.version = kMacHelpVersion; SetRect(&helpTag.absHotRect, 0, 0, 0, 0); /* 位置の指定 */ helpTag.tagSide = kHMDefaultSide; /* 普段のヘルプタグ(contentTypeに種類、共用体に内容) */ helpTag.content[kHMMinimumContentIndex].contentType = kHMStringResContent; helpTag.content[kHMMinimumContentIndex].u.tagStringRes.hmmResID = 128; helpTag.content[kHMMinimumContentIndex].u.tagStringRes.hmmIndex = 1; /* コマンドキーを押している時のヘルプタグ(同上) */ helpTag.content[kHMMaximumContentIndex].contentType = kHMNoContent; /* ヘルプタグをセット! */ HMSetControlHelpContent(control, &helpTag); /* ウインドウ用はHMSetWindowHelpContent */
◆CFString/CFMutableString
CFStringが不変文字列で、CFMutableStringが可変文字列。それぞれの参照の型はCFStringRefとCFMutableStringRefで、CFMutableStringRefの方は「CFStringRefのふり」をさせられます。(逆向きはエラー!)
メモリ管理はカウンタ式になっていて、最初にCFStringCreate〜した時点でカウンタは1。ここでCFRelease(カウンタを-1)すると0になって、解放されます。解放されると困るところでCFRetain(カウンタを+1)し、いらなくなったらCFRelease……が基本です。(CFStringRefはCFMutableStringRefかもしれないので、CFRetainではなくコピーした方がいいケースも多いのですが。)
ちなみに、CFSTRで作ったCFStringは終了まで解放されない(CFRelease/CFRetainは無意味)とのこと。
/* CFString定数 */
cfStr = CFSTR("ASCII String");
/* CFStringを生成 */
cfStr = CFStringCreateWithCharacters(NULL, chars, numChars);
cfStr = CFStringCreateWithPascalString(NULL, pStr, encoding);
cfStr = CFStringCreateWithFormat(NULL, NULL, format, ...);
cfStr = CFStringCreateWithSubstring(NULL, str, range);
/* CFStringをコピー */
cfStr = CFStringCreateCopy(NULL, str);
/* CFMutableStringを生成 */
cfMutStr = CFStringCreateMutable(NULL, maxLen);
cfMutStr = CFStringCreateMutableCopy(NULL, maxLen, str);
/* maxLenを0にすると長さ制限無し! */
/*------------------------------------------------------------------------------
encodingは定数(kCFStringEncoding〜)かGetApplicationTextEncoding()
------------------------------------------------------------------------------*/
CFString/CFMutableString共通の関数。この他に比較や検索をする機能も!
/* 長さ */
len = CFStringGetLength(str);
/* 文字(UniChar) */
c = CFStringGetCharacterAtIndex(str, idx);
chars = CFStringGetCharactersPtr(str);
CFStringGetCharacters(str, range, buf);
/* Pascal文字列に変換 */
pStr = CFStringGetPascalStringPtr(str, encoding);
ret = CFStringGetPascalString(str, buf, bufSize, encoding);
/* 数値に変換 */
n = CFStringGetIntValue(str);
x = CFStringGetDoubleValue(str);
/*------------------------------------------------------------------------------
名前がCFStringGet〜PtrのものはNULLに注意!
(バッファを使う関数との二段構えに……下みたいな感じで)
pStr = CFStringGetPascalStringPtr(str, encoding);
if (pStr == NULL) {
CFStringGetPascalString(str, buf, bufSize, encoding);
pStr = buf;
}
...
------------------------------------------------------------------------------*/
CFMutableString専用の関数。文字列を繋いでいくのに便利かな……。
/* 追加系 */ CFStringAppend(mutStr, appendedStr); CFStringAppendCharacters(mutStr, chars, numChars); CFStringAppendPascalString(mutStr, pStr, encoding); CFStringAppendFormat(mutStr, NULL, format, ...); /* 挿入ー */ CFStringInsert(mutStr, idx, insertedStr); /* 削除ー */ CFStringDelete(mutStr, range); /* 差し換え系 */ CFStringReplace(mutStr, range, replacement); CFStringReplaceAll(mutStr, replacement);