タスクトレイに表示させるアイコンについて

解決


るーちゃん  2007-01-19 21:12:07  No: 134909

いつもお世話になっております。
るーちゃんです。

既出で他の方が質問され、その内容の続きになるような質問です。
一応新規に質問させてください。
>既出タイトル:タスクトレイに入れたアイコンの色を出すには?

私の場合は、MicrosoftVisualStudio6.0に同梱されている、
VC++で作成できるアイコンを使って、VB6.0のフォームに、デザイン時に
Iconプロパティにセットしています。
フォームは非表示、タスクトレイにアイコンを出現させる処理を書き、
アイコン自体は、既出の質問に書かれているような、色が出ないという問題
は特に無く、形が崩れる以外は問題ありません。
形が崩れてしまう点について質問させてください。

VC++で(標準)32x32で作成したアイコンのみ、(形は崩れますが)正常に
アイコンが表示されます。その他の形式では表示されない状況になります。
崩れるのは、おそらく32x32をWindowsが24x24等の大きさに縮小するために
間引きされる結果で、最初からIconプロパティに16x16で登録できれば
綺麗に表示できるのではと考えています。
タスクトレイに表示されるアイコンは、他のソフト等は綺麗に表示できて
いるので何らかのノウハウがあるのでは無いかと思い、この辺りの情報に
詳しい方、申し訳ないですが教えていただけませんでしょうか。。
絵の描き方の問題でしょうか。

ちなみに、32x32の領域一杯に円を書き、アナログ時計のように針と点(
5分間隔で円の内周にぽつぽつと置く)をデザインしています。
タスクトレイ上では針は確認できますが、円と点は途切れて見え、元の
画像とは違う見栄えになります。


  2007-01-19 22:11:48  No: 134910

追加です。

タスクトレイへのアイコンの表示方法は、
Shell_NotifyIcon()APIを使って、
この関数の引数、NOTIFYICONDATA構造体内の、
hIconに、Me.Iconを代入することで実現しています。

フォーム上、左上のアイコンとタスクトレイ上の
アイコンは同じサイズのアイコンになっています。


魔界の仮面弁士  2007-01-19 23:57:51  No: 134911

>>既出タイトル:タスクトレイに入れたアイコンの色を出すには?
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200307/03070055.txt
のことでしょうか。

> hIconに、Me.Iconを代入することで実現しています。
LoadImage API で読み込んだ方が良いかも。

> その他の形式では表示されない状況になります。
実際に検証してみたいのですが、それらのアイコンのサンプルを、
どこかにアップロードすることはできますか?

それが無理なら、その Ico ファイル内の画像サイズと色数を、
具体的に列挙してもらえないでしょうか。
# VS6のアイコンエディタだと、格納順まではわからないので、調べるなら
# 他のソフト(たとえば、"@icon変換"など)を使って列挙してください。


るーちゃん  2007-01-20 03:45:34  No: 134912

>LoadImage API

感触的に、フォームのIconプロパティにセットしたアイコンを
使うと絵が崩れるのでは?と考えていて、アイコンを2つ用意して
(面倒ですがサイズの違う、同じ絵を2つ用意)片方は32x32でフォーム用に
片方はたぶん16x16のタスクトレイ用にと分けたほうがいいかも。
と思えてきました。
LoadImageを使ってうまくいくか見てみます。

>実際に検証してみたいのですが
タスクトレイ上には、たしかにアイコンの領域分のエリアが作られている
ように見えますが、絵が出てない状態になります。
(たぶん、前の質問者の書いてあることと同じじゃないかと?)

