Страница: 1 |
Вопрос: Нужна срочная помощь по графическим API !!! | Добавлено: 26.10.04 19:17 |
Автор вопроса: ![]() |
Мне нужно создать пустую иконку 16х16 px, взяв за основу битмап, созданный в виртуальном контексте (в приведённых ниже фрагментах кода все API-декларации опускаю для краткости):
mDC = CreateCompatibleDC(GetDC(GetDesktopWindow)) mBitmap = CreateCompatibleBitmap(GetDC(GetDesktopWindow), 16&, 16&) SelectObject mDC, mBitmap ' создаю битмап посредством BitBlt из нескольких пикчербоксов: ' (впрочем, для моего вопроса это не так уже и важно) retVal = BitBlt(mDC, 0, 0, w / 2, h, picSource(0).hDC, 0, 0, vbSrcCopy) retVal = BitBlt(mDC, w/2, 0, w / 2, h, picSource(1).hDC, 0, 0, vbSrcCopy) retVal = BitBlt(mDC, 0, 0, w, h, picSource(3).hDC, 0, 0, vbSrcAnd) Виртуальный битмап готов - если его вывести куда-нибудь для просмотра (в файл, в пикчербокс - неважно), то я увижу то, что и хотел получить: 16-битную картинку (65536 цветов). Пока до проблемы (и до вопроса) ещё не дошли :) Теперь мне надо превратить mBitmap в ИКОНКУ (так того требуют условия решаемой задачи). Использую для этих целей вот такую функцию: Public Function BitmapToIcon(ByVal hBmp As Long) As Long Dim ii As ICONINFO, hMask As Long hMask = CreateBitmap(16, 16, 1, 4, ByVal 0&) With ii .hbmColor = hBmp .hbmMask = hMask .fIcon = 1 .xHotspot = 8 .yHotspot = 8 End With BitmapToIcon = CreateIconIndirect(ii) DeleteObject hMask End Function В качестве аргумента я передаю ей, естественно, созданный ранее mBitmap. Код этой функции я дёрнул где-то в Сети. Увы, вызов CreateBitmap написан в ней так, что создаёт битмап-маску (hMask) 16-цветную :-(( В результате, последующий вызов CreateIconIndirect коверкает мой чудесный битмап mBitmap - из 65536 цветов делает 16. И иконка получается, разумеется, убогая - картинка летит к чёрту при цветопонижении. ВОПРОС: как нужно переписать функцию BitmapToIcon, чтобы цветность "входного" битмапа не понижалась при преобразовании в иконку?! чую, что надо менять вызов CreateBitmap при формировании hMask, но как именно - самостоятельно разобраться не смог. ОЧЕНЬ НУЖНА ПОМОЩЬ! |
Ответы | Всего ответов: 10 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #1 | Добавлено: 26.10.04 19:27 |
СТОП! похоже, я поторопился бить тревогу. Если результат функции BitmapToIcon отобразить в системном "трее", то моя проблема действительно наблюдается. А вот если где-нибудь ещё (например, пульнуть в панель статус-бара с помощью сообщения SB_SETICON) - то с цветами всё в порядке.
Выходит, причина моей проблемы в том, что системный "трей" не поддерживает большие цветности?! А кто-нибудь знает, какова максимальная цветность иконок в трее? полазил в MSDN - ничего не нашёл, хотя такая информация просто обязана там быть! |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 192496851 Вопросов: 75 Ответов: 3178 |
Профиль | Цитата | #2 | Добавлено: 26.10.04 22:16 |
VB не поддерживает иконки больше 16ти цветов |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 11 Ответов: 37 |
Профиль | Цитата | #3 | Добавлено: 26.10.04 22:59 |
Comanche
Если бы все было так просто и решалось одной функцией... Послал тебе пример на мыло, должен пригодиться. |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #4 | Добавлено: 26.10.04 23:20 |
2Noviks:
VB не поддерживает иконки больше 16ти цветов
Чушь! Где ты такое вычитал? давай-ка ссылку на MSDN или иной ресурс... |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #5 | Добавлено: 26.10.04 23:22 |
2shareman:
я ничего не получил ![]() |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #6 | Добавлено: 26.10.04 23:36 |
2shareman:
однако, Mail.Ru запихал твоё письмо в папку "Спам" ![]() Спасибо, завтра буду разбираться! |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #7 | Добавлено: 27.10.04 11:54 |
Вопрос пока не снят. Нашёл решение - но оно на C++, а я в нём - как свинья в апельсинах ![]() Там всё в исходниках. Поможете разобраться? Мне нужно всего лишь найти "изюминку" этого проекта, позволяющую обойти ограничение цветности иконок в трее. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #8 | Добавлено: 27.10.04 15:04 |
Всё, вроде бы разобрался.
Win2000 - ограничение на цветность иконок в трее действительно равно 256. Но у меня цветность десктопа = 24 бита, и когда я гружу в пикчербокс 256-цветную bmp-картинку, то пикчербокс "приводит" её к цветности десктопа (как говорят в МСДН, "this behaivor is by design" - т.е. пикчербокс по определению так делает всегда). Вот потом фигня и получается. Т.е. или надо вообще уйти от пикчербоксов, или перед вызовом BitmapToIcon специально понижать цветность mBitmap до 256. Последний вариант - бред: буду просто работать без пикчербоксов на стадии BitBlt. Хотя... можно просто попробовать делать совместимость не с GetDC(GetDesktopWindow), а с каким-нить 256-цветным hDC. Вопрос в том, где б его взять (без пикчербоксов, конечно же)... |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 334781088 Вопросов: 108 Ответов: 2822 |
Профиль | Цитата | #9 | Добавлено: 28.10.04 08:31 |
Что значит где взять? CreateDC ! |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 87 Ответов: 459 |
Профиль | Цитата | #10 | Добавлено: 28.10.04 13:06 |
Читал API Guide по этой функции. Можно создать DC только типа "![]() |
Страница: 1 |
|