2009-01-20 19 views
8

Thực hiện theo các hướng dẫn tại this question, tôi có một số mã chạy để trích xuất biểu tượng từ các tệp và hiển thị chúng trong một ListView được đặt ở chế độ chi tiết. Tôi muốn các biểu tượng hiển thị ở 16 x 16, nhưng khi tôi có kích thước ImageList được đặt thành các biểu tượng xuất hiện trông rất lạ (không chắc chắn cách mô tả nó - xem ảnh chụp màn hình đính kèm).Sử dụng Icon.ExtractAssociatedIcon và ImageList

Tôi đã thử thay đổi kích thước thành 32 x 32 và chúng xuất hiện tốt, nhưng chắc chắn phải có cách để có được biểu tượng 16 x 16 chất lượng tốt phải không?

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

Trả lời

10

Bạn phải sử dụng 2 imagelists, một cho smallimages và một cho largeimages để có được kết quả tốt nhất mà tôi nghĩ. (Các listview có hai thuộc tính, LargeImageList và SmallImageList)

Chỉnh sửa (tìm thấy những thông tin mới mà làm việc khi tôi đã cố gắng):

Đây là phiên bản đang sử dụng phép nội suy để có được những ngón tay cái nhỏ hơn, nên tốt hơn.

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") 
+1

Đáng buồn là điều đó dường như không hoạt động - chúng vẫn hiển thị kém. Bất kỳ ý tưởng nào khác? – robintw

+0

Im làm việc trên nó ..;) – Stefan

+0

Cảm ơn. Tôi đã thử những gì bạn đề nghị trong chỉnh sửa của bạn, bằng cách sử dụng phương pháp DrawImage và điều đó dường như không làm việc, hoặc - cho kết quả chính xác giống nhau. Tôi có thể đăng các mã tôi đang sử dụng với phương pháp DrawImage nếu điều đó sẽ giúp đỡ. – robintw

3

Với Code Project Article này và Demo of ExtractIconEx on PInvoke.net bạn có thể viết như sau:

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); 

bạn phải thay đổi chữ ký của ExtractIconFromExe để

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

và thay đổi mã một vài dòng xuống đến

if (large) 
    readIconCount = ExtractIconEx(file, nIconIndex, hIconEx, hDummy, 1); 
else 
    readIconCount = ExtractIconEx(file, nIconIndex, hDummy, hIconEx, 1); 
+0

Cảm ơn @HumerGu, tôi đã có thể hưởng lợi từ điều đó! –

1

Bằng cách hủy hình ảnh Thuộc tính ColorDepth được đặt thành Depth8Bit, đặt nó thành Depth32Bit.

Các vấn đề liên quan