アイコンがつぶれてしまいうまく表示されない
アイコンがつぶれてしまいうまく表示されない
件名のままなのですがウインドウ左上、タスクトレイに入れたアイコンが
つぶれてしまい正しく表示されないのです。
しかしメッセージボックスを出した時にタスクバーに表示されるアイコンは
潰れずに綺麗に表示されます。
エクスプローラーでも、一覧、縮小版、どの表示でも綺麗に表示されます。
32×32、16色だけではなく、16×16、16色も追加しても結果は同じです。
アイコン作成ソフトはWin32プログラミング講座 ~ Step13. アプリケーション アイコンを設定する ~
でも紹介されてるKH Image Editorです。
同ページにサンプルで置いてある、TextEditor.icoを使ってもやっぱりつぶれてしまいます。
これは仕方ない事なのでしょうか。
私が間違ったやり方をしているのでしょうか?(やり方はWin32プログラミング講座通りにやってます)
それとも解決法があるのでしょうか?
ご存知の方はどうか教えて下さい。
OS XP HOME SP2
AB 4.10.02(最新バージョンだと今回の件とは関係ない部分で不具合が出るので)
つぶれてしまい正しく表示されないのです。
しかしメッセージボックスを出した時にタスクバーに表示されるアイコンは
潰れずに綺麗に表示されます。
エクスプローラーでも、一覧、縮小版、どの表示でも綺麗に表示されます。
32×32、16色だけではなく、16×16、16色も追加しても結果は同じです。
アイコン作成ソフトはWin32プログラミング講座 ~ Step13. アプリケーション アイコンを設定する ~
でも紹介されてるKH Image Editorです。
同ページにサンプルで置いてある、TextEditor.icoを使ってもやっぱりつぶれてしまいます。
これは仕方ない事なのでしょうか。
私が間違ったやり方をしているのでしょうか?(やり方はWin32プログラミング講座通りにやってます)
それとも解決法があるのでしょうか?
ご存知の方はどうか教えて下さい。
OS XP HOME SP2
AB 4.10.02(最新バージョンだと今回の件とは関係ない部分で不具合が出るので)
Re: アイコンがつぶれてしまいうまく表示されない
16x16アイコンがあるようなので、それを指定した方が見栄えよくなりますが、
32x32アイコンしかない場合でも、それをきれいに縮小させる方法です。
ウィンドウプロパティでアイコンを指定するとRADにより WNDCLASSEX::hIconSm に、そのアイコンがセットされます。
具体的にはCreateイベントなどで、
とします。こうすれば、TextEditor.icoもつぶれず表示できます。
32x32アイコンしかない場合でも、それをきれいに縮小させる方法です。
ウィンドウプロパティでアイコンを指定するとRADにより WNDCLASSEX::hIconSm に、そのアイコンがセットされます。
↓MakeWindow.wbpより抜粋 [ここをクリックすると内容が表示されます]
このアイコンハンドルを無効にしてしまえばOKです。_RadSys_wcl.hIcon=LoadIcon(_RadSys_wcl.hInstance,IDI_ICON1)
_RadSys_wcl.hIconSm=LoadIcon(_RadSys_wcl.hInstance,IDI_ICON1)
具体的にはCreateイベントなどで、
コード: 全て選択
'小さいアイコンを変更
SetClassLong(hMainWnd, GCL_HICONSM, NULL)
Re: アイコンがつぶれてしまいうまく表示されない
マティさん、Tomorrowさん、返信ありがとうございます。
Tomorrowさんの教えてくれた方法でウインドウ左上のアイコンは綺麗に表示されるようになりました。
が、タスクトレイアイコンは潰れて汚いままです。
16x16アイコンだと確かにちゃんと表示されますが(それでもなぜかほんのちょっと汚くなる)
今度はエクスプローラーの縮小版で表示した時に拡大されるのでガタガタのアイコンになってしまうのです。
Win32プログラミング講座 ~ Step13ではアイコン2枚を組み合わせる事が書いてあるので、
32×32、16×16を組み合わせれば自動で選択、表示されるのかと思ったのですが、
そうではなく問題の解決には至りませんでした。
マティさん、すいません。私が説明不足でした。
アイコンが表示されてはいるのですが、私が描いた絵とは違う、潰れて
何がなんだか解らない絵になって表示されてしまうという事なのです。
不具合というのは、別プロジェクトで作ったソフトが、コードを何もいじってないのに
新バージョンでコンパイルすると上手く動作しなくなるのです。しかも何箇所も。
Ver4.11.01も2もそうなので様子見してるのです。まだバグ報告が出てるようなので3は試してません。
話し戻ってタスクトレイアイコンなのですが、NOTIFYICONDATA構造体等は以下の様になってます。
SetClassLong(hMainWnd, GCL_HICONSM, NULL)の様に、SetClassLong(hIcon, GCL_HICONSM, NULL)にしたり、
.hIcon = GetClassLong(hMainWnd, GCL_HICON)にしたりすれば上手くいくかなと思ったのですがダメでした。
なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
長文失礼しました。
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でタスクトレイアイコンを出したり消したりします。
.hIcon = GetClassLong(hMainWnd, GCL_HICON)にしたりすれば上手くいくかなと思ったのですがダメでした。
なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
長文失礼しました。
MSDNにはこんなことが書かれています。
http://msdn.microsoft.com/library/ja/jp ... adicon.asp
というわけでLoadImageを使ってみてはどうでしょうか。
その際にはGetSystemMetrics関数にSM_CXSMICONとSM_CYSMICONを指定して,
小さいアイコンのサイズを取得することをお勧めします。
http://msdn.microsoft.com/library/ja/jp ... adicon.asp
註:GetSystemMetrics 関数でSM_CXCURSORとSM_CYCURSORを指定すると大抵の環境では32を返すはずです。LoadIcon関数がロードできるのは、GetSystemMetrics関数の SM_CXCURSORとSM_CYCURSORの各フラグに相当するサイズのアイコンだけです。それ以外のサイズのアイコンをロードするには、LoadImage 関数を使ってください。
というわけでLoadImageを使ってみてはどうでしょうか。
その際にはGetSystemMetrics関数にSM_CXSMICONとSM_CYSMICONを指定して,
小さいアイコンのサイズを取得することをお勧めします。
Re: アイコンがつぶれてしまいうまく表示されない
タスクトレイアイコンは使ったことが無いので思いつきですが、> SetClassLong(hMainWnd, GCL_HICONSM, NULL)の様に、SetClassLong(hIcon, GCL_HICONSM, NULL)にしたり、
> .hIcon = GetClassLong(hMainWnd, GCL_HICON)にしたりすれば上手くいくかなと思ったのですがダメでした。
> なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
コード: 全て選択
.hIcon = NULL
Re: アイコンがつぶれてしまいうまく表示されない
ゲストさん、イグトランスさん、Tomorrowさん返信ありがとうございます。
ゲストさんのやり方で上手く出来ました。
つまり、32×32のアイコンがIDI_ICON1(メイン)だけだったのを
16×16のアイコンをIDI_ICON2に追加して
私が前回書いたコードを以下のように変えたら上手く表示できました。
こんな簡単な事で良かったんですね。全然思いつかなかった自分が情けないです。でも解決してよかったです。
ですのでイグトランスさんの方法は試してません。でも知恵を授けていただいてありがとうございます。
Tomorrowさんの言うとおり
にすると、タスクトレイにスペースは開きますが、アイコンは何も表示されなくなりました。
みなさん、本当にありがとうございました。
ゲストさんのやり方で上手く出来ました。
つまり、32×32のアイコンがIDI_ICON1(メイン)だけだったのを
16×16のアイコンをIDI_ICON2に追加して
私が前回書いたコードを以下のように変えたら上手く表示できました。
コード: 全て選択
hIcon = LoadIcon(CreateStruct.hInstance,IDI_ICON2) 'トレイアイコンのハンドルを取得
ですのでイグトランスさんの方法は試してません。でも知恵を授けていただいてありがとうございます。
Tomorrowさんの言うとおり
コード: 全て選択
.hIcon = NULL
みなさん、本当にありがとうございました。
前の投稿でフラグの存在を見落としていました。
.uFlagsのNIF_ICON(&H2)を外すとどうなるのですか?もし可能でしたらご報告願います。
16x16のアイコンを持っていないアプリケーションでも、普通はタスクトレイアイコンがきれいに表示されるので、なぜ32x32アイコンがうまくいかないのか気になったのですが...
NOTIFYICONDATAをキーにして検索してみるといろいろな方法が出てきます。
ExtractIconExのphIconSmallを使う
IDI_APPLICATIONを使う
イグトランスさんの方法に相当
これらを試すと、どうなりますでしょうか?
.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)
コード: 全て選択
hIcon = LoadIcon(NULL, IDI_APPLICATION)
コード: 全て選択
hIcon = LoadImage(CreateStruct.hInstance, IDI_ICON1, IMAGE_ICON, 16, 16, 0)
Re: アイコンがつぶれてしまいうまく表示されない
Tomorrowさんへ
IDI_ICON2を削除して試してみました。
>.uFlagsのNIF_ICON(&H2)を外すとどうなるのですか?
タスクトレイにスペースは開きますが、アイコンは何も表示されなくなりました。
>ExtractIconExのphIconSmallを使う
綺麗に表示されました。
>IDI_APPLICATIONを使う
ウインドウズロゴ(標準)のアイコン(四角いウインドウの絵)が出ました。
>イグトランスさんの方法に相当。
これも綺麗に表示されます。こちらの方が記述が少ないし、
アイコンを二枚追加しないのでそのぶん容量もうくので
(ExtractIconExのphIconSmallを使うでもそうですが)、これを採用しました。
でも、この場合は、dwFlags パラメータに LR_SHAREDを入れるか
DestroyIcon関数でメモリから解放しないといけない様です。
Tomorrowさん、また1つ勉強になりました。ありがとうございました。
今、見返すとマティさんとゲストさんは同じ事を書いていたのですね。
IDI_ICON2を削除して試してみました。
>.uFlagsのNIF_ICON(&H2)を外すとどうなるのですか?
タスクトレイにスペースは開きますが、アイコンは何も表示されなくなりました。
>ExtractIconExのphIconSmallを使う
綺麗に表示されました。
>IDI_APPLICATIONを使う
ウインドウズロゴ(標準)のアイコン(四角いウインドウの絵)が出ました。
>イグトランスさんの方法に相当。
これも綺麗に表示されます。こちらの方が記述が少ないし、
アイコンを二枚追加しないのでそのぶん容量もうくので
(ExtractIconExのphIconSmallを使うでもそうですが)、これを採用しました。
でも、この場合は、dwFlags パラメータに LR_SHAREDを入れるか
DestroyIcon関数でメモリから解放しないといけない様です。
Tomorrowさん、また1つ勉強になりました。ありがとうございました。
今、見返すとマティさんとゲストさんは同じ事を書いていたのですね。
Re: アイコンがつぶれてしまいうまく表示されない
ご報告ありがとうございます m(_ _)m> Tomorrowさんへ
> IDI_ICON2を削除して試してみました。
リファレンスを見ずに使ってしまいすみません。> >イグトランスさんの方法に相当。
> これも綺麗に表示されます。こちらの方が記述が少ないし、
> アイコンを二枚追加しないのでそのぶん容量もうくので
> (ExtractIconExのphIconSmallを使うでもそうですが)、これを採用しました。
> でも、この場合は、dwFlags パラメータに LR_SHAREDを入れるか
> DestroyIcon関数でメモリから解放しないといけない様です。
ExtractIconExの例ではきちんと開放しているのですが..orz
これも思いつきですが、この方法でうまくいくなら> >ExtractIconExのphIconSmallを使う
> 綺麗に表示されました。
コード: 全て選択
hIcon = GetClassLong(hMainWnd, GCL_HICONSM)
Re: アイコンがつぶれてしまいうまく表示されない
コード: 全て選択
hIcon = GetClassLong(hMainWnd, GCL_HICONSM)
う~ん、やればやるほど分からなくなってきますね。
井上翔太
ぼくも、アイコンがつぶれることがあります。
付属のアイコンエディダよりももっといい
アイコンエディダは、いくらでもありますよ。
(無料のものは少ない・・・)
まあ僕が言いたいのは、付属のものを使って
やろうとしないということですね(^ ^:;
他のやつでやると解決するかもしれませんよ・・・
付属のアイコンエディダよりももっといい
アイコンエディダは、いくらでもありますよ。
(無料のものは少ない・・・)
まあ僕が言いたいのは、付属のものを使って
やろうとしないということですね(^ ^:;
他のやつでやると解決するかもしれませんよ・・・