ファイルに関連付けられたアイコンを取得しリストに表示で...

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

ファイルに関連付けられたアイコンを取得しリストに表示で...

#1 投稿記事 by yu0627 »

 こんばんは。yu0627です。久しぶりに投稿させていただきます。
 件名のとおり、僕が作ったソフト「SameFolder MusicPlayer」にて、ファイルに関連付けられたアイコンを取得して、リストに表示できるように改良中なのです。
しかし、取得したアイコンがエクスプローラで表示されるアイコンと別のものになってしまいます。
以下にソースを載せます。 どこがおかしいのでしょうか。
色々と試してみたのですが、お手上げです。
ご指摘、お願いいたします。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: ファイルに関連付けられたアイコンをリストに表示...

#2 投稿記事 by Tomorrow »

> しかし、取得したアイコンがエクスプローラで表示されるアイコンと別のものになってしまいます。
別のものとはどのようになるのでしょうか?
もっと具体的に教えてください。
> 以下にソースを載せます。
できればMainWnd.sbpの全ソースか、せめてリストビューとイメージリスト関連の処理部分だけでも載せられませんか?
そうでないと比較・実験できませんので。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#3 投稿記事 by yu0627 »

コード: 全て選択

別のものとはどのようになるのでしょうか? 
もっと具体的に教えてください。
 えぇと、例えば、僕のPCの場合、mp3ファイルをRealPlayerに関連付けていて、エクスプローラでのアイコンの表示はRealPlayerのアイコンなんですが、WMPのアイコンになってしまいます。また、wmaファイルの関連付けはWMPで、エクスプローラーのアイコンもWMPなのですが、RealPlayerのアイコンになってしまいます。

コード: 全て選択

できればMainWnd.sbpの全ソースか、せめてリストビューとイメージリスト関連の処理部分だけでも載せられませんか? 
そうでないと比較・実験できませんので。
 すみません。以下に、MainWnd.sbpの全内容を載せます。
 最後に、不完全な投稿であったことを、お詫び申し上げます。
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: 返信@yu0627

#4 投稿記事 by Tomorrow »

えぇと、例えば、僕のPCの場合、mp3ファイルをRealPlayerに関連付けていて、エクスプローラでのアイコンの表示はRealPlayerのアイコンなんですが、WMPのアイコンになってしまいます。また、wmaファイルの関連付けはWMPで、エクスプローラーのアイコンもWMPなのですが、RealPlayerのアイコンになってしまいます。
当方でも試してみました。
MainWnd_ChooseFolderButton_Click()イベントのSetMusicFileListView()関数を呼び出しているところで、拡張子wmvを*に変えていろんなファイルを読み込めるようにしたら、ファイルアイコンがばらばらに設定されていました。
しかも、毎回同じアイコンが設定されるのかな?と思ったら、次に試すと違っていたりして、ランダム性があります。
なので、.mp3ファイルがRealPlayerのアイコンに、.wmaファイルがWMPのアイコンに、それぞれ化けているのではなくて、イメージリストへのアイコン追加が間違っていると思われます。
その辺を見直してみてください。
最後に、不完全な投稿であったことを、お詫び申し上げます。
謝るほどの事ではないですよ。
どのようなソースであれ著作権はありますから、投稿するのに抵抗を感じる人もいるでしょうし、いきなりソース全掲載だと見づらくなります。
的確な情報を伝えるのは難しいですよね。

アドバイスみたくなってしまいますけど、ソースのどこに着目したら不具合が発見できそうか見極めることが、自分でバグ取りでも、人に質問するときでも解決の糸口になると思います。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627 問題解決

#5 投稿記事 by yu0627 »

 yu0627です。色々とやってみました。
それで、やっとうまく動かすことができました。
方法は、以下のとおりです。
①リストビューのスタイルを新たに追加

コード: 全て選択

SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT)
↓
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT or LVS_EX_SUBITEMIMAGES)
②アイコン取得のコードを以下のように変更

コード: 全て選択

'ChosenFolderPathに格納されたパスの中の音楽ファイルを検索しMusicFileListViewにセットする為の関数
Function SetMusicFileListView(pExt As BytePtr) As Long
	'変数宣言
	Dim FindData As WIN32_FIND_DATA			'検索に関する情報が格納される構造体
	Dim hFind As DWord						'検索のハンドル	
	Dim PathBuffer[MAX_PATH] As Byte		'音楽ファイルのパスを格納する変数
	Dim lvItem As LVITEM					'リストビューのアイテム設定時に使用する構造体
	Dim MFileLong As String					'音楽ファイルの長さを格納する変数	
	Dim ListViewNum As Long					'リストビューの番号を格納する変数
	Dim hIcon As DWord						'アイコンのハンドル
	Dim temp As DWord
	Dim cnt As Long	
	Dim shfi As SHFILEINFO					'SHFILEINFO構造体
	Dim ExitCode As DWord
	Dim nIconIndex As Long

	'ListViewNumの初期化
	ListViewNum=0

	If mop.wDeviceID Then
		'もし再生中なら停止する
		SendMessage(hMainWnd, WM_COMMAND, StopButton, 0)
	End If

	hFind=FindFirstFile(ChosenFolderPath & "\*." & pExt, FindData)
	If hFind = INVALID_HANDLE_VALUE Then
		'戻り値を設定する
		SetMusicFileListView = FALSE
		Exit Function
	End If

	Do
		'ファイルパスをセットし、アイコンを取得
		wsprintf(PathBuffer, "%s\%s", ChosenFolderPath, FindData.cFileName)
		FillMemory(VarPtr(shfi), Len(shfi), 0)
		SHGetFileInfo(PathBuffer, 0, shfi, Len(shfi), SHGFI_ICON or SHGFI_SMALLICON)

		'アイコンをイメージリストに追加
		nIconIndex=ImageList_AddIcon(liHandle, shfi.hIcon)
		If nIconIndex=-1 Then nIconIndex=cnt

		'アイコンの追加
		SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETIMAGELIST, LVSIL_SMALL, liHandle)

		'リストビューにファイルを追加
		With lvItem
			.mask=LVIF_TEXT or LVIF_IMAGE
			.iImage=nIconIndex
			.pszText=FindData.cFileName
			.iItem=cnt
			.iSubItem=0
		End With
		SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTITEM, 0, VarPtr(lvItem))
	Loop While FindNextFile(hFind, FindData)
	'検索ハンドルを閉じる
	FindClose(hFind)

	'戻り値を設定する
	SetMusicFileListView = TRUE
End Function
これでうまくいきました。
ただ、僕だけの環境かもしれないので、良ければTomorrowさんにもテストしてもらいたいのですが、良いでしょうか?
Tomorrow
記事: 72
登録日時: 2005年6月04日(土) 10:09

Re: 返信@yu0627 問題解決

#6 投稿記事 by Tomorrow »

> これでうまくいきました。
> ただ、僕だけの環境かもしれないので、良ければTomorrowさんにもテストしてもらいたいのですが、良いでしょうか?
確認してみたところ、こちらでも正しく表示されました。
yu0627
記事: 154
登録日時: 2005年5月31日(火) 14:53

返信@yu0627

#7 投稿記事 by yu0627 »

確認してみたところ、こちらでも正しく表示されました。
 確認ありがとうございます^^
 では。
返信する