Модераторы: Alexeis

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Картинка на кноку в WinCE 
V
    Опции темы
GremlinProg
Дата 4.6.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: нет
Всего: 106



Цитата(Brodyaga @  4.6.2009,  12:39 Найти цитируемый пост)
Если уберу, как мне белый фон тогда убрать при выводе изображения?

пусть ImageList сам построит маску
для этого нужно не создавать список, а загружать его из ресурса, например так:
Код

HIMAGELIST hImageList = ImageList_LoadImage(hInst, MAKEINTRESOURCE(IDB_MYBUTTONIMAGES), 32, 0, RGB(255,255,255), IMAGE_BITMAP, 0);

в ресурсе IDB_MYBUTTONIMAGES при этом должен быть битмап с 32-пиксельными картинками, расположенные горизонтально, друг за другом, а ключ прозрачности задается параметром crMask (в данном случае белый),

либо первым пикселом этого битмапа (при этом нужно еще поставить при загрузке флаг LR_LOADTRANSPARENT, но т.к. в CE флаги к ImageList_LoadImage не поддерживаются, то такой вариант не пройдет)

аналогично и с ImageList_LoadBitmap (только параметров меньше)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Brodyaga
Дата 4.6.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Вроде получилось.. Теперь другая проблема, иконка на кнопке отображается.. а самих очертаний кнопки нет.. мне их вручную рисовать или можно както сначала кнопку отрисовать, а потом уже иконку на ней?

P.S.
Перехватываю сообщение WM_DRAWITEM

Это сообщение отредактировал(а) Brodyaga - 4.6.2009, 13:57
PM MAIL   Вверх
Andrey44
Дата 4.6.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Цитата(Brodyaga @  4.6.2009,  13:08 Найти цитируемый пост)
P.S.
Перехватываю сообщение WM_DRAWITEM

Если рисуешь в WM_DRAWITEM тебе придется отрисовывать все состояния кнопки самому.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Brodyaga
Дата 5.6.2009, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



ясно... а рисовать картинку и картинку со сдвигом(при нажатии), а также очищать область.. это всё как я понимаю в WM_PAINT делать? в связи с этим вопрос... у каждой кнопки свою процедуру делать? или в общей рисовать? как лучше сделать?
PM MAIL   Вверх
Andrey44
Дата 5.6.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Brodyaga, тебе приходит DRAWITEMSTRUCT которая содержит 
ID твоей кнопки и HWND вот проверяй и рисуй на каждой кнопке разное.
Если на каждой кнопке одинаковое, тогда проверять HWND и ID не надо.
Ну а вообще конечно рисовать для каждой кнопки свое как-то не очень, я понимаю одну-две ,а когда их много.......


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Brodyaga
Дата 5.6.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



ну а рисовать то в оконной процедуре кнопки в событии WM_PAINT ?  просто одну процедуру на все кнопки назначить? а как тогда там узнать какой айди и состояние какое?
PM MAIL   Вверх
Andrey44
Дата 5.6.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Brodyaga, У тебя что, для каждой кнопки есть своя оконная процедура?
WM_DRAWITEM надо ловить в окне которое является родителем для твоих кнопок, то окно в котором они находятся.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Brodyaga
Дата 5.6.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

Brodyaga, У тебя что, для каждой кнопки есть своя оконная процедура?

Нет. Но я могу одну на все сделать, а в ней уже смотреть айди кнопки. а где рисовать то? в процедуре кнопки или форму?
Тоесть я не могу догнать механизм...
я думаю так..
- перехватываю в процедуре главного окна сообщение WM_DRAWITEM, запоминаю глобальную структуру LPDRAWITEMSTRUCT и вызываю перерисовку кнопки
- в процедуре кнопки, в событии WM_PAINT в зависимости от глобальной структуры LPDRAWITEMSTRUCT рисовать определённую кнопку и картинку на ней, в определённом состоянии.

так? или я чтото не догоняю?

P.S.
Извините за, может быть, глупые вопросы.. Просто с винапи почти не работал smile
PM MAIL   Вверх
Andrey44
Дата 5.6.2009, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Brodyaga, ты просто не понял.

Цитата(Brodyaga @  5.6.2009,  12:41 Найти цитируемый пост)
перехватываю в процедуре главного окна сообщение WM_DRAWITEM
Правильно.

