Exemple #1
0
 private static extern bool GetIconInfo(IntPtr hIcon, out IconInfo piconinfo);
Exemple #2
0
        private IImage GetIconWindows(IntPtr hIcon, UIEngine engine, bool large)
        {
            IconInfo iconInfo = new IconInfo();

            if (true == GetIconInfo(hIcon, out iconInfo))
            {
                BitmapInfo bitmapInfo = new BitmapInfo();

                bitmapInfo.bmiHeader.biSize = Marshal.SizeOf(bitmapInfo);

                IntPtr dc = CreateCompatibleDC(IntPtr.Zero);

                int rez = GetDIBits(dc, iconInfo.hbmColor, 0, 0, null, ref bitmapInfo, Win32.DIB_RGB_COLORS);

                if (rez == 0)
                {
                    DeleteDC(dc);

                    return(null);
                }

                byte[] pBuffer = new byte[bitmapInfo.bmiHeader.biWidth * bitmapInfo.bmiHeader.biHeight * 4];
                byte[] buffer  = new byte[bitmapInfo.bmiHeader.biWidth * bitmapInfo.bmiHeader.biHeight * 4];

                rez = GetDIBits(dc, iconInfo.hbmColor, 0, (uint)bitmapInfo.bmiHeader.biHeight, buffer, ref bitmapInfo, Win32.DIB_RGB_COLORS);

                bool bAllAlphaTransparent = true;

                for (int y = 0; y < bitmapInfo.bmiHeader.biHeight; y++)
                {
                    for (int x = 0; x < bitmapInfo.bmiHeader.biWidth; x++)
                    {
                        pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 0] = buffer[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 2];
                        pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 1] = buffer[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 1];
                        pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 2] = buffer[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 0];
                        pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 3] = buffer[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 3];

                        if ((false != bAllAlphaTransparent) && (pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 3] != 0x0))
                        {
                            bAllAlphaTransparent = false;
                        }
                    }
                }

                rez = GetDIBits(dc, iconInfo.hbmMask, 0, 0, null, ref bitmapInfo, Win32.DIB_RGB_COLORS);

                if ((rez == 0) || (false == bAllAlphaTransparent))
                {
                }
                else
                {
                    byte[]     colorBits = new byte[4096 * 4];
                    byte[]     maskBits  = new byte[4096 * 4];
                    BitmapInfo bmi       = new BitmapInfo();

                    bmi.bmiHeader.biSize        = Marshal.SizeOf(bmi);
                    bmi.bmiHeader.biWidth       = /*32;*/ bitmapInfo.bmiHeader.biWidth;
                    bmi.bmiHeader.biHeight      = /*32;*/ bitmapInfo.bmiHeader.biHeight;
                    bmi.bmiHeader.biPlanes      = 1;
                    bmi.bmiHeader.biBitCount    = 32;
                    bmi.bmiHeader.biCompression = Win32.BI_RGB;

                    // Extract the color bitmap
                    int nBits = bitmapInfo.bmiHeader.biWidth * bitmapInfo.bmiHeader.biHeight * 32 / 8;
                    GetDIBits(dc, iconInfo.hbmColor, 0, 32, colorBits, ref bmi, Win32.DIB_RGB_COLORS);

                    // Extract the mask bitmap
                    GetDIBits(dc, iconInfo.hbmMask, 0, 32, maskBits, ref bmi, Win32.DIB_RGB_COLORS);

                    // Copy the mask alphas into the color bits
                    for (int i = 0; i < nBits; i++)
                    {
                        colorBits[i + 0] = (byte)(colorBits[i + 0] | ((maskBits[i + 0] != 0) ? 0 : 0xff));
                    }

                    memcpy(pBuffer, colorBits, bitmapInfo.bmiHeader.biWidth * bitmapInfo.bmiHeader.biHeight * 4);

                    byte[] buffer1 = colorBits;

                    for (int y = 0; y < bitmapInfo.bmiHeader.biHeight; y++)
                    {
                        for (int x = 0; x < bitmapInfo.bmiHeader.biWidth; x++)
                        {
                            pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 0] = buffer1[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 2];
                            pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 1] = buffer1[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 1];
                            pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 2] = buffer1[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 0];
                            pBuffer[y * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 3] = buffer1[(bitmapInfo.bmiHeader.biHeight - y - 1) * bitmapInfo.bmiHeader.biWidth * 4 + x * 4 + 3];
                        }
                    }
                }

                DeleteDC(dc);
                DeleteObject(iconInfo.hbmColor);
                DeleteObject(iconInfo.hbmMask);

                IImage resultImage = engine.CreateImage("icon_" + hIcon.ToInt64() + "_" + large, bitmapInfo.bmiHeader.biWidth, bitmapInfo.bmiHeader.biHeight, pBuffer);

                return(resultImage);
            }

            return(null);
        }