アイコンがつぶれてしまいうまく表示されない

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
西野孝雄

アイコンがつぶれてしまいうまく表示されない

#1 投稿記事 by 西野孝雄 »

件名のままなのですがウインドウ左上、タスクトレイに入れたアイコンが
つぶれてしまい正しく表示されないのです。

しかしメッセージボックスを出した時にタスクバーに表示されるアイコンは
潰れずに綺麗に表示されます。
エクスプローラーでも、一覧、縮小版、どの表示でも綺麗に表示されます。

32×32、16色だけではなく、16×16、16色も追加しても結果は同じです。

アイコン作成ソフトはWin32プログラミング講座 ~ Step13. アプリケーション アイコンを設定する ~
でも紹介されてるKH Image Editorです。
同ページにサンプルで置いてある、TextEditor.icoを使ってもやっぱりつぶれてしまいます。

これは仕方ない事なのでしょうか。
私が間違ったやり方をしているのでしょうか?(やり方はWin32プログラミング講座通りにやってます)
それとも解決法があるのでしょうか?
ご存知の方はどうか教えて下さい。

OS XP HOME SP2
AB 4.10.02(最新バージョンだと今回の件とは関係ない部分で不具合が出るので)
マティ
記事: 161
登録日時: 2005年8月23日(火) 00:15
お住まい: 沖縄県
連絡する:

#2 投稿記事 by マティ »

プロジェクトエディタで該当するウィンドウを開き、ウィンドウプロパティのアイコンで指定可能です。
16x16アイコンを指定すると表示出来ます。

ところで、
>AB 4.10.02(最新バージョンだと今回の件とは関係ない部分で不具合が出るので)
の方がもっと気になるのですが・・・
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: アイコンがつぶれてしまいうまく表示されない

#3 投稿記事 by Tomorrow »

16x16アイコンがあるようなので、それを指定した方が見栄えよくなりますが、
32x32アイコンしかない場合でも、それをきれいに縮小させる方法です。

ウィンドウプロパティでアイコンを指定するとRADにより WNDCLASSEX::hIconSm に、そのアイコンがセットされます。
このアイコンハンドルを無効にしてしまえばOKです。
具体的にはCreateイベントなどで、

コード: 全て選択

	'小さいアイコンを変更
	SetClassLong(hMainWnd, GCL_HICONSM, NULL)
とします。こうすれば、TextEditor.icoもつぶれず表示できます。
西野孝雄

Re: アイコンがつぶれてしまいうまく表示されない

#4 投稿記事 by 西野孝雄 »

マティさん、Tomorrowさん、返信ありがとうございます。

Tomorrowさんの教えてくれた方法でウインドウ左上のアイコンは綺麗に表示されるようになりました。
が、タスクトレイアイコンは潰れて汚いままです。

16x16アイコンだと確かにちゃんと表示されますが(それでもなぜかほんのちょっと汚くなる)
今度はエクスプローラーの縮小版で表示した時に拡大されるのでガタガタのアイコンになってしまうのです。
Win32プログラミング講座 ~ Step13ではアイコン2枚を組み合わせる事が書いてあるので、
32×32、16×16を組み合わせれば自動で選択、表示されるのかと思ったのですが、
そうではなく問題の解決には至りませんでした。

マティさん、すいません。私が説明不足でした。
アイコンが表示されてはいるのですが、私が描いた絵とは違う、潰れて
何がなんだか解らない絵になって表示されてしまうという事なのです。

不具合というのは、別プロジェクトで作ったソフトが、コードを何もいじってないのに
新バージョンでコンパイルすると上手く動作しなくなるのです。しかも何箇所も。
Ver4.11.01も2もそうなので様子見してるのです。まだバグ報告が出てるようなので3は試してません。

話し戻ってタスクトレイアイコンなのですが、NOTIFYICONDATA構造体等は以下の様になってます。

コード: 全て選択


