
VC++にてエクスプローラもどきを作成しています。
ListViewへファイルアイコンを表示するために、
SHGetFileInfoを使用し、
// 大きいアイコンのハンドル取得
// fnameは拡張子だけの文字列です
SHGetFileInfo( fname, NULL, &shfInfo, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
licon = shfInfo.hIcon;
上記のようにしてファイルアイコンを取得し、
CImageListへ追加した上で、描画しています。
そして、ダイアログのサイズが変更された際に、
OnSize関数にて、ListView内のアイコンを再度取得し、
再描画しているのですが、
何度もOnSizeで再描画を行っているうちに、
SHGetFileInfoにて取得したshfInfo.hIconが
NULLになってしまいます。
一度、shfInfo.hIconがNULLになると、
何度、SHGetFileInfoを呼んでも、返ってくるhIconは
毎回NULLになってしまい、ListView内に
アイコンが表示されません。
SHGetFileInfo関数を呼ぶ際の制約等があるのでしょうか?
No.1ベストアンサー
- 回答日時:
こんにちは。
リソースリークしているのではないでしょうか。
取り敢えず、使い終わったアイコンのハンドルを削除して見て下さい。
因みに以下で再現出来しました。
SHFILEINFO shfInfo;
//取り敢えずノートパッド(メモ帳)のアイコンを取って来る
TCHAR szPath[] = _T("C:\\WINNT\\notepad.exe");
for(int i = 0; i < 100000; ++i)
{
SHGetFileInfo( szPath, NULL, &shfInfo, sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
HICON hicon = shfInfo.hIcon;
//此れを呼べば大丈夫
//::DestroyIcon(hicon);
if(hicon == NULL)
{
//いずれココに来る
}
}
直りました。ありがとうございます。
SHGetFileInfoでも内部でアイコンを作成しているんですね。
とはいえ、CImageListにAddした直後にDestroyIconしても
キチンと表示されているのは不可解な気もしますが。。。
Addしているんだから、描画はAddされたアイコンを使うのでは???
Destroyしちゃったら、何を使って描画させてるんだろう???
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
word
-
win32api 画面のちらつき
-
[VB.net] DataGridViewの列ヘッ...
-
SHGetFileInfoでアイコンが取得...
-
TextBoxに文字を書いても表示さ...
-
CStaticコントロールの静的イメ...
-
VB6,リストボックスの特定行の...
-
InvalidateRectの使い方について
-
この二つの違いは・・・?
-
google Colabでmatplotlibの描...
-
プシュボタンのテキストの色を...
-
逐次的なグラフ表示の方法
-
FPS処理について
-
FlexGridの一部のみ表示を更新...
-
MFCのタイマーのつかい方を教え...
-
BitBltでの表示での問題です。
-
CDC(LineTo)で描画した線を透過...
-
ブレゼンハムのアルゴリズムに...
-
GetGlyphOutline() ご利用経験...
-
Spreadで表全体を選択した場合...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
Labelの文字をスクロールする際...
-
UpdateData( FALSE); による文...
-
VBAにGDI+を参照させる方法
-
CStaticコントロールの静的イメ...
-
FlexGridの一部のみ表示を更新...
-
Form1 Load で実行されない。
-
VB.netでのライン描画方法がわ...
-
重いグラフィックス処理
-
InvalidateRectの使い方について
-
SHGetFileInfoでアイコンが取得...
-
OneNote 2010 文字と描画がずれる
おすすめ情報