
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で質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Excel(エクセル) Excelでnullになるような式のセルをマクロで空白行と認識させるにはどうすればいいですか? 3 2023/03/13 13:42
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
VC++プログラムをつかったBMP画...
-
[VB.net] DataGridViewの列ヘッ...
-
VBAにGDI+を参照させる方法
-
word
-
c++ ダブルバッファリング、以...
-
NVIDIAのシェーダーキャッシュ
-
BitBltでの表示での問題です。
-
Minecraft 統合版(PC)の描画距...
-
CDC(LineTo)で描画した線を透過...
-
StretchBlt関数について
-
Form1 Load で実行されない。
-
panelのスクロール表示について
-
最前面に無理やりフォームを持...
-
画像の印刷について
-
TextBoxに文字を書いても表示さ...
-
GDI+で高速な描画
-
ダイアログベースの再描画について
-
ワードの図形で重なり部分の色...
-
クライアント領域を再描画させ...
マンスリーランキングこのカテゴリの人気マンスリー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 文字と描画がずれる
おすすめ情報