Dim TrayIcon As NOTIFYICONDATA  'トレイアイコンの情報を格納する構造体
Dim hIcon As DWord              'アイコンハンドル

	hIcon = LoadIcon(CreateStruct.hInstance,IDI_ICON1)	'トレイアイコンのハンドルを取得
	FillMemory(VarPtr(TrayIcon),Len(TrayIcon),0)		'NOTIFYICONDATA構造体の初期化
	With TrayIcon
		.cbSize = Len(TrayIcon)							'構造体のサイズ
		.hWnd = hMainWnd
		.uID = 1
		.uFlags = &H1 or &H2 or &H4
		.uCallbackMessage = MSG_TRAYICON
		.hIcon = hIcon
		.lstrcpy(.szTip,"TrayIcon Test")
	End With

で、この後、Shell_NotifyIconでタスクトレイアイコンを出したり消したりします。
SetClassLong(hMainWnd, GCL_HICONSM, NULL)の様に、SetClassLong(hIcon, GCL_HICONSM, NULL)にしたり、
.hIcon = GetClassLong(hMainWnd, GCL_HICON)にしたりすれば上手くいくかなと思ったのですがダメでした。
なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
長文失礼しました。
ゲスト

#5 投稿記事 by ゲスト »

IDEを使っておられると思うのですが、リソースに16x16のアイコン登録して、
それを表示するようにしてはどうでしょうか?
投稿を読んでいて「32x32と16x16のサイズを持ったアイコン」を使用しておられるようですが、
経験として、Windowsは自動で適切なサイズを選んで表示してくれないようです。
潰れているというのは恐らく32x32のサイズのアイコンが縮小されて表示されているからだと思います。

上手く伝わってるかどうか不安ですが、恐らくこれで解決すると思います。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#6 投稿記事 by イグトランス »

MSDNにはこんなことが書かれています。
http://msdn.microsoft.com/library/ja/jp ... adicon.asp
LoadIcon関数がロードできるのは、GetSystemMetrics関数の SM_CXCURSORとSM_CYCURSORの各フラグに相当するサイズのアイコンだけです。それ以外のサイズのアイコンをロードするには、LoadImage 関数を使ってください。
註:GetSystemMetrics 関数でSM_CXCURSORとSM_CYCURSORを指定すると大抵の環境では32を返すはずです。

というわけでLoadImageを使ってみてはどうでしょうか。
その際にはGetSystemMetrics関数にSM_CXSMICONとSM_CYSMICONを指定して,
小さいアイコンのサイズを取得することをお勧めします。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: アイコンがつぶれてしまいうまく表示されない

#7 投稿記事 by Tomorrow »

> SetClassLong(hMainWnd, GCL_HICONSM, NULL)の様に、SetClassLong(hIcon, GCL_HICONSM, NULL)にしたり、
> .hIcon = GetClassLong(hMainWnd, GCL_HICON)にしたりすれば上手くいくかなと思ったのですがダメでした。
> なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
タスクトレイアイコンは使ったことが無いので思いつきですが、

コード: 全て選択

.hIcon = NULL
としてみたらどうなりますか?
西野孝雄

Re: アイコンがつぶれてしまいうまく表示されない

#8 投稿記事 by 西野孝雄 »

ゲストさん、イグトランスさん、Tomorrowさん返信ありがとうございます。

ゲストさんのやり方で上手く出来ました。
つまり、32×32のアイコンがIDI_ICON1(メイン)だけだったのを
16×16のアイコンをIDI_ICON2に追加して
私が前回書いたコードを以下のように変えたら上手く表示できました。

コード: 全て選択

hIcon = LoadIcon(CreateStruct.hInstance,IDI_ICON2)    'トレイアイコンのハンドルを取得
こんな簡単な事で良かったんですね。全然思いつかなかった自分が情けないです。でも解決してよかったです。

ですのでイグトランスさんの方法は試してません。でも知恵を授けていただいてありがとうございます。

Tomorrowさんの言うとおり

コード: 全て選択

.hIcon = NULL
にすると、タスクトレイにスペースは開きますが、アイコンは何も表示されなくなりました。

みなさん、本当にありがとうございました。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

#9 投稿記事 by Tomorrow »

