2006 年 11 月 18 日 23 時 54 分

アイコンの作成


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真]


次に行う作業は、表示させるアイコンの作成である。
今回は、以下の 3 種類のアイコンを表示させる予定である。

・ハードリンク
・マウントポイント(ボリューム・ジャンクション)
・フォルダリンク(シェルのフォルダショートカット)

残念ながら、デザインをする腕は持ち合わせてないので、
シェルが元々持っているショートカットアイコンに、
色をつけて適当に捏造することにする。

アイコンは、独立したファイルとして使うこともできるが、
DLL のリソースとして含めることもできる。
IShellIconOverlayIdentifier はどちらでも構わないが、
よりスマートな、DLL のリソースの方を選ぶことにしよう。

プロジェクトで「リソースの追加」を選ぶと、
自動的に LinkIconOverlays.rc というファイルが追加され、
編集可能となるので、そこにアイコン 3 つ新規で追加する。

アイコンは、複数のサイズや解像度の画像を持てる。
大した色数は使ってないので、色は 16 色で十分だが、
Windows XP 以降は、48 x 48 のサイズが標準なので、
16 x 16, 32 x 32, 48 x 48 の 3 つのサイズを用意しよう。

つまり、全部で 9 個の絵を描くことになる。
感覚的に、ハードリンクを青、マウントポイントを赤、
そしてフォルダリンクを緑にでもしておこうか。

アイコンができたら、それぞれに ID を振る。
今回は以下のように識別子を与えることにする。

・IDI_HARDLINK
・IDI_MOUNTPOINT
・IDI_FOLDERLINK

ここでつけた識別子はリソース専用の resource.h という
ヘッダファイルに、マクロによって数値で定義されている。
自動生成された resource.h を覗いてみると、
以下のように記載されているはずだ。

#define IDI_HARDLINK 101
#define IDI_MOUNTPOINT 102
#define IDI_FOLDERLINK 103

数値は環境や操作によっても違う可能性はあるが
このファイルはリソース編集時に自動的に同期され、
リソースがコンパイルされるときにも利用される。
他のソースファイルで resource.h を取り込んでおけば、
リソース ID をマクロ定数として使えると言うわけだ。

さて、明日はアイコンの COM クラスの実装を行おう。

ところで、テキストのソースならば日記にも書けるが、
アイコンファイルのようにバイナリを届けるにはどうするか。
とりあえず作成したアイコンを CAB で圧縮して、
それに BASE64 をかけたものを書いておこう。

========== icons.cab.b64 ==========
TVNDRgAAAAB2AgAAAAAAADgAAAAAAAAAAwEBAAMABAAoEQAACA
AAAAAAAAAAAAAAkwAAAAEAAQCuCgAAAAAAAAAAcjXVbCAATW91
bnRQb2ludC5pY28ArgoAAK4KAAAAAHI1Cm0gAEZvbGRlckxpbm
suaWNvAK4KAABcFQAAAAByNRNqIABIYXJkTGluay5pY28A+GEh
ZdsBCiBDS+1YO27DMAxlPujsXqA1NGVzpswZgq65Qscew9fQ5K
v4AAZ8jc7aDBhQxUitQ5VK4tYpkoLPVhg+2hQl0wwRgBksIM8z
QLzPATZOZpnXVzOApwXAeu31tweAl6Xj3ffcjS3g/cuDDebwhS
wMj/JwQll6gYf7Ute1k8jYwwnWeoEHUu7jETE4gmdHWqJrqnfV
GV130f2a6p0+bafzx/EJJobb8EvHNbAKeZwf5XkJV8nzLCzXyy
pIXWUhj4l96qyb2fSwFwzcp7Ubr8f7tLxSPWDWHh4/w3cJXvM8
1otRvE7zFTuv5vlOa5a3Kb7T4/ywcab2UyAQsIUSy9CfS//6ir
ztblUh8sFvgUETXVHdFGd0ZaL7FdWNOm2n88fxCf5/t1ong/1V
nuchv7wsglRFHvKY2KfOunvpVpXi37jCPy6GNwle8bwpRvIqzR
fsvIrnjVIsb1O8UeP8sHGm9lMgEEi3Kt3qmF+nHWI7+N1j0Md6
00R6G9tborcOxJ+7gPqP9D62E/9xfAL5b/WHeb4N+eVlE2TI1n
3fEvvUWXcv3epux79xe/+4vvMNFgiWtyP5qLJ81pO+bXje9rZl
4sTrOd42tBIN6+rH8X3KD7eu1H4KBALpVm+tW/0A
========== end of icons.cab.b64 ==========

このままでは解読できないと困るんで、
base64 を解除するスクリプトも付けておこう。

========== unbase64.js ==========
var path = WScript.Arguments(0);

var s = new ActiveXObject("ADODB.Stream");

s.Charset="UTF-8";
s.Open();
s.LoadFromFile(path);
var b64 = s.ReadText();
s.Close();

var d = new ActiveXObject("Microsoft.XMLDOM");
var e = d.createElement("X");
e.text = b64;
e.dataType = "bin.base64";
var data = e.nodeTypedValue;

s.Type = 1; // binary
s.Open();
s.Write(data);
s.SaveToFile(path.replace(/\.b64$/, ""), 1);
s.Close();
========== end of unbase64.js ==========

icons.cab.b64 を unbase64.js にドロップすると、
icons.cab ができるはずである。

cab は Windows 標準機能で開けるのだが、
base64 の展開が標準では無理なので悩ましいところだ。
これは、uuencode や ISH、binhex にも当てはまる。

EML という手もあるが、Outlook Express を使ってない場合、
いちいちウィザードが起動するのはやってられない。

また、それに似た MHT で送るという手もあるが、
ファイルの添付が無視されるので余計な手間が掛かり、
拡張子が無視されたりちゃんと開けなかったりと難しい。

PDF という有力な手もあるが(PDF はテキストで書ける)
mixi 日記の HTML は Internet Explorer でコピーした場合、
毎行末に空白が含まれるが、Firefox では含まれない。
PDF はバイト数に厳格なので、これでは厄介だ。
(HTML の空白の解釈の違いによる問題ではあるのだが)

困ったもんだ。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.