Здравствуйте, maxforme, Вы писали:
M>вопрос1. в иконке маска может быть с глубиной больше 1bpp? или прозрачность достигается за счет альфа канала картинки?
Нет, да.
M>вопрос2. возможно ли вообще нормально сохранить из HICON в *.ico с прозрачностью
Да.
http://www.rsdn.ru/forum/winapi/3488466.flat.aspxАвтор:
Дата: 31.07.09
M>вопрос3. как это сделать минуя HICON, используя ресурсы EXE\DLL, тк они там хранятся в виде RT_GROUP_ICON (
Формат хранения иконок в ресурсах не сильно отличается от формата стандартной иконки.
использую этот код чтобы грузить иконки из ресурсов
но грузится только первая ( а мне нужно перебрать все (
подскажите в чем проблема
HRSRC hRes = FindResource(hLibrary, "#128" , RT_GROUP_ICON);
if (hRes == 0)
return;
//загружаем ресурс
HGLOBAL hMem = LoadResource(hLibrary, hRes);
if (hMem == 0)
return;
//получение указателя на данные
LPVOID lpGroup = LockResource(hMem);
if (lpGroup == 0)
return;
//получаем размер данных
DWORD dwGroupSize = SizeofResource(hLibrary, hRes);
if (dwGroupSize <= 0)
return;
//проверка размера
if (dwGroupSize < sizeof(NEWHEADER))
return;
//копируем данные о главном хедере
NEWHEADER NewHdr;
ZeroMemory(&NewHdr, sizeof(NEWHEADER));
::CopyMemory(&NewHdr, lpGroup, sizeof(NEWHEADER));
//вытаскиваем остальные иконки
//вот в этом цикле и проблема что грузится только первая иконка (
for (int i=0; i < NewHdr.ResCount; i++)
{
RESDIR ResDir;
ZeroMemory(&ResDir, sizeof(RESDIR));
int iSzie = (i * sizeof(RESDIR)) + sizeof(NEWHEADER);
CopyMemory(&ResDir, (BYTE*)lpGroup + iSzie, sizeof(RESDIR));
HRSRC hIconRes = FindResource(hLibrary,
MAKEINTRESOURCE(ResDir.IconCursorId), RT_ICON);
if (hIconRes == 0) continue;
DWORD dwIconSize = SizeofResource(hLibrary, hIconRes);
if (dwIconSize == 0) continue;
HGLOBAL hMemIcon = LoadResource(hLibrary, hIconRes);
if (hMemIcon == 0) continue;
char *cResourcePtr = (char*)LockResource(hMemIcon);
if (lpIcon == 0) break;
//апдейтим
//if (!UpdateResource(h1, RT_ICON,
// MAKEINTRESOURCE(ResDir.IconCursorId), MAKELANGID(LANG_NEUTRAL,
// SUBLANG_NEUTRAL), lpIcon, dwIconSize))
//{
// break;
//
}
Здравствуйте, maxforme, Вы писали:
M>использую этот код чтобы грузить иконки из ресурсов
M>но грузится только первая ( а мне нужно перебрать все (
M>подскажите в чем проблема
M>M>HRSRC hRes = FindResource(hLibrary, "#128" , RT_GROUP_ICON);
M>if (hRes == 0)
M> return;
M>//загружаем ресурс
M>HGLOBAL hMem = LoadResource(hLibrary, hRes);
M>if (hMem == 0)
M> return;
M>//получение указателя на данные
M>LPVOID lpGroup = LockResource(hMem);
M>if (lpGroup == 0)
M> return;
M>//получаем размер данных
M>DWORD dwGroupSize = SizeofResource(hLibrary, hRes);
M>if (dwGroupSize <= 0)
M> return;
M>//проверка размера
M>if (dwGroupSize < sizeof(NEWHEADER))
M> return;
M>//копируем данные о главном хедере
M>NEWHEADER NewHdr;
M>ZeroMemory(&NewHdr, sizeof(NEWHEADER));
M>::CopyMemory(&NewHdr, lpGroup, sizeof(NEWHEADER));
M>//вытаскиваем остальные иконки
M>//вот в этом цикле и проблема что грузится только первая иконка (
M>for (int i=0; i < NewHdr.ResCount; i++)
M>{
M> RESDIR ResDir;
M> ZeroMemory(&ResDir, sizeof(RESDIR));
M> int iSzie = (i * sizeof(RESDIR)) + sizeof(NEWHEADER);
M> CopyMemory(&ResDir, (BYTE*)lpGroup + iSzie, sizeof(RESDIR));
M> HRSRC hIconRes = FindResource(hLibrary,
M> MAKEINTRESOURCE(ResDir.IconCursorId), RT_ICON);
M> if (hIconRes == 0) continue;
M> DWORD dwIconSize = SizeofResource(hLibrary, hIconRes);
M> if (dwIconSize == 0) continue;
M> HGLOBAL hMemIcon = LoadResource(hLibrary, hIconRes);
M> if (hMemIcon == 0) continue;
M> char *cResourcePtr = (char*)LockResource(hMemIcon);
M> if (lpIcon == 0) break;
M> //апдейтим
M> //if (!UpdateResource(h1, RT_ICON,
M> // MAKEINTRESOURCE(ResDir.IconCursorId), MAKELANGID(LANG_NEUTRAL,
M> // SUBLANG_NEUTRAL), lpIcon, dwIconSize))
M> //{
M> // break;
M> //
M>}
M>
EnumResourceTypes — Вам в помощь.