Как определить размеры значков в значке объекта в .net, winforms? - PullRequest
1 голос
/ 15 января 2010

Мне было интересно, возможно ли проверить требуемый размер иконки перед попыткой:

Dim myIcon = New Icon(theIcon, requestedSize).

Это относится к отрицательным числам, так что это легко проверить.

Похоже, он падает, если число меньше половины самого маленького значка. Я посмотрел на класс значков, но ничего не вижу для извлечения размеров.

ETA:

Это довольно раздражает. Вы можете поместить Int32.MaxValue, и он выберет самый большой значок. Почему он не выбирает самый маленький значок, если размер> 0, я не знаю. Если я могу определить размер наименьшего значка, я могу сделать это сам - без необходимости создавать исключение.

ETA:

Вот код VB для всех, кому это интересно:

//Returns an array of IconMetaData which contains, amongst other things, the size of
// each image in the icon.

<Extension()> _
Public Function GetMetaData(ByVal icon As Icon) As IconMetaData()
    Using s As New System.IO.MemoryStream
        icon.Save(s)
        Using r As New BinaryReader(s)
            s.Position = 0
            Dim Header As New IconHeader(r)
            Dim Data As New List(Of IconMetaData)
            For i As Integer = 0 To Header.NumberOfIcons - 1
                Dim d As New IconMetaData(r)
                *See note below. 
                If d.Height <> 0 AndAlso d.Width <> 0 Then
                    Data.Add(d)
                End If
            Next
            Return Data.ToArray
        End Using
    End Using
End Function

Private Class IconHeader

    Public ReadOnly NumberOfIcons As Short

    Public Sub New(ByVal r As BinaryReader)
        r.ReadInt16() //Reserved
        r.ReadInt16() //Type, 0=Bitmap, 1=Icon
        Me.NumberOfIcons = r.ReadInt16
    End Sub

End Class

Public Class IconMetaData

    Public ReadOnly Width As Byte
    Public ReadOnly Height As Byte
    Public ReadOnly ColorCount As Byte
    Public ReadOnly Planes As Short
    Public ReadOnly BitCount As Short

    Friend Sub New(ByVal r As BinaryReader)
        Me.Width = r.ReadByte
        Me.Height = r.ReadByte
        Me.ColorCount = r.ReadByte
        r.ReadByte() //Reserved
        Me.Planes = r.ReadInt16
        Me.BitCount = r.ReadInt16
        r.ReadInt32() //Bytes in res
        r.ReadInt32() //Image offset
    End Sub

End Class

* Примечание. Из пары значков, с которыми я это проверял, первая запись имеет размеры (0,0). Я не знаю почему, и я не могу быть уверен, что у всех значков есть эта запись, или что она всегда первая. Поэтому я проверяю каждый из них.

ETA: При дальнейшем расследовании я обнаружил, что 0 используется для обозначения значка размером 256.

1 Ответ

1 голос
/ 15 января 2010

Возможно, вы захотите взглянуть на эту статью. Похоже, это затрагивает то, что вы ищете, а затем некоторые.

Код проекта

...