前の投稿でフラグの存在を見落としていました。
.uFlagsのNIF_ICON(&H2)を外すとどうなるのですか?もし可能でしたらご報告願います。

16x16のアイコンを持っていないアプリケーションでも、普通はタスクトレイアイコンがきれいに表示されるので、なぜ32x32アイコンがうまくいかないのか気になったのですが...
NOTIFYICONDATAをキーにして検索してみるといろいろな方法が出てきます。

ExtractIconExのphIconSmallを使う

コード: 全て選択

Dim szModule[ELM(MAX_PATH)] As Byte
GetModuleFileName(NULL, szModule, MAX_PATH)
ExtractIconEx(szModule, 0, NULL, VarPtr(hIcon), 1)
'使用
DestroyIcon(hIcon)
IDI_APPLICATIONを使う

コード: 全て選択

hIcon = LoadIcon(NULL, IDI_APPLICATION)
イグトランスさんの方法に相当

コード: 全て選択

hIcon = LoadImage(CreateStruct.hInstance, IDI_ICON1, IMAGE_ICON, 16, 16, 0)
これらを試すと、どうなりますでしょうか?
西野孝雄

Re: アイコンがつぶれてしまいうまく表示されない

#10 投稿記事 by 西野孝雄 »

Tomorrowさんへ
IDI_ICON2を削除して試してみました。

>.uFlagsのNIF_ICON(&H2)を外すとどうなるのですか?
タスクトレイにスペースは開きますが、アイコンは何も表示されなくなりました。

>ExtractIconExのphIconSmallを使う
綺麗に表示されました。

>IDI_APPLICATIONを使う
ウインドウズロゴ(標準)のアイコン(四角いウインドウの絵)が出ました。

>イグトランスさんの方法に相当。
これも綺麗に表示されます。こちらの方が記述が少ないし、
アイコンを二枚追加しないのでそのぶん容量もうくので
(ExtractIconExのphIconSmallを使うでもそうですが)、これを採用しました。
でも、この場合は、dwFlags パラメータに LR_SHAREDを入れるか
DestroyIcon関数でメモリから解放しないといけない様です。

Tomorrowさん、また1つ勉強になりました。ありがとうございました。
今、見返すとマティさんとゲストさんは同じ事を書いていたのですね。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: アイコンがつぶれてしまいうまく表示されない

#11 投稿記事 by Tomorrow »

> Tomorrowさんへ
> IDI_ICON2を削除して試してみました。
ご報告ありがとうございます m(_ _)m
> >イグトランスさんの方法に相当。
> これも綺麗に表示されます。こちらの方が記述が少ないし、
> アイコンを二枚追加しないのでそのぶん容量もうくので
> (ExtractIconExのphIconSmallを使うでもそうですが)、これを採用しました。
> でも、この場合は、dwFlags パラメータに LR_SHAREDを入れるか
> DestroyIcon関数でメモリから解放しないといけない様です。
リファレンスを見ずに使ってしまいすみません。
ExtractIconExの例ではきちんと開放しているのですが..orz

> >ExtractIconExのphIconSmallを使う
> 綺麗に表示されました。
これも思いつきですが、この方法でうまくいくなら

コード: 全て選択

hIcon = GetClassLong(hMainWnd, GCL_HICONSM)
でもできるかも?
西野孝雄

Re: アイコンがつぶれてしまいうまく表示されない

#12 投稿記事 by 西野孝雄 »

コード: 全て選択

hIcon = GetClassLong(hMainWnd, GCL_HICONSM)
でやると、四角いウインドウの絵のアイコンが出ました。
う~ん、やればやるほど分からなくなってきますね。
井上翔太
記事: 12
登録日時: 2005年10月22日(土) 13:17
お住まい: 京都市
連絡する:

井上翔太

#13 投稿記事 by 井上翔太 »

ぼくも、アイコンがつぶれることがあります。
付属のアイコンエディダよりももっといい
アイコンエディダは、いくらでもありますよ。
(無料のものは少ない・・・)
まあ僕が言いたいのは、付属のものを使って
やろうとしないということですね(^ ^:;
他のやつでやると解決するかもしれませんよ・・・
返信する