2008-03-03

アイコンのサイズ

「Windows Mobileプログラミング徹底理解」一通り読み終わりました。
これまで全く知らなかったような事も載っていて大変参考になります。
 
とりあえず知らなかった事の1つ目が、本の冒頭で触れられている「DPIとアイコンサイズ」の箇所(31ページ)の「画面の物理サイズが変わっても文字やアイコンが同じ大きさで表示される」という部分。
WifiSwitcherをエミューレタで動かすと妙に大きい画面になるなぁと思っていたのですが、ZERO3とエミュレータでは小さいアイコンのサイズが違っていたのですね。
 
 
アイコンのサイズを32×32と決め打ちしていたのがよくなかったようです。
g_hImageList = ImageList_Create(32, 32, ILC_COLOR24 |ILC_MASK, 5, 0);
ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_0)));
ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_1)));
ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_2)));
ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_3)));
ImageList_ReplaceIcon(g_hImageList, -1, LoadIcon(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_4)));
 
まず、アイコンのサイズをGetSystemMetrics()で取得しました。
小さいアイコンのサイズは SM_CXSMICON, SM_CYSMICONで取得できるようです。
iCx = GetSystemMetrics(SM_CXSMICON);
iCy = GetSystemMetrics(SM_CYSMICON);
g_hImageList = ImageList_Create(iCx, iCy, ILC_COLOR24 |ILC_MASK, 5, 0);
 
次にアイコンの読み込みですが LoadIcon()だと通常サイズのアイコンしか読み込めないみたいなので、LoadImage()に先ほど取得したアイコンのサイズを指定して読み込みました。
そのままだと ImageList_ReplaceIcon()に渡せないので無理やりHICONにキャストしています(本当にこんなのでいいのか不安ですが...)。
ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_0), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR));
ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_1), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR));
ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_2), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR));
ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_3), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR));
ImageList_ReplaceIcon(g_hImageList, -1, (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_SIGNAL_4), IMAGE_ICON, iCx, iCy, LR_DEFAULTCOLOR));
 
これでエミュレータでもまともに表示されるようになりました。
 
 
エミュレータで動かすために余計なリソースを持つのは無駄かな...とも思うのですが、少しずつでもまともなプログラムにしていった方がいいですよね。
 

2 件のコメント:

匿名 さんのコメント...

まぁ無駄っぽく見えますけど…
でもやっておくと、たとえば Windows Mobile がバージョンアップでいろんなところの挙動を変えちゃったり、新機種が出たりしたときなんかに、それなりに対応できたりするのが期待できるんじゃないですかねー。

kazuaki さんのコメント...

こんばんは。
コメントありがとうございます。

そうですね。
この頃は各解像度用のアイコンを持たせておくべきだと考えていたのですが、じゃぁQVGA SquareやStandard向けのアイコンまで持つのか? と考え出すとキリが無くなって来ました。
結局、最近は ターゲットにしてるデバイス用のアイコンだけ入れておけばいいや...と手を抜いています(笑

ただ、ターゲットの解像度がどのサイズのアイコンを要求しているのか は重要ですね。
少なくともZERO3で大きいアイコンが表示されるときに 64x64を用意せずにドット絵状のアイコンが表示されるという事だけは避けたいですね。