
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Прикреплённая картинка
Не могу понять, почему самодельные иконки (которые сам нарисовал в фотошопе и сконвертировал в ico через Ico Converter) не прорисовываются в тулбаре на винде 7 и 8, а на десятке всё нормально, посмотрите прикрепленный скриншот (слева на вин-10, справа на вин-7). Хотя те же самые иконки нормально прорисовываются в окне буферов А и В ниже тулбара. Может кто подскажет почему так? Добавлено Почему-то несколько картинок прикрепилось... |
Сообщ.
#2
,
|
|
|
Можешь сделать синтетический пример с одним только тулбаром и выложить сюда?
|
Сообщ.
#3
,
|
|
|
Цитата Timon K @ Не могу понять, почему самодельные иконки (которые сам нарисовал в фотошопе и сконвертировал в ico через Ico Converter) не прорисовываются в тулбаре на винде 7 и 8 InitCommonControls() использовал ? |
Сообщ.
#4
,
|
|
|
Цитата Majestio @ Можешь сделать синтетический пример с одним только тулбаром и выложить сюда? Т.е. оставить часть своего кода без всего остального? Наверное смогу, но только как быстро, вот вопрос... Добавлено Цитата ЫукпШ @ InitCommonControls() использовал ? Нет |
Сообщ.
#5
,
|
|
|
Цитата ЫукпШ @ InitCommonControls() использовал ? Только тогда уж InitCommonControlsEx() |
Сообщ.
#6
,
|
|
|
Цитата Majestio @ Только тогда уж InitCommonControlsEx() Завтра на работе смогу попробовать, т.к. дома нет компьютеров со старой виндой. Но вот вопрос - почему иконка с дискетой (сохранение) работает без проблем? На скриншоте видно, что она полностью прорисована и там и там, да ещё и как в активном, так и выключенном состоянии. |
Сообщ.
#7
,
|
|
|
Какой размер у этих иконок? См. GetSystemMetrics(SM_CXICON / SM_CYICON)
|
Сообщ.
#8
,
|
|
|
Цитата macomics @ Какой размер у этих иконок? 16х16 |
Сообщ.
#9
,
|
|
|
Цитата Timon K @ Но вот вопрос - почему иконка с дискетой (сохранение) работает без проблем? На скриншоте видно, что она полностью прорисована и там и там, да ещё и как в активном, так и выключенном состоянии. Я вспомнил, начинал я когда-то проект на Си, но потом как-то забросил. Осталось на уровне заготовки. Сейчас проверил - у меня под виндой и 7, и 10 - все отрисовывается норм. Выглядит это пока так: Прикреплённая картинка
В общем, прикрепляю проект - полазь, посмотри, может чего интересного найдешь. Обрати внимание на то, как и что я написал в своей функции InitialiseCommonControls(). Прикреплённый файл ![]() Да, этот проект я собирал под MSYS2. А там GNU-шниые компиляторы. Поэтому, если под майкрософтскими компиляторам будет на что-то ругаться - просто удали, ну или найди соответствующее решение-замену. Хотя, там из этого только __attribute__((unused)) вроде. |
Сообщ.
#10
,
|
|
|
Применение InitCommonControlsEx() не помогло от слова совсем. Ничего не изменилось, к сожалению.
Сделал прям как в примере Majestio Попробовал подставить иконку, вытащенную из shell32 dll, она отображается нормально. Такое ощущение, что неправильно отображаются только мои самодельные иконки. Рисую неправильно? Ставлю только цвета, только совместимые с интернетом. |
Сообщ.
#11
,
|
|
|
Ниже мой код по созданию тулбара. Может какой стиль или ещё что-то упущено?
![]() ![]() HWND createToolBar(MY_GL_STR* myGlobData) { INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(INITCOMMONCONTROLSEX); icc.dwICC = ICC_BAR_CLASSES; InitCommonControlsEx(&icc); const DWORD dwStyle = WS_CHILD | WS_VISIBLE | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT | TBSTYLE_LIST; const UWORD nBut{ 14 }; // количество кнопок(иконок). Линии тоже считаются HWND hTb; UINT i{ 0 }; static TBBUTTON but[nBut]; WCHAR txtBufA[] = TEXT("A"), txtBufB[] = TEXT("B"); if (myGlobData->hImgList) return 0; myGlobData->hImgList = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, nBut, 0); // Информация о кнопках but[i++].fsStyle = BTNS_SEP; but[i].iBitmap = I_IMAGENONE; but[i].idCommand = 0; but[i].fsState = 0; but[i].fsStyle = BTNS_SHOWTEXT & 0 | BTNS_AUTOSIZE; but[i++].iString = (INT_PTR)&txtBufA; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgOp, NULL); but[i].idCommand = CM_FOPENA; but[i].fsState = 0; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgSa, NULL); but[i].idCommand = CM_FSAVEA; but[i].fsState = 0; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgDe, NULL); but[i].idCommand = CM_FCLEARA; but[i].fsState = 0; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i++].fsStyle = BTNS_SEP; but[i].iBitmap = I_IMAGENONE; but[i].idCommand = 0; but[i].fsState = 0; but[i].fsStyle = BTNS_SHOWTEXT | BTNS_AUTOSIZE; but[i++].iString = (INT_PTR)&txtBufB; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgOp, NULL); but[i].idCommand = CM_FOPENB; but[i].fsState = 0; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgSa, NULL); but[i].idCommand = CM_FSAVEB; but[i].fsState = 0; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgDe, NULL); but[i].idCommand = CM_FCLEARB; but[i].fsState = TBSTATE_MARKED; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i++].fsStyle = BTNS_SEP; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgSe, NULL); but[i].idCommand = CM_SSETTINGS; but[i].fsState = TBSTATE_ENABLED; but[i++].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; but[i++].fsStyle = BTNS_SEP; but[i].iBitmap = ImageList_AddIcon((HIMAGELIST)myGlobData->hImgList, (HICON)myGlobData->hImgHe, NULL); but[i].idCommand = CM_HHELP; but[i].fsState = TBSTATE_ENABLED; but[i].fsStyle = TBSTYLE_BUTTON | BTNS_AUTOSIZE; hTb = CreateToolbarEx(myGlobData->hWndMainW, dwStyle, ID_TOOLBAR, 0, HINST_COMMCTRL, IDB_STD_SMALL_COLOR, but, nBut, 0, 0, 0, 0, sizeof(TBBUTTON)); //IDB_STD_LARGE_COLOR if (!hTb) return 0; SendMessage(hTb, TB_SETIMAGELIST, 0, (LPARAM)myGlobData->hImgList); return hTb; } |
Сообщ.
#12
,
|
|
|
Цитата Timon K @ Такое ощущение, что неправильно отображаются только мои самодельные иконки. Рисую неправильно? Попробуй перерисовать иконки в другом редакторе. Хотя, можешь для теста прислать 2 иконки - которая норм отображается (из shell32 dll) и твою "неправильную" - присоедини их тут. Интересно. |
Сообщ.
#13
,
|
|
|
Открыть и с корзинкой это мои, они искажаются, с дискеткой на помню где взял, наверное готовый был, выглядит отлично везде.
Прикреплённый файл ![]() Прикреплённый файл ![]() Прикреплённый файл ![]() |
Сообщ.
#14
,
|
|
|
![]() ![]() $ hexdump -C Save.ico 00000000 00 00 01 00 01 00 10 10 00 00 01 00 04 00 28 01 |..............(.| 00000010 00 00 16 00 00 00 28 00 00 00 10 00 00 00 20 00 |......(....... .| 00000020 00 00 01 00 04 00 00 00 00 00 80 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000040 00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00 |................| 00000050 80 00 80 00 80 00 00 80 80 00 c0 c0 c0 00 80 80 |................| 00000060 80 00 ff 00 00 00 00 ff 00 00 ff ff 00 00 00 00 |................| 00000070 ff 00 ff 00 ff 00 00 ff ff 00 ff ff ff 00 00 00 |................| 00000080 00 00 00 00 00 00 00 11 18 88 88 81 11 00 01 99 |................| 00000090 97 11 ff 71 19 10 01 99 9f 11 ff 71 19 10 01 99 |...q.......q....| 000000a0 9f 11 ff 71 19 10 01 99 97 f7 7f 71 19 10 01 99 |...q.......q....| 000000b0 99 99 99 99 99 10 01 99 99 99 99 99 99 10 01 9f |................| 000000c0 ff ff ff ff f9 10 01 9f ff ff ff ff f9 10 01 9f |................| 000000d0 f7 77 77 7f f9 10 01 9f ff ff ff ff f9 10 01 9f |.ww.............| 000000e0 f7 77 77 7f f9 10 01 9f ff ff ff ff f9 10 00 17 |.ww.............| 000000f0 77 77 77 77 71 00 00 00 00 00 00 00 00 00 ff ff |wwwwq...........| 00000100 00 00 c0 03 00 00 80 01 00 00 80 01 00 00 80 01 |................| 00000110 00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01 |................| * 00000130 00 00 80 01 00 00 c0 03 00 00 ff ff 00 00 |..............| 0000013e $ hexdump -C eraseA.ico 00000000 00 00 01 00 01 00 10 10 00 00 00 00 20 00 c5 00 |............ ...| 00000010 00 00 16 00 00 00 89 50 4e 47 0d 0a 1a 0a 00 00 |.......PNG......| 00000020 00 0d 49 48 44 52 00 00 00 10 00 00 00 10 08 06 |..IHDR..........| 00000030 00 00 00 1f f3 ff 61 00 00 00 01 73 52 47 42 00 |......a....sRGB.| 00000040 ae ce 1c e9 00 00 00 04 67 41 4d 41 00 00 b1 8f |........gAMA....| 00000050 0b fc 61 05 00 00 00 09 70 48 59 73 00 00 0e c3 |..a.....pHYs....| 00000060 00 00 0e c3 01 c7 6f a8 64 00 00 00 5a 49 44 41 |......o.d...ZIDA| 00000070 54 38 4f ad 8d c9 0d c0 30 0c c3 bc 53 f6 9f 2d |T8O.....0...S..-| 00000080 fd a8 ca 01 97 70 01 13 d0 27 a2 9c f8 62 c6 98 |.....p...'...b..| 00000090 7b f4 5c e7 d7 81 5b ae 46 f3 86 03 2d 64 3f 50 |{.\...[.F...-d?P| 000000a0 34 5b 64 12 45 b3 c5 5e dc 12 75 86 24 ea 0c 49 |4[d.E..^..u.$..I| 000000b0 d4 19 92 a8 33 24 51 67 48 a2 ce bc 45 35 9a 9d |....3$QgH...E5..| 000000c0 64 62 16 e9 1d 44 3c 3a 22 1c f2 1d eb d6 40 00 |db...D<:".....@.| 000000d0 00 00 00 49 45 4e 44 ae 42 60 82 |...IEND.B`.| 000000db Скрытый текст Формат ваших иконок отличается от формата используемого в виндовс (до обновления). Ваши иконки это PNG файлы внутри ICO, а винде нужны простые BMP. |
Сообщ.
#15
,
|
|
|
macomics, спасибо за пояснение, никогда бы до такого не додумался. Но опять же вопрос - а почему ровно эти же иконки корректно отображаются вне тулбара? И второй - как тогда сделать иконку по старым "понятиям"? Конвертировать рисунок из bmp? Но в нём нет прозрачности...
|
Сообщ.
#16
,
|
|
|
Цитата Timon K @ И второй - как тогда сделать иконку по старым "понятиям"? Конвертировать рисунок из bmp? Но в нём нет прозрачности... Повторюсь - ищи редактор с возможностью нормальных вариантов сохранения. И второй момент, протестируй мои варики: Прикреплённый файл ![]() Прикреплённый файл ![]() |
Сообщ.
#17
,
|
|
|
Majestio, завтра попробую, спасибо.
|
Сообщ.
#18
,
|
|
|
Цитата Timon K @ Majestio, завтра попробую, спасибо. Гуд, если все прокатит - а оно прокатит, то тебе понадобится норм редактор ICO. И он у меня есть. Но тут присоединить не могу - инсталляха в архиве весит 5 метров. А форум такое не позволяет аттачить. Поэтому шли мне в приват свое мыло - туда вышлю. |
Сообщ.
#19
,
|
|
|
Цитата Timon K @ о опять же вопрос - а почему ровно эти же иконки корректно отображаются вне тулбара? И второй - как тогда сделать иконку по старым "понятиям"? Конвертировать рисунок из bmp? Так это обновление работы с контейнером ICO. Просто старые библиотеки в Windows 7 и, по моему, даже в 8 не умеют с такими работать. Изначально все иконки содержали только пиксели или индексы с палитрой (т.е. обычный формат BMP). Только недавно туда стали пихать PNG, SVG и даже JPEG или GIF (без анимации). А иконки и не поддерживают прозрачность. Для прозрачности там используется цвет пикселя [0, 0] как transparent color. И вот только иконки с PNG начали работать с прозрачностью. |
Сообщ.
#20
,
|
|
|
Цитата macomics @ А иконки и не поддерживают прозрачность. Ошибочное заявление, низя так! ![]() Прежде, чем писать такие свои заявления - желательно прокачивать свои "убеждения", протестить. Уточнение. Но только на счет 16-битного цвета ICO. Остальное ищите сами: Цитата В 16-битном цвете формат ICO использует 5 бит на красный, 6 бит на зеленый и 5 бит на синий (RGB565). Прозрачность в этом формате реализуется с помощью альфа-канала, который позволяет задавать уровень прозрачности для каждого пикселя. Однако стоит отметить, что в 16-битных значках поддержка альфа-канала может быть ограниченной, и часто используется 1-битная маска для указания прозрачных областей. Это означает, что пиксели могут быть либо полностью прозрачными, либо полностью непрозрачными, без промежуточных значений прозрачности. Диавол кроется в мелочах! ![]() |
Сообщ.
#21
,
|
|
|
Цитата Majestio @ Уточнение. Но только на счет 16-битного цвета ICO. Остальное ищите сами: Это и называется transporent color. Я все верно сказал. Посчитаем: 5+6+5=16 - где еще 1 бит на альфу? А его нету. Просто один из 65536 цветов является полностью прозрачным. Это не прозрачность как таковая, а просто маска, где нет отрисовки пикселя. |
Сообщ.
#22
,
|
|
|
Цитата macomics @ Это и называется transporent color. Я все верно сказал. Увы - нет. В "нормальных" форматах прозрачность - это "отдельный канал" (альфа канал). Тут, в плане ICO-формата, это явный костыль, и такого нет. Хотя есть исключение - и я могу привести пример!!! Гляди: Прикреплённая картинка
Цитата macomics @ Это не прозрачность как таковая, а просто маска, где нет отрисовки пикселя. Вот тут ты прав. И об этом я писал в цитате выше. |
Сообщ.
#23
,
|
|
|
Цитата Majestio @ Цитата macomics @ Это и называется transporent color. Я все верно сказал. Увы - нет. В "нормальных" форматах прозрачность - это "отдельный канал" (альфа канал). Тут, в плане ICO-формата, это явный костыль, и такого нет. Хотя есть исключение - и я могу привести пример!!! Гляди: Прикреплённая картинка
Цитата macomics @ Это не прозрачность как таковая, а просто маска, где нет отрисовки пикселя. Вот тут ты прав. И об этом я писал в цитате выше. И что вы там показали. 16 цветов это не 16-бит. 16 цветов это 4 бита (16 значений), а 16-бит это 65536 значений. Для 16 цветов тоже может быть сохранена битовая маска, но все эти форматы (до 256 цветов) это форматы с палитрами т.е. таблицами преобразования индексов в цвет формата 24-бита. Иными словами у вас в файле будет записан массив из (для вашего случая) 16 цветов по 24 бита на каждый и сама матрица изображения будет состоять из 16*16 = 256 пикселей по 4 бит т.е. по 8 байт на строку и 128 байт всего. Итого все это будет занимать (16*24 + 16*16*4) / 8 = 176 байт. При этом даже в таком виде в матрицу изображения допустимо сохранить второе изображение битового трафарета (transparent color image). Т.е. выбрать один из 16 цветов, который не использован в изображении и считать его полностью прозрачным. Добавлено Если сам ICO файл не используется как контейнер, а хранит данные в декларированных форматом правилах, тогда это просто BMP со слегка измененными BITMAPCOREHEADER и BITMAPCOREINFO. И вот в этих форматах используются только RGBTRIPPLE структуры для описания цвета (т.е. 24-бита без альфа канала, что и означает, что он не поддерживается). Но т.к. прозрачность у иконок была востребована еще во времена первых графических систем, то и её надо было как-то реализовывать. Есть вариант иконок со второй матрицей трафаретом в монохромном формате для прозрачности. Но чаще (во времена 95 виндовс) стали использовать наложенную матрицу трафарета. Т.е. иконку с 1 полностью прозрачным цветом. А вот современные иконки все чаще используют другую возможность ICO формата. Используются как контейнеры и сохраняют внутри как BMP 4 и 5 версии с поддержкой 32-битных цветов (с альфа каналом) или GIF/JPEG форматы для сжатия больших матриц или даже SVG (векторный формат) для трафаретов, а при использовании PNG так и вовсе появляется возможность сохранения изображений со сжатием и в форматах пикселей до 48-бит на пиксел (а может и больше - надо посмотреть что там у PNG, но это самое большое, что я использовал). |
Сообщ.
#24
,
|
|
|
Цитата macomics @ И что вы там показали. 16 цветов это не 16-бит. 16 цветов это 4 бита (16 значений), а 16-бит это 65536 значений. ![]() Ну это же прописные истины. А по всему остальному ответу могу сказать одно - ICO это контейнер, т.к. хранит множество изображений. Другой вопрос - как хранит. В предыдущем своем ответе я написал первое попавшееся по поиску описание хранение изображений. Но, конечно, это неправильный подход! Правильно - это найти спецификации формата ICO, вплоть до последней действующей версии. Но есть и второй вопрос - а все ли версии формата ICO поддерживает этот комконтрол-либа из венды? Тут тоже нужно заняться поиском уже спецификации по комконтролам, и что они там поддерживают. |
Сообщ.
#25
,
|
|
|
Цитата Timon K @ как тогда сделать иконку по старым "понятиям"? Конвертировать рисунок из bmp? Но в нём нет прозрачности... Можно вообще делать иконки программно в памяти - внутри твоего приложения. (Это точно, я такое сам делал) Понятно, что изображение должно быть достаточно простым. Иначе процесс рисования будет сложным. Ключевая WINAPI функция - "CreateIconIndirect" При создании иконки используется основное изображение иконки и формируется битмэп - "маска". Которая укажет, где будет "прозрачность". Эти битмэпы передаются CreateIconIndirect - у. Как-то так. |
Сообщ.
#26
,
|
|
|
Цитата Majestio @ А по всему остальному ответу могу сказать одно - ICO это контейнер, т.к. хранит множество изображений. И вот теперь посмотрите на содержимое Save.ico, где в этом самом контейнере лежат данные BMP, но без заголовка этого самого BMP (нет сигнатуры BM), как в случае с размещением BMPv4 или BMPv5. Тогда они туда будут помещаться с заголовками и работать как контейнер с альфа каналом и в 32bpp. А в Save.ico как раз лежат данные в исходном варианте как в спецификации ICO. Такой загружается напрямую без COM - поэтому и работает. |
Сообщ.
#27
,
|
|
|
Цитата Majestio @ Гуд, если все прокатит - а оно прокатит, то тебе понадобится норм редактор ICO. И он у меня есть. Но тут присоединить не могу - инсталляха в архиве весит 5 метров. А форум такое не позволяет аттачить. Поэтому шли мне в приват свое мыло - туда вышлю. Да, ваши иконки отображаются как надо. Запрошу у вас редактор. Добавлено Majestio, не могу зайти в ваш профиль, что бы дать свой адрес. Добавлено Флуд-контроль, однако. Отправил своё мыло. |
Сообщ.
#28
,
|
|
|
Majestio, получил, спасибо, завтра буду пробовать.
|
Сообщ.
#29
,
|
|
|
Цитата Timon K @ Majestio, получил, спасибо, завтра буду пробовать. В скором времени Валера (Vot) наладит способы заливок более объемных архивов. Я тебе тогда залью еще один редактор. Он менее удобный по интерфейсу, но более функциональный по современным требованиям. В частности, там можно будет формировать "полный" набор размеров, вплоть до "Big Size" последних уиндофс. Ждём Валеру. ЗЫ: Тот редактор, что я тебе отправил ... считай, по совместимости Windows 7 и менее, если можно так сказать. |
Сообщ.
#30
,
|
|
|
Majestio, что ж, да, ждём Валеру
![]() Добавлено Кстати, а кто-нибудь знает, куда делось моё предыдущее сообщение со словами благодарности участникам данной темы? |
Сообщ.
#31
,
|
|
|
Еще один редактор ICQ
Прикреплённый файл ![]() |
Сообщ.
#32
,
|
|
|
Цитата Timon K @ Кстати, а кто-нибудь знает, куда делось моё предыдущее сообщение со словами благодарности участникам данной темы? ![]() ![]() |