ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 22:33

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 13 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月23日(水) 03:12 
件名のままなのですがウインドウ左上、タスクトレイに入れたアイコンが
つぶれてしまい正しく表示されないのです。

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

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

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

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

OS XP HOME SP2
AB 4.10.02(最新バージョンだと今回の件とは関係ない部分で不具合が出るので)


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月23日(水) 08:50 
オフライン

登録日時: 2005年8月23日(火) 00:15
記事: 161
お住まい: 沖縄県
プロジェクトエディタで該当するウィンドウを開き、ウィンドウプロパティのアイコンで指定可能です。
16x16アイコンを指定すると表示出来ます。

ところで、
>AB 4.10.02(最新バージョンだと今回の件とは関係ない部分で不具合が出るので)
の方がもっと気になるのですが・・・


通報する
ページトップ
投稿記事Posted: 2005年11月23日(水) 12:22 
オフライン

登録日時: 2005年6月04日(土) 10:09
記事: 72
16x16アイコンがあるようなので、それを指定した方が見栄えよくなりますが、
32x32アイコンしかない場合でも、それをきれいに縮小させる方法です。

ウィンドウプロパティでアイコンを指定するとRADにより WNDCLASSEX::hIconSm に、そのアイコンがセットされます。
このアイコンハンドルを無効にしてしまえばOKです。
具体的にはCreateイベントなどで、
コード:
	'小さいアイコンを変更
	SetClassLong(hMainWnd, GCL_HICONSM, NULL)
とします。こうすれば、TextEditor.icoもつぶれず表示できます。


通報する
ページトップ
投稿記事Posted: 2005年11月23日(水) 18:02 
マティさん、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)にしたりすれば上手くいくかなと思ったのですがダメでした。
なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
長文失礼しました。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月23日(水) 18:24 
IDEを使っておられると思うのですが、リソースに16x16のアイコン登録して、
それを表示するようにしてはどうでしょうか?
投稿を読んでいて「32x32と16x16のサイズを持ったアイコン」を使用しておられるようですが、
経験として、Windowsは自動で適切なサイズを選んで表示してくれないようです。
潰れているというのは恐らく32x32のサイズのアイコンが縮小されて表示されているからだと思います。

上手く伝わってるかどうか不安ですが、恐らくこれで解決すると思います。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月23日(水) 18:56 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
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を指定して,
小さいアイコンのサイズを取得することをお勧めします。


通報する
ページトップ
投稿記事Posted: 2005年11月24日(木) 11:54 
オフライン

登録日時: 2005年6月04日(土) 10:09
記事: 72
引用:
> SetClassLong(hMainWnd, GCL_HICONSM, NULL)の様に、SetClassLong(hIcon, GCL_HICONSM, NULL)にしたり、
> .hIcon = GetClassLong(hMainWnd, GCL_HICON)にしたりすれば上手くいくかなと思ったのですがダメでした。
> なので度々すいませんが、タスクトレイアイコンを綺麗に表示するにはどうすれば良いか教えてください。
タスクトレイアイコンは使ったことが無いので思いつきですが、
コード:
.hIcon = NULL
としてみたらどうなりますか?


通報する
ページトップ
投稿記事Posted: 2005年11月24日(木) 17:02 
ゲストさん、イグトランスさん、Tomorrowさん返信ありがとうございます。

ゲストさんのやり方で上手く出来ました。
つまり、32×32のアイコンがIDI_ICON1(メイン)だけだったのを
16×16のアイコンをIDI_ICON2に追加して
私が前回書いたコードを以下のように変えたら上手く表示できました。
コード:
hIcon = LoadIcon(CreateStruct.hInstance,IDI_ICON2)    'トレイアイコンのハンドルを取得
こんな簡単な事で良かったんですね。全然思いつかなかった自分が情けないです。でも解決してよかったです。

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

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

みなさん、本当にありがとうございました。


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月24日(木) 18:20 
オフライン

登録日時: 2005年6月04日(土) 10:09
記事: 72
前の投稿でフラグの存在を見落としていました。
.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)
これらを試すと、どうなりますでしょうか?


通報する
ページトップ
投稿記事Posted: 2005年11月25日(金) 16:38 
Tomorrowさんへ
IDI_ICON2を削除して試してみました。

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

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

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

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

Tomorrowさん、また1つ勉強になりました。ありがとうございました。
今、見返すとマティさんとゲストさんは同じ事を書いていたのですね。


通報する
ページトップ
   
投稿記事Posted: 2005年11月26日(土) 17:53 
オフライン

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

引用:
> >ExtractIconExのphIconSmallを使う
> 綺麗に表示されました。
これも思いつきですが、この方法でうまくいくなら
コード:
hIcon = GetClassLong(hMainWnd, GCL_HICONSM)
でもできるかも?


通報する
ページトップ
投稿記事Posted: 2005年11月26日(土) 18:09 
コード:
hIcon = GetClassLong(hMainWnd, GCL_HICONSM)
でやると、四角いウインドウの絵のアイコンが出ました。
う~ん、やればやるほど分からなくなってきますね。


通報する
ページトップ
   
 記事の件名: 井上翔太
投稿記事Posted: 2005年11月26日(土) 21:28 
オフライン

登録日時: 2005年10月22日(土) 13:17
記事: 12
お住まい: 京都市
ぼくも、アイコンがつぶれることがあります。
付属のアイコンエディダよりももっといい
アイコンエディダは、いくらでもありますよ。
(無料のものは少ない・・・)
まあ僕が言いたいのは、付属のものを使って
やろうとしないということですね(^ ^:;
他のやつでやると解決するかもしれませんよ・・・


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 13 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[18人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean