Проблема с иконками (
От: maxforme Россия  
Дата: 02.12.09 06:00
Оценка:
Здравствуйте!
Мне необходимо грузить иконки из файлов, пишу на VS2005 C++
1. Пробовал HICON сохранять в *.ico через COM с функциями OleCreatePictureIndirect, OleSavePictureFile итд... Не совсем получается ( сохраняет в 256 цветов иль может чуть больше ( а мне то надо HiColor
2. Пробовал HICON сохранять в *.ico через API BitmapToDIB, ConvertDIBFormat, итд, но тут возникает другая проблема.
Цвета получаются нормальные, но по краям иконки появляется рябь, тк маска глубиной 1bpp (

вопрос1. в иконке маска может быть с глубиной больше 1bpp? или прозрачность достигается за счет альфа канала картинки?
вопрос2. возможно ли вообще нормально сохранить из HICON в *.ico с прозрачностью
вопрос3. как это сделать минуя HICON, используя ресурсы EXE\DLL, тк они там хранятся в виде RT_GROUP_ICON (

PS очень жду помощи тк замучался уже (
Re: Проблема с иконками (
От: Aniskin  
Дата: 03.12.09 19:40
Оценка: 3 (1)
Здравствуйте, 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 (

Формат хранения иконок в ресурсах не сильно отличается от формата стандартной иконки.
Re[2]: Проблема с иконками (
От: maxforme Россия  
Дата: 04.12.09 03:34
Оценка:
использую этот код чтобы грузить иконки из ресурсов
но грузится только первая ( а мне нужно перебрать все (

подскажите в чем проблема


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;
                
        //
}
Re[3]: Проблема с иконками (
От: Аноним  
Дата: 07.12.09 09:01
Оценка:
Здравствуйте, 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 — Вам в помощь.
Re[4]: Проблема с иконками (
От: maxforme Россия  
Дата: 09.12.09 03:52
Оценка:
А>EnumResourceTypes - Вам в помощь.

Проблема то не в этом была... Уже неважно.

Переписал всё дело с использованием ExtractAssociatedIcon
Получаю HICON и сохраняю его в ICO с прозрачностью

PS если кому нужно попозже могу выложить
PSS надо использовать AlphaBlend
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.