8

この質問の指示に従って、ファイルからアイコンを抽出し、詳細モードに設定されたListViewでそれらを表示するためのコードを実行しています。アイコンを16x16で表示したいのですが、ImageListのサイズを設定すると、表示されるアイコンが非常に奇妙に見えます(説明方法がわかりません。添付のスクリーンショットを参照してください)。

サイズを32x32に変更してみましたが、問題なく表示されますが、高品質の16x16アイコンを取得する方法があるはずです。

http://img165.imageshack.us/img165/4446/badqualityiconscc4.png

4

3 に答える 3

11

最良の結果を得るには、2 つのイメージリストを使用する必要があります。1 つは smallimages 用で、もう 1 つは largeimages 用です。(リストビューには、LargeImageList と SmallImageList の 2 つのプロパティがあります)

編集(試したときに機能する新しい情報が見つかりました):

このバージョンは補間を使用して小さい親指を取得していますが、より良いはずです。

    Dim BigIcon As Icon = Nothing
    BigIcon = Icon.ExtractAssociatedIcon("c:\zebra.zip")
    Dim largeimages As New ImageList
    Dim smallimages As New ImageList

    largeimages.Images.Add("1", BigIcon)

    'Fix a smaller version with interpolation
    Dim bm As New Bitmap(BigIcon.ToBitmap)
    Dim thumb As New Bitmap(16, 16)
    Dim g As Graphics = Graphics.FromImage(thumb)
    g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
    g.DrawImage(bm, New Rectangle(0, 0, 16, 16), New Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel)
    g.Dispose()
    bm.Dispose()
    smallimages.Images.Add("1", thumb)
    ListView1.SmallImageList = smallimages
    ListView1.LargeImageList = largeimages
    thumb.Dispose()
    ListView1.Items.Add("Test", "Test", "1")
于 2009-01-20T21:56:49.787 に答える
4

このコード プロジェクト記事PInvoke.net の ExtractIconEx のデモを使用すると、次のように記述できます。

FileAssociationInfo info = new FileAssociationInfo(".docx");

ProgramAssociationInfo pai = new ProgramAssociationInfo(info.ProgID);
ProgramIcon ico = pai.DefaultIcon;
Icon icoLarge = Martin.Hyldahl.Examples.ExtractIconEx.ExtractIconExample.ExtractIconFromExe(ico.Path, ico.Index, false);

ExtractIconFromExe の署名をに変更する必要があります

public static Icon ExtractIconFromExe(string file, int nIconIndex, bool large)

コードを数行下に変更します

if (large)
   readIconCount = ExtractIconEx(file, nIconIndex, hIconEx, hDummy, 1);
else
   readIconCount = ExtractIconEx(file, nIconIndex, hDummy, hIconEx, 1);
于 2010-04-19T15:25:15.530 に答える