示例#1
0
        public static void FromFile(Stream stream, UInt16 lang, ResourceSource source, ResIconDir resDir)
        {
            if (stream.Length < Marshal.SizeOf(typeof(IconDirectory)))
            {
                return;
            }

            BinaryReader rdr = new BinaryReader(stream);

            IconDirectory?tDir = ReadIcoHeader(rdr);

            if (tDir == null)
            {
                return;
            }

            IconDirectory dir = tDir.Value;

            ///////////////////////////////
            // rdr is now at the beginning of the array of FileIconDirectoryMembers

            FileIconDirectoryEntry[] subImages = new FileIconDirectoryEntry[dir.wCount];

            for (int i = 0; i < dir.wCount; i++)
            {
                subImages[i] = ReadFileDirMember(rdr);
            }

            /////////////////////////////
            // now for image data itself

            IconImageResourceDataFactory factory = GetIconImageFactory();

            for (int i = 0; i < dir.wCount; i++)
            {
                FileIconDirectoryEntry img = subImages[i];

                stream.Seek(img.dwImageOffset, SeekOrigin.Begin);

                Byte[] data = new Byte[img.dwBytesInRes];

                stream.Read(data, 0, (int)img.dwBytesInRes);

                Size dimensions = new Size(img.bWidth == 0 ? 256 : img.bWidth, img.bHeight == 0 ? 256 : img.bHeight);

                IconCursorImageResourceData memberImageData = factory.FromResource(null, data) as IconCursorImageResourceData;
                IconDirectoryMember         member          = new IconDirectoryMember(memberImageData, dimensions, img.bColorCount, img.bReserved, img.wPlanes, img.wBitCount, img.dwBytesInRes);

                resDir.AddUpdateMemberImage(member);
            }
        }
示例#2
0
        private static IconImageResourceDataFactory GetIconImageFactory()
        {
            if (_factory != null)
            {
                return(_factory);
            }

            ResourceTypeIdentifier typeId = new ResourceTypeIdentifier(new IntPtr((int)Win32ResourceType.IconImage));

            ResourceDataFactory[] factories = ResourceDataFactory.GetFactoriesForType(typeId);

            foreach (ResourceDataFactory f in factories)
            {
                IconImageResourceDataFactory iif = f as IconImageResourceDataFactory;
                if (iif != null)
                {
                    return(_factory = iif);
                }
            }

            return(_factory);
        }