c++ - 如何使用像素缓冲区加载 Windows icon?

  显示原文与译文双语对照的内容
0 0

我正在尝试使用像素缓冲区创建兼容的icon 。 Surface 类加载一个图像并将它的作为无符号的int array 在内部保存。

我正在尝试创建一个类似这样的icon:

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 所需的数据格式。

最终,我希望从外部文件加载 icon,而不使用资源文件。

先谢谢了。

编辑:我想出来了 ! 最后一个 codez:

//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);
时间:原作者:4个回答

0 0

如果你想从and和XOR掩码传递原始字节数据,请使用 CreateIcon

如果你希望能够使用 HBITMAP,你可以使用 CreateIconIndirect 使用这个 API,你甚至可以以使用创建一个图标,如果你愿意的话。

原作者:
0 0

看一下从 koders.com 获取的这个类。

它提供了

LPICONRESOURCE ReadIconFromICOFile( LPCTSTR szFileName )

LPICONRESOURCE ReadIconFromEXEFile( LPCTSTR szFileName )
原作者:
...