取るに足らない雑多な話
◆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);