Как загрузить значок Windows, используя буфер пикселей? - PullRequest
1 голос
/ 01 марта 2010

Я пытаюсь создать значок, совместимый с Windows, используя пиксельный буфер. Класс Surface загружает изображение и внутренне сохраняет его как неподписанный массив int (0xRRGGBB).

Я пытаюсь создать иконку примерно так:

Surface m_Test("Data/Interface/CursorTest.png");
HICON result = CreateIconFromResourceEx( (PBYTE)m_Test.GetBuffer(), 
                                         m_Test.GetWidth() * m_Test.GetHeight(), 
                                         FALSE, 
                                         0, 
                                         24, 
                                         24, 
                                         LR_DEFAULTCOLOR
);

Однако, result всегда NULL. Я нигде не могу найти, какой формат данных CreateIconFromResourceEx ожидает.

В конечном итоге я хочу загрузить значок из внешнего файла, не используя файлы ресурсов.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Я понял это! Конечный кодез:

// m_Cursors is an array of images coming from an image strip
Pixel* buffer   = m_Cursors[i]->GetBuffer();
int width       = m_Cursors[i]->GetWidth();
int height      = m_Cursors[i]->GetHeight();

HDC dc_andmask = CreateCompatibleDC(dc);
HBITMAP cur_andmask = CreateCompatibleBitmap(dc, width, height);
HBITMAP hOldAndMaskBitmap = (HBITMAP)SelectObject(dc_andmask, cur_andmask);

HDC dc_xormask = CreateCompatibleDC(dc);
HBITMAP cur_xormask = CreateCompatibleBitmap(dc, width, height);
HBITMAP hOldXorMaskBitmap = (HBITMAP)SelectObject(dc_xormask, cur_xormask);

for (int y = 0; y < height; ++y)
{
    for (int x = 0; x < width; ++x)
    {
        Pixel currpix = buffer[x + y * width];

        // the images use the alpha channel for transparancy
        if ((currpix & 0xFF000000) == 0
        {
            // transparant
            SetPixel(dc_andmask, x, y, RGB(255, 255, 255));
            SetPixel(dc_xormask, x, y, RGB(0, 0, 0));
        }
        else
        {
            COLORREF curr = RGB(currpix & 0xFF0000 >> 16, currpix & 0x00FF00 >> 8, currpix & 0x0000FF);

            // opaque
            SetPixel(dc_andmask, x, y, RGB(0, 0, 0));
            SetPixel(dc_xormask, x, y, curr);
        }
    }
}

// i don't know why this has to be done, but it fixes things
// so who cares (b ")b
SelectObject(dc_andmask, hOldAndMaskBitmap);
SelectObject(dc_xormask, hOldXorMaskBitmap);

DeleteObject(dc_xormask);
DeleteObject(dc_andmask);

ICONINFO temp = { FALSE, m_OffsetX[i], m_OffsetY[i], cur_andmask, cur_xormask };
m_CursorIDs[i] = CreateIconIndirect(&temp);

Ответы [ 2 ]

0 голосов
/ 02 марта 2010

Используйте CreateIcon, если вы хотите передать необработанные байтовые данные из маски AND и XOR.

Если вместо этого вы хотите использовать HBITMAP s, вы можете использовать CreateIconIndirect. Используя этот API, вы даже можете создавать иконки с альфа-каналом , если хотите.

0 голосов
/ 01 марта 2010

Взгляните на этот класс, взятый из koders.com

Предоставляет методы для

LPICONRESOURCE ReadIconFromICOFile( LPCTSTR szFileName )

и

LPICONRESOURCE ReadIconFromEXEFile( LPCTSTR szFileName )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...