Цитата(Brodyaga @  5.6.2009,  12:41 Найти цитируемый пост)
запоминаю глобальную структуру LPDRAWITEMSTRUCT и вызываю перерисовку кнопки
- в процедуре кнопки, в событии WM_PAINT
неправильно.
Зачем тебе глобальная структура? Тебе приходит LPDRAWITEMSTRUCT в lParam.
Попробую на примере.
Код

LPDRAWITEMSTRUCT lpdis = reinterpret_cast<LPDRAWITEMSTRUCT>lParam;
if(lpdis->CtlType==ODT_BUTTON)
{
   if(lpdis->itemID==idButton1)
   {
      //draw image
   }
   if(lpdis->itemID==idButton2)
   {
      //draw image
   }
}




--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Emura
Дата 5.6.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: нет
Всего: 1



Brodyaga, по мне так быстрее и полезнее для опыта будет создание своего контрола кнопки, благо делать то там почти нечего - отрисовывать в WM_PAINT, да клики отлавливать. в этом случае кнопка это окно со своей процедурой. остается создавать объекты, делов то. smile 

Это сообщение отредактировал(а) Emura - 5.6.2009, 13:02
PM   Вверх
Brodyaga
Дата 5.6.2009, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Цитата

Brodyaga, по мне так быстрее и полезнее для опыта будет создание своего контрола кнопки, благо делать то там почти нечего - отрисовывать в WM_PAINT, да клики отлавливать. в этом случае кнопка это окно со своей процедурой. остается создавать объекты, делов то. smile 

Хочу это добить smile

Цитата

Зачем тебе глобальная структура? Тебе приходит LPDRAWITEMSTRUCT в lParam.
Попробую на примере.
    
Код

LPDRAWITEMSTRUCT lpdis = reinterpret_cast<LPDRAWITEMSTRUCT>lParam;
if(lpdis->CtlType==ODT_BUTTON)
{
   if(lpdis->itemID==idButton1)
   {
      //draw image
   }
   if(lpdis->itemID==idButton2)
   {
      //draw image
   }
}




так я так и делал сначала.. но рисовать то всё надо же в WM_PAINT?
между состояниями кнопки(нажата, отжата) мне надо область кнопки очищать, так как картинка для нажатой кнопки немного смещается.
а очищение почемуто не работало:
Код

GetWindowRect(drawItemStruct->hwndItem,&rect);
                                    
hBrush=CreateSolidBrush(GetBkColor(hdc));
                                    
FillRect(hdc,&rect,hBrush);


вот я и подумал, что не работает из-за того, что рисую не в WM_PAINT и решил в WM_DRAWITEM Invalidate вызывать, чтобы рисовать уже в WM_PAINT.
Или можно рисовать и в WM_DRAWITEM? Тогда почему очистка не работает?
PM MAIL   Вверх
Brodyaga
Дата 5.6.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



Извините, понял свой косяк.

Надо было не так прямоугольник рисовать, я получал кнопку относительно всего диалогового окна, а надо было просто размеры:
Код

GetClientRect(drawItemStruct->hwndItem,&rect);

вот так!

Сейчас вроде работает как надо!

Andrey44,GremlinProg спасибо! +1!
PM MAIL   Вверх
Andrey44
Дата 5.6.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: нет
Всего: 26



Цитата(Brodyaga @  5.6.2009,  13:30 Найти цитируемый пост)
Или можно рисовать и в WM_DRAWITEM

Даже нужно, там-же приходит в LPDRAWITEMSTRUCT lpdis->hdc
Цитата(Brodyaga @  5.6.2009,  14:07 Найти цитируемый пост)
Надо было не так прямоугольник рисовать, я получал кнопку относительно всего диалогового окна, а надо было просто размеры:
Ну конечно, вся информация о конроле в LPDRAWITEMSTRUCT



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование мобильных устройств"
Alexeis

Раздел посвящен программированию мобильных устройств.

Все остальные вопросы по мобильным устройствам (КПК, смартфоны, телефоны, фотоаппараты и т.п),
не имеющие отношения к программированию, просьба размещать в разделе КПК, смартфоны, мобильники

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Платформы Windows Mobile и Windows Embedded | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.