あまつぶ

1.16 10:30 【Get1IconSuite】

 MDEFの話は……、結局調べそうにないので、なかったことにしよう(笑)。で、プログラムとはあんまり関係ないあたりでMDEFの話を少し。
 8.5が出た時、メニューが白くなってしまうアプリケーションがいくつかあったが、これについての話。アプリケーションの中でも、メニューによって白くなったり普通だったりして不思議に思った人もいるかもしれない。また、パッチを当てることによってどうしてなおるのかというのも気になるかも知れない。
 白くなっていたアプリケーションでは、その白くなっている部分のメニューでMDEFを使っている。そのほとんどは「Mercutio MDEF」(http://www.digitalalchemy.com/mercutio/)という、かなり多機能なMDEF。メニューのショートカットでシフトやオプションの表示ができるのが便利で、たいていのアプリケーションではこの為に使っているようだ(アイコンや絵を貼りつけたりメニューの項目に下線を引いたりなんていう機能もある)。が、このMDEF、8.5以前からあったものなので、テーマには対応していない。それでメニューが白くなってしまっていたわけ。メニューによって白かったりするのは、その白いメニューでだけMDEFを使っていると。パッチのプログラムはそのMDEFの部分を置き換えていた、というわけ。おそらくテーマに対応しているバージョン1.5以降に置き換えるという感じになっているのだと思う(ちなみに最新バージョンは1.5.2)。

 昨日書いた、カレントリソースのアイコンだけを得るルーチン、Get1IconSuiteを作ったので公開。あんまりきれいなソースじゃないし、「まんまやん」って言われそうなんだけど……。

OSErr Get1IconSuite(IconSuiteRef *theIconSuite,short theResID,
					IconSelectorValue selector)
{
	OSErr	err;
	ResType	resList[]={kLarge1BitMask,kLarge4BitData,kLarge8BitData,
				kLarge32BitData,kLarge8BitMask,0,0,0,
				kSmall1BitMask,kSmall4BitData,kSmall8BitData,
				kSmall32BitData,kSmall8BitMask,0,0,0,
				kMini1BitMask,kMini4BitData,kMini8BitData,0,0,0,0,0,
				kHuge1BitMask,kHuge4BitData,kHuge8BitData, 
				kHuge32BitData,kHuge8BitMask,0,0,0};
	
	short	i;
	Handle	h;
	
	err=NewIconSuite(theIconSuite);
	if (err != noErr) return err;
	
	for (i=0; i<32 && err==noErr; i++)
	{
		if ((selector & (1L << i)) != 0)
		{
			h=Get1Resource(resList[i],theResID);
			if (h != nil)
			{
				err=AddIconToSuite(h,*theIconSuite,resList[i]);
			}
		}
	}
	
	return err;
}


以上。selectorのビットが立っているところを順に調べていって対応するリソースを読み込んでIconSuiteに付け加えていくと。このソースのGet1Resourceの部分をGetResourceにすればGetIconSuiteと同じ動きをするルーチンになるはず。
 MakeIconCacheとかを使って考えた方がすっきりいくかなとも思ったのだけど、結局はIconSuiteで扱う方が楽そうなのでこれを使うことにした。中はややこしいけどGetIconSuiteと同じ感覚で使うことができるのは便利だ。IconPartyではGetIconSuiteを使っていた部分をすべてこのルーチンに置き換えるだけでカレントリソース内のアイコンだけを取得することができるようになったし。エラー処理などまだ改善の余地は残されているのでもしこのソースを使いたい場合は適当にいじって使うようにしてほしい(笑)。

 次はたぶん0.70b2をリリースできていればそのあたりの話。あるいはIconPartyのアイコンを変えようかなと思っているのでそんな話かも知れない。

to January 15, 1999 ↑ to January index → to January 18, 1999