| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Платформы Windows Mobile и Windows Embedded > Картинка на кноку в WinCE |
| Автор: Brodyaga 1.6.2009, 08:30 |
| Всем доброго времени суток! Подскажите кто знает.. как всётакие добавить картинку на кнопку в WinCE средствами WinApi ??? |
| Автор: Andrey44 1.6.2009, 08:49 | ||
Самый простой способ -
Добавлено через 2 минуты и 17 секунд Да, вместо BS_ICON можно использовать BS_BITMAP тогда вместо (WPARAM)IMAGE_ICON пишем (WPARAM)IMAGE_BITMAP |
| Автор: Brodyaga 1.6.2009, 09:23 |
| Пытался уже както так сделать.. всё бы хорошо да сообщения BM_SETIMAGE нету в WinCE. |
| Автор: Andrey44 1.6.2009, 09:58 |
| Тогда лови WM_DRAWITEM и рисуй на кнопке картинку. |
| Автор: GremlinProg 1.6.2009, 13:04 |
| если тип контрола не принципиален, то используй STATIC у него есть и STM_SETIMAGE и уведомление STN_CLICKED |
| Автор: Brodyaga 2.6.2009, 06:33 | ||||
а по подробнее можно?
попробую |
| Автор: Andrey44 2.6.2009, 07:10 | ||||
| При создании кнопки задаешь ей стиль BS_OWNERDRAW В своем приложении ловишь WM_DRAWITEM Тебе приходит
Но цитировать весь мсдн я не могу, так что смотри и я думаю разберешься. Будут вопросы спрашивай. |
| Автор: Brodyaga 2.6.2009, 07:26 | ||||
| GremlinProg, чтото не получается... Пробовал так:
и так...
Просто нашёл несколько примеров где по разному сделано.. ни так ни так не работает :( |
| Автор: Brodyaga 2.6.2009, 08:19 | ||||||
это взял http://forum.vingrad.ru/forum/topic-178519.html, где чел утверждает что картинка на кнопку у него таким макаром поставилась..
нет не нулевой
так тоже не пустой и не работает. |
| Автор: Andrey44 2.6.2009, 08:27 |
| Brodyaga, а покажите как вы создаете статик? У него hwnd тоже не нулевой? Его видно вообще? |
| Автор: Brodyaga 2.6.2009, 08:31 | ||
просто кидаю на диалог.. Да сам текст статика видно. |
| Автор: Andrey44 2.6.2009, 08:53 |
| Ну так ему-же надо стиль поставить что-бы рисунок отображался |
| Автор: GremlinProg 2.6.2009, 08:57 |
да, стиль поставить надо либо SS_BITMAP, либо SS_ICON, либо включить соответствующий эквивалент флага в редакторе ресурсов подробнее по стилям: http://msdn.microsoft.com/en-us/library/aa923260.aspx |
| Автор: Brodyaga 2.6.2009, 10:20 |
| Так спасибо.. и первым и вторым способом получилось... наверное всётаки буду использовать WM_DRAWITEM с кнопкой... Теперь проблема другая.. отобразить то мне нужно именно PNG. А получилось отобразить только BMP. Можно ли вообще както PNG в ресурсы загнать? |
| Автор: GremlinProg 2.6.2009, 10:34 |
| загнать-то можно, без проблем, а вот рисовать PNG - тут уже варианты разные, определись сначала чем будешь рисовать |
| Автор: Brodyaga 2.6.2009, 10:42 |
| ну то что загнать как биты можно это я знаю.. мне какраз то и надо КАК и ЧЕМ рисовать узнать |
| Автор: Andrey44 2.6.2009, 10:47 |
| GDI+ можно |
| Автор: Brodyaga 2.6.2009, 10:51 |
| а ещё чем? |
| Автор: Andrey44 2.6.2009, 10:55 |
Я больше не знаю |
| Автор: GremlinProg 2.6.2009, 11:06 |
http://www.libpng.org/ http://homepage3.nifty.com/ysflight/pngdecoder/pngdecodere.html http://www.google.com/search?hl=ru&client=opera&rls=ru&hs=GR4&ei=gdkkSqfYBYLFsgbIgeXWBQ&sa=X&oi=spell&resnum=0&ct=result&cd=1&q=decode+PNG&spell=1 http://www.google.com/search?hl=ru&client=opera&rls=ru&q=%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B0+PNG&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=lang_ru вариантов разных библиотек не мало |
| Автор: Andrey44 2.6.2009, 11:21 | ||
Много, но зачем? |
| Автор: GremlinProg 2.6.2009, 11:33 |
| очевидно, чтобы всегда был выбор ) есть еще другие варианты OLE, IImgCtx (IE), DirectX, MSO-фильтры, Direct3D: варианты http://forum.vingrad.ru/index.php?showtopic=244146&view=findpost&p=1760087 |
| Автор: Andrey44 2.6.2009, 11:38 | ||
Но ведь GDI+ проще всего мне кажется. |
| Автор: GremlinProg 2.6.2009, 12:23 |
смысл множества решений не в том, что проще, а в том, что нужно для конкретной задачи, в конкретном случае если вариантов много, есть из чего выбирать, в том числе - возможность тасовать решения, зависимые от данного |
| Автор: Andrey44 2.6.2009, 12:40 |
| GremlinProg, ход мысли понятен. |
| Автор: Brodyaga 2.6.2009, 13:00 | ||||
А в CE есть GDI+ ? http://www.rsdn.ru/article/files/Classes/InitGdiPlus.xml:
|
| Автор: Brodyaga 3.6.2009, 07:58 |
| Нашёл http://www.codeproject.com/KB/mobile/png__jpg__etc_on_pocketpc.aspx кое какие исходники.. Но никак не могу откомпилить :( у когонить получалось? |
| Автор: Andrey44 3.6.2009, 08:29 |
| Brodyaga, какие ошибки пишет? |
| Автор: Brodyaga 3.6.2009, 09:01 | ||||||
Сначала писал чтото типа
Там в некоторых местах используются log(2) надо поменять на log(2.0) Ладно, исправил... под Win32 скомпилилось. Поменял проект на MIPS(ИЛИ ARM, без разницы) Стал ругаца на
Исправил изменением C/C++->General->DebugInformationFormat=4 поменять на /Zi. Ошибка исправилась. Но это он видать меня дразнил..
и другие... типа ошибки в winnt... вообщем муть какаято! сами не пробовали эти исходники скомпилить? |
| Автор: Andrey44 3.6.2009, 09:55 |
| Brodyaga, а может лучше рисовать иконки на кнопке? Ведь намного проще. Или тебе именно надо PNG? |
| Автор: Brodyaga 3.6.2009, 10:14 | ||
Мне надо png на кнопке.. дизайнер нарисовал png. Правда можно его БОЛЕЕ МЕНЕЕ сконвертить в bmp, но хреново получица :( да и потом весь интерфейс походу png-шный будет.. Вообще я решил всётаки разобраца с либпнг.. там хоть длл и либа есть готовые скопилинные.. :( может примерчик использования найдёца? Нашёл вот как на двумерный массив bit разобрать http://zarb.org/~gc/html/libpng.html. А собрать из этого bmp или иконку какнить можно? |
| Автор: GremlinProg 3.6.2009, 10:37 |
можно, только нужно каждую строку выровнить на 2-х байтовой границе (паддинг заполнить нулями), для CE: http://msdn.microsoft.com/en-us/library/ms959923.aspx |
| Автор: Brodyaga 3.6.2009, 10:39 |
| Так это получается у меня будет обычная БМП без прозрачности и т.д.? Тоесть просто нарисуется сконверченная пнг в бмп? |
| Автор: GremlinProg 3.6.2009, 10:47 | ||
ну, тут надо смотреть документацию по твоей библиотеке 32-битный цветовой ключ содержит четыре компоненты: голубой, зеленый, красный + еще одну, которая может использоваться для прозрачности если библиотека заполняет эту компоненту, то прозрачности можно добиться в таком битмапе через AlphaBlend: http://msdn.microsoft.com/en-us/library/aa452850.aspx правда, только с пятой серсии CE Добавлено через 5 минут и 35 секунд но можно и без этого обойтись, по крайней мере для фоновой прозрачности, если знать ключ прозрачности тут принцип простой: создаем монохромный битмап по этому ключу, после чего маскируем исходный битмап по полученной маске, вобщем это уже решалось много раз, источников хватает, если что, думаю проблемы не будет применить это на CE, т.к. вариантов маскирования битмапов достаточно, какой-нибудь да подойдет |
| Автор: Brodyaga 3.6.2009, 11:58 | ||
ну ведь в пнг есть и полупрозрачность а в битмапе этого ведь никак не добиться... |
| Автор: GremlinProg 3.6.2009, 12:07 | ||
я про битмап и говорю: http://www.rsdn.ru/article/gdi/trsimple.xml Добавлено через 2 минуты и 22 секунды смотри по ссылке реализацию "альфа-канала" |
| Автор: Brodyaga 3.6.2009, 14:35 | ||
А безконвертирования растров можно шденить получить растр подготовленный для выхода? могут ли какието программи в него сконвертить из пнг ? |
| Автор: Andrey44 3.6.2009, 14:48 |
Можно пнг сконвертировать в иконку и рисовать иконки. Или обязательно нужны именно пнг? |
| Автор: Brodyaga 3.6.2009, 15:13 |
| Не обязательно.. просто есть только пнг... но и сконвертить НОРМАЛЬНО в ико не получается... какието кваратики на пустом месте появляются... а иконки(*.ико) бывают с полупрозрачностью? |
| Автор: GremlinProg 3.6.2009, 15:14 | ||
http://students.uni-vologda.ac.ru/pages/pm01/kps/maps.htm это еще вариант для установки альфа-канала на основе scanline т.е. с использованием SetDIBits и SetDIBitsToDevice посмотри, может найдешь готовую оболочку (по крайней мере по ссылке вырисовывается класс Bitmap) |
| Автор: Brodyaga 4.6.2009, 07:56 |
| чот я там не вижу функции SetDIBits.. и почему у функции CreateBitmap всего два параметра и созданный битмап нигде не сохраняется и не заполняется.. Кстати libpng не нашёл собранной для 5-ой CE... на сайте только для 4 есть. ПОэтому с ним не получица похоже :( |
| Автор: Brodyaga 4.6.2009, 09:44 | ||
| Вообщем хрен с этим пнг.. сконвертил в кореле его в бмп.. вроде норм сконвертилось, на фоне белого цвета... следую инструкциям указанным http://www.rsdn.ru/article/gdi/trsimple.xml#ECBAC сделал способом номер 2 (через TransparentBlt). Но у меня много кнопок, удобнее было бы через ИмэджЛист, а вот с помощью него не работает :( Что я не так делаю:
Картинка рисуется с белым фоном... он не убирается.. почему? уже по всякому перепробовал.. |
| Автор: GremlinProg 4.6.2009, 09:58 | ||||
судя по этому циклу:
используется именно эти функции
это же не API, это обертка над ней неправильно, третий параметр должен быть именно монохромным битмапом, если список создается с флагом ILC_MASK либо генерируй маску, либо убери флаг ILC_MASK |
| Автор: Brodyaga 4.6.2009, 10:39 | ||
Если уберу, как мне белый фон тогда убрать при выводе изображения? |
| Автор: GremlinProg 4.6.2009, 10:55 | ||||
пусть ImageList сам построит маску для этого нужно не создавать список, а загружать его из ресурса, например так:
в ресурсе IDB_MYBUTTONIMAGES при этом должен быть битмап с 32-пиксельными картинками, расположенные горизонтально, друг за другом, а ключ прозрачности задается параметром crMask (в данном случае белый), либо первым пикселом этого битмапа (при этом нужно еще поставить при загрузке флаг LR_LOADTRANSPARENT, но т.к. в CE флаги к ImageList_LoadImage не поддерживаются, то такой вариант не пройдет) аналогично и с ImageList_LoadBitmap (только параметров меньше) |
| Автор: Brodyaga 4.6.2009, 13:08 |
| Вроде получилось.. Теперь другая проблема, иконка на кнопке отображается.. а самих очертаний кнопки нет.. мне их вручную рисовать или можно както сначала кнопку отрисовать, а потом уже иконку на ней? P.S. Перехватываю сообщение WM_DRAWITEM |
| Автор: Andrey44 4.6.2009, 14:16 |
Если рисуешь в WM_DRAWITEM тебе придется отрисовывать все состояния кнопки самому. |
| Автор: Brodyaga 5.6.2009, 08:43 |
| ясно... а рисовать картинку и картинку со сдвигом(при нажатии), а также очищать область.. это всё как я понимаю в WM_PAINT делать? в связи с этим вопрос... у каждой кнопки свою процедуру делать? или в общей рисовать? как лучше сделать? |
| Автор: Andrey44 5.6.2009, 08:53 |
| Brodyaga, тебе приходит DRAWITEMSTRUCT которая содержит ID твоей кнопки и HWND вот проверяй и рисуй на каждой кнопке разное. Если на каждой кнопке одинаковое, тогда проверять HWND и ID не надо. Ну а вообще конечно рисовать для каждой кнопки свое как-то не очень, я понимаю одну-две ,а когда их много....... |
| Автор: Brodyaga 5.6.2009, 09:08 |
| ну а рисовать то в оконной процедуре кнопки в событии WM_PAINT ? просто одну процедуру на все кнопки назначить? а как тогда там узнать какой айди и состояние какое? |
| Автор: Andrey44 5.6.2009, 10:31 |
| Brodyaga, У тебя что, для каждой кнопки есть своя оконная процедура? WM_DRAWITEM надо ловить в окне которое является родителем для твоих кнопок, то окно в котором они находятся. |
| Автор: Brodyaga 5.6.2009, 12:41 | ||
Нет. Но я могу одну на все сделать, а в ней уже смотреть айди кнопки. а где рисовать то? в процедуре кнопки или форму? Тоесть я не могу догнать механизм... я думаю так.. - перехватываю в процедуре главного окна сообщение WM_DRAWITEM, запоминаю глобальную структуру LPDRAWITEMSTRUCT и вызываю перерисовку кнопки - в процедуре кнопки, в событии WM_PAINT в зависимости от глобальной структуры LPDRAWITEMSTRUCT рисовать определённую кнопку и картинку на ней, в определённом состоянии. так? или я чтото не догоняю? P.S. Извините за, может быть, глупые вопросы.. Просто с винапи почти не работал |
| Автор: Andrey44 5.6.2009, 12:59 | ||||
| Brodyaga, ты просто не понял. Правильно.
Зачем тебе глобальная структура? Тебе приходит LPDRAWITEMSTRUCT в lParam. Попробую на примере.
|
| Автор: Emura 5.6.2009, 13:01 |
| Brodyaga, по мне так быстрее и полезнее для опыта будет создание своего контрола кнопки, благо делать то там почти нечего - отрисовывать в WM_PAINT, да клики отлавливать. в этом случае кнопка это окно со своей процедурой. остается создавать объекты, делов то. |
| Автор: Brodyaga 5.6.2009, 13:30 | ||||||||
Хочу это добить
так я так и делал сначала.. но рисовать то всё надо же в WM_PAINT? между состояниями кнопки(нажата, отжата) мне надо область кнопки очищать, так как картинка для нажатой кнопки немного смещается. а очищение почемуто не работало:
вот я и подумал, что не работает из-за того, что рисую не в WM_PAINT и решил в WM_DRAWITEM Invalidate вызывать, чтобы рисовать уже в WM_PAINT. Или можно рисовать и в WM_DRAWITEM? Тогда почему очистка не работает? |
| Автор: Brodyaga 5.6.2009, 14:07 | ||
| Извините, понял свой косяк. Надо было не так прямоугольник рисовать, я получал кнопку относительно всего диалогового окна, а надо было просто размеры:
вот так! Сейчас вроде работает как надо! Andrey44,GremlinProg спасибо! +1! |
| Автор: Andrey44 5.6.2009, 14:27 | ||
Даже нужно, там-же приходит в LPDRAWITEMSTRUCT lpdis->hdc
|