Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Нужна срочная помощь по графическим API !!! Добавлено: 26.10.04 19:17  

Автор вопроса:  Comanche
Мне нужно создать пустую иконку 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
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #1 Добавлено: 26.10.04 19:27
СТОП! похоже, я поторопился бить тревогу. Если результат функции BitmapToIcon отобразить в системном "трее", то моя проблема действительно наблюдается. А вот если где-нибудь ещё (например, пульнуть в панель статус-бара с помощью сообщения SB_SETICON) - то с цветами всё в порядке.

Выходит, причина моей проблемы в том, что системный "трей" не поддерживает большие цветности?!

А кто-нибудь знает, какова максимальная цветность иконок в трее? полазил в MSDN - ничего не нашёл, хотя такая информация просто обязана там быть!

Ответить

Номер ответа: 2
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #2 Добавлено: 26.10.04 22:16
VB не поддерживает иконки больше 16ти цветов

Ответить

Номер ответа: 3
Автор ответа:
 shareman



Вопросов: 11
Ответов: 37
 Профиль | | #3 Добавлено: 26.10.04 22:59
Comanche
Если бы все было так просто и решалось одной функцией...
Послал тебе пример на мыло, должен пригодиться.

Ответить

Номер ответа: 4
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #4 Добавлено: 26.10.04 23:20
2Noviks:
VB не поддерживает иконки больше 16ти цветов

Чушь! Где ты такое вычитал? давай-ка ссылку на MSDN или иной ресурс...

Ответить

Номер ответа: 5
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #5 Добавлено: 26.10.04 23:22
2shareman:
я ничего не получил :((

Ответить

Номер ответа: 6
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #6 Добавлено: 26.10.04 23:36
2shareman:
однако, Mail.Ru запихал твоё письмо в папку "Спам" :))

Спасибо, завтра буду разбираться!

Ответить

Номер ответа: 7
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #7 Добавлено: 27.10.04 11:54
Вопрос пока не снят. Нашёл решение - но оно на C++, а я в нём - как свинья в апельсинах :)) Вот ссылка: http://www.codeproject.com/shell/systray24code.asp

Там всё в исходниках. Поможете разобраться? Мне нужно всего лишь найти "изюминку" этого проекта, позволяющую обойти ограничение цветности иконок в трее.

Ответить

Номер ответа: 8
Автор ответа:
 Comanche



Вопросов: 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
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #9 Добавлено: 28.10.04 08:31
Что значит где взять? CreateDC !

Ответить

Номер ответа: 10
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #10 Добавлено: 28.10.04 13:06
Читал API Guide по этой функции. Можно создать DC только типа ";DISPLAY" или "PRINTER". Ну и как мне тут получить жёстко 256-цветный DC?!

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам