Мне было интересно, возможно ли проверить требуемый размер иконки перед попыткой:
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.