>アップロードすることはできますか?
実は、会社から書込み(^^; してましてちょっと不味いので
申し訳ありません、ちょっと無理です。
#最近Pマーク等の効果(?)でアイコンファイルすら持ち出せないのです(涙)

アイコンの画像サイズと色数は@icon変換で見てみると、
以下になっていました。
アイコン名      横    縦    色(bit)
main.ico-000    32    32    4
main.ico-001    32    32    8

あれ、今見て気が付いたのですが、アイコンが2つあります(笑)
あーエクスプローラで見えるアイコンと違ってるんですね。
(いろいろ弄ったので色数が違ってるのが登録されてるようです)


魔界の仮面弁士  2007-01-21 04:41:54  No: 134913

> main.ico-000    32    32    4
> main.ico-001    32    32    8
32x32「しか」含んでいないアイコンを使うのではなく、
32x32「も」含めたアイコンを、解像度指定で読み込んだ場合はどうなりますか?

なお、VB6の LoadPicture にある解像度指定の引数は、
期待動作しないようなので、LoadImage API を使って
ロードされた方が良いでしょう。

> あれ、今見て気が付いたのですが、アイコンが2つあります(笑)
一般的には、ひとつの *.ico は、複数の解像度と色数を持っていますね。
Windows の場合、48x48、32x32、24x24、16x16 の 4 サイズが使われます。
http://www.microsoft.com/japan/msdn/windows/windowsxp/winxpicons.aspx

> あーエクスプローラで見えるアイコンと違ってるんですね。
一般的には、複数の解像度/色数のアイコンが含まれていた場合に、
どれが使われるかは、OSまたはアプリによって自動判定されるようです。
ただしエクスプローラは、本来の *.ico 形式以外の画像(bmp等)もアイコンに
使えるので、Form.Icon プロパティの場合とは、判定基準も異なるのでしょう。

Form.Icon の場合、アイコン内の画像の並び順も重要で、たとえば、
  Set Me.Icon = LoadPicture(iconPath)
で読みこんだ場合、@icon でいうところの、グループ内で「上」にある
アイコンが、優先的に使われるようです。
(ただしこれは、デザイン時に設定した場合の優先順位とは異なるようです)

ちなみに、VS2005付属のアイコンを見てみたところ、
<Note.ico> - 2種類
  32x32, 4bit(16色)/8bit(256色)
<disconnect2.ico> - 2種類
  16x16, 8bit(256色)/32bit(半透明付きフルカラー)
<app.ico> - 8種類
  16x16, 4bit(16色)/8bit(256色)/32bit(半透明付きフルカラー)
  32x32, 4bit(16色)/8bit(256色)/32bit(半透明付きフルカラー)
  48x48, 8bit(256色)/32bit(半透明付きフルカラー)
<search4doc.ico> - 11種類
  16x16, 4bit(16色)/8bit(256色)/32bit(半透明付きフルカラー)
  24x24, 8bit(256色)/32bit(半透明付きフルカラー)
  32x32, 1bit(モノクロ)/4bit(16色)/8bit(256色)/32bit(半透明付きフルカラー)
  48x48, 8bit(256色)/32bit(半透明付きフルカラー)
のように、アイコンの用途によって、含まれるサイズも異なっていました。


るーちゃん  2007-01-23 23:15:33  No: 134914

確認するのが遅くて申し訳ありません。

アイコンのサイズと色数を組み合わせたアイコンファイルを
幾つか作成し、LoadImageに読ませてみたところ、色数は何でも良く(4bitと
8bitで確認)、16x16のサイズのアイコンならタスクトレイに綺麗に
表示できることが分かりました。VBのデザインからアイコンをセットし、
Me.IconをhIconに渡す方法は?だったというわけですね。

Private aaaa As NOTIFYICONDATA

With aaaa
 .cbSize = Len(aaaa)
 .hWnd = Me.hWnd
 .uID = 1
 .uFlgs = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
 .uCallbackMessage = WM_MOUSEMOVE
 '.hIcon = Main.Icon
 .hIcon = LoadImage(0, "main8bit.ico", 1, 16, 16, &H10)
 .szTip = "右クリックでメニューを表示します" + vbNullChar
End With
Call Shell_NotifyIcon(NIM_ADD, aaaa)

のように記述して確認しました。

魔界の仮面弁士様、いつもご指導いただきありがとう御座いました。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加