アイテムを表す構造体のリストを含む所有者描画リストボックスがあります。この構造体には、表示するアイコンと文字列の 2 つのプロパティがあります。16x16 程度の小さなアイコンの表示には問題なく機能しました。ただし、このリストボックスをフォルダーからの画像を表示するように調整しようとしましたが、いくつかの不可解なエラーが発生しました。
public static System.Drawing.Icon BitmapToIcon (System.String String_Bitmap, System.Drawing.Icon Object_Default)
{
try
{
//return System.Drawing.Icon.FromHandle(((System.Drawing.Bitmap)(System.Drawing.Bitmap.FromFile(String_Bitmap))).GetHicon());
System.IO.Stream s = new System.IO.MemoryStream(System.IO.File.ReadAllBytes(String_Bitmap));
System.Drawing.Bitmap b = ((System.Drawing.Bitmap)(System.Drawing.Bitmap.FromStream(s, true, true)));
System.Drawing.Icon i = System.Drawing.Icon.FromHandle(b.GetHicon());
s.Close();
b.Dispose();
return i;
}
catch
{
return Object_Default;
}
}
他の場所:
BitmapToIcon("D:/pictures/picture001.jpg", null);
このディレクトリには、すべての形状と形式の約 400 の画像がありますが、実際にリスト ボックスに表示されるのは、ランダムな間隔で配置された約 60 のみです。ListBox.DrawItem() では、Graphics.DrawIcon() が DivideByZero 関数をスローしています。例外をトラップすると、アイコンが 0x0 として登録されます。私の関数は、エラーが発生した場合にデフォルトのアイコン (この場合は null) を返すように書かれていることは明らかです。
Windows ICO フォーマットには 256x256 の制限があることは知っていますが、私が知る限り、ここで起こっていることではありません。それが描画する画像のいくつかは実際にははるかに大きく、正方形でもありません。さらに、400 個のリストにロードされないすべてのイメージは、10 個のリストに問題なくロードされます。GDI のハンドルが多すぎるか何かがあるのではないかと考えたので、関数を変更してソース ビットマップを破棄し、sleep ステートメントを追加しました。しかし、どちらも役に立ちませんでした。アイコンの代わりにビットマップを使用するようにリストボックスを変更すると、描画の問題は修正されましたが、より多くのメモリを消費するようになりました。
GetHIcon() がこのような奇妙な結果を返す理由はありますか?どうすればよいですか?