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

Поиск:

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


Опытный
**


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

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



Всем доброго времени суток! Подскажите кто знает.. как всётакие добавить картинку на кнопку в WinCE средствами WinApi ???
PM MAIL   Вверх
Andrey44
Дата 1.6.2009, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Самый простой способ - 
Код

#define BUTTON_SIZE 16
hButton=CreateWindowEx(0, _T("button"), 0, WS_CHILD | WS_VISIBLE
            |  BS_ICON, 0, 0,  BUTTON_SIZE, BUTTON_SIZE, hWnd, (HMENU)ID_BUTTON,
                hInstance, NULL);
        SendMessage(hButton, BM_SETIMAGE, (WPARAM)IMAGE_ICON,
            (LPARAM)::LoadImage(hInstance, MAKEINTRESOURCE(ID_ICON), IMAGE_ICON, BUTTON_SIZE, BUTTON_SIZE, LR_DEFAULTCOLOR));


Добавлено через 2 минуты и 17 секунд
Да, вместо BS_ICON можно использовать BS_BITMAP 
тогда вместо (WPARAM)IMAGE_ICON пишем (WPARAM)IMAGE_BITMAP


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


Опытный
**


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

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



Пытался уже както так сделать.. всё бы хорошо да сообщения BM_SETIMAGE нету в WinCE.
PM MAIL   Вверх
Andrey44
Дата 1.6.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Тогда лови  WM_DRAWITEM и рисуй на кнопке картинку.


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


Эксперт
****


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

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



если тип контрола не принципиален, то используй STATIC
у него есть и STM_SETIMAGE
и уведомление STN_CLICKED


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


Опытный
**


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

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



Цитата

Тогда лови  WM_DRAWITEM и рисуй на кнопке картинку.

а по подробнее можно?

Цитата

если тип контрола не принципиален, то используй STATIC
у него есть и STM_SETIMAGE
и уведомление STN_CLICKED

попробую
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



При создании кнопки задаешь ей стиль BS_OWNERDRAW 
В своем приложении ловишь WM_DRAWITEM 
Тебе приходит 
Цитата(MSDN)
This message is sent to the owner window of an owner-drawn button or menu when a visual aspect of the button or menu has changed. 

WM_DRAWITEM idCtl = (UINT) wParam; 
  lpdis = (LPDRAWITEMSTRUCT) lParam;

Цитата(MSDN)

This structure provides information that the owner window must have to determine how to paint an owner-drawn control or menu item.

typedef struct tagDRAWITEMSTRUCT { 
  UINT CtlType; 
  UINT CtlID; 
  UINT itemID; 
  UINT itemAction; 
  UINT itemState; 
  HWND hwndItem; 
  HDC hDC; 
  RECT rcItem; 
  ULONG_PTR itemData; 
} DRAWITEMSTRUCT; 


Но цитировать весь мсдн я не могу, так что смотри и я думаю разберешься.
Будут вопросы спрашивай.



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


Опытный
**


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

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



GremlinProg, чтото не получается...
Пробовал так:
Код

    HANDLE handle;

    handle=LoadImage(hInstance, (LPCWSTR)IDI_ICON1, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
    SendMessage(GetDlgItem(hDlg,IDC_STATIC1),STM_SETIMAGE,(WPARAM)handle, NULL);


и так...

Код

    HANDLE handle;

    handle=LoadImage(hInstance, (LPCWSTR)IDI_ICON1, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
    SendMessage(GetDlgItem(hDlg,IDC_STATIC1),STM_SETIMAGE,(WPARAM)IMAGE_ICON, (LPARAM)handle);


Просто нашёл несколько примеров где по разному сделано..
ни так ни так не работает :(
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В handle что-то есть? Он не нулевой?
ПРосто смущает строка (LPCWSTR)IDI_ICON1
Может лучше MAKEINTRESOURCE(ID_ICON1)

Добавлено через 48 секунд
Цитата(Brodyaga @  2.6.2009,  07:26 Найти цитируемый пост)
HANDLE handle;
    handle=LoadImage(hInstance, (LPCWSTR)IDI_ICON1, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
    SendMessage(GetDlgItem(hDlg,IDC_STATIC1),STM_SETIMAGE,(WPARAM)handle, NULL);

Вот так не правильно


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


Опытный
**


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

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



Цитата

Цитата(Brodyaga @  2.6.2009,  07:26 Найти цитируемый пост)
HANDLE handle;
    handle=LoadImage(hInstance, (LPCWSTR)IDI_ICON1, IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR);
    SendMessage(GetDlgItem(hDlg,IDC_STATIC1),STM_SETIMAGE,(WPARAM)handle, NULL);

Вот так не правильно

это взял отсюда, где чел утверждает что картинка на кнопку у него таким макаром поставилась..

Цитата

В handle что-то есть? Он не нулевой?

нет не нулевой

Цитата

ПРосто смущает строка (LPCWSTR)IDI_ICON1
Может лучше MAKEINTRESOURCE(ID_ICON1)

так тоже не пустой и не работает.
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Brodyaga, а покажите как вы создаете статик?
У него hwnd тоже не нулевой? Его видно вообще?


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


Опытный
**


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

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



Цитата

Brodyaga, а покажите как вы создаете статик?
У него hwnd тоже не нулевой? Его видно вообще?


просто кидаю на диалог.. Да сам текст статика видно.
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну так ему-же надо стиль поставить что-бы рисунок отображался


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


Эксперт
****


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

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



Цитата(Andrey44 @  2.6.2009,  10:53 Найти цитируемый пост)
Ну так ему-же надо стиль поставить что-бы рисунок отображался

да, стиль поставить надо
либо SS_BITMAP, либо SS_ICON, либо включить соответствующий эквивалент флага в редакторе ресурсов
подробнее по стилям: http://msdn.microsoft.com/en-us/library/aa923260.aspx


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


Опытный
**


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

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



Так спасибо.. и первым и вторым способом получилось... наверное всётаки буду использовать WM_DRAWITEM с кнопкой... Теперь проблема другая.. отобразить то мне нужно именно PNG. А получилось отобразить только BMP. Можно ли вообще както PNG в ресурсы загнать?
PM MAIL   Вверх
GremlinProg
Дата 2.6.2009, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



загнать-то можно, без проблем, а вот рисовать PNG - тут уже варианты разные,
определись сначала чем будешь рисовать


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


Опытный
**


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

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



ну то что загнать как биты можно это я знаю.. мне какраз то и надо КАК и ЧЕМ рисовать узнать smile а чем можно? smile
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



GDI+ можно smile


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


Опытный
**


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

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



а ещё чем?
PM MAIL   Вверх
Andrey44
Дата 2.6.2009, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Brodyaga @  2.6.2009,  10:51 Найти цитируемый пост)
а ещё чем? 

Я больше не знаю smile 


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


Эксперт
****


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

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



Цитата(Brodyaga @  2.6.2009,  12:51 Найти цитируемый пост)
а ещё чем?

http://www.libpng.org/
http://homepage3.nifty.com/ysflight/pngdec...ngdecodere.html
http://www.google.com/search?hl=ru&cli...PNG&spell=1
http://www.google.com/search?hl=ru&cli...&lr=lang_ru
вариантов разных библиотек не мало


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


Эксперт
***


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

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



Цитата(GremlinProg @  2.6.2009,  11:06 Найти цитируемый пост)
http://www.libpng.org/
http://homepage3.nifty.com/ysflight/pngdec...ngdecodere.html
http://www.google.com/search?hl=ru&cli...PNG&spell=1
http://www.google.com/search?hl=ru&cli...&lr=lang_ru
вариантов разных библиотек не мало 

Много, но зачем?  smile 


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


Эксперт
****


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

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



очевидно, чтобы всегда был выбор )

есть еще другие варианты

OLE, IImgCtx (IE), DirectX, MSO-фильтры, Direct3D: варианты http://forum.vingrad.ru/index.php?showtopi...t&p=1760087



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


Эксперт
***


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

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



Цитата(GremlinProg @  2.6.2009,  11:33 Найти цитируемый пост)

очевидно, чтобы всегда был выбор )
есть еще другие варианты
OLE, IImgCtx (IE), DirectX, MSO-фильтры, Direct3D: варианты http://forum.vingrad.ru/index.php?showtopi...t&p=1760087

Но ведь GDI+ проще всего мне кажется.


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


Эксперт
****


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

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



Цитата(Andrey44 @  2.6.2009,  13:38 Найти цитируемый пост)
Но ведь GDI+ проще всего мне кажется.

смысл множества решений не в том, что проще, а в том, что нужно для конкретной задачи, в конкретном случае
если вариантов много, есть из чего выбирать, в том числе - возможность тасовать решения, зависимые от данного


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


Эксперт
***


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

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



GremlinProg, ход мысли понятен. smile 


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


Опытный
**


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

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



Цитата

Но ведь GDI+ проще всего мне кажется.


А в CE есть GDI+ ? smile))

Отсюда:
Цитата

Недостатки: На сегодняшний момент реализован только в WindowsXP. Хотя простое копирование gdiplus.dll в system32 делает ее доступной, как минимум, в Windows2000. Скорее всего, в обозримом будущем ожидаются версии и для Win9x.


Это сообщение отредактировал(а) Brodyaga - 2.6.2009, 13:03
PM MAIL   Вверх
Brodyaga
Дата 3.6.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашёл тут кое какие исходники.. Но никак не могу откомпилить :( у когонить получалось?
PM MAIL   Вверх
Andrey44
Дата 3.6.2009, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Brodyaga, какие ошибки пишет?


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


Опытный
**


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

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



Сначала писал чтото типа
Код

Error    27    error C2668: 'log' : ambiguous call to overloaded function    d:\png__jpg__etc_on_pocketpc_src\cximage_pocketpc\cximage\ximadsp.cpp    1169    


Там в некоторых местах используются log(2) надо поменять на log(2.0)

Ладно, исправил... под Win32 скомпилилось. Поменял проект на MIPS(ИЛИ ARM, без разницы)

Стал ругаца на
Код

Error    1    Could not generate command line for the 'VCCLCompilerTool' tool.    png

Исправил изменением C/C++->General->DebugInformationFormat=4 поменять на /Zi. Ошибка исправилась. Но это он видать меня дразнил..smile после этого выдал ошибок 300 типа:
Код

Error    3    fatal error C1083: Cannot open include file: 'sys/types.h': No such file or directory    d:\png__jpg__etc_on_pocketpc_src\cximage_pocketpc\png\pngconf.h    246    
Error    18    error C2146: syntax error : missing ';' before identifier 'ContextRecord'    C:\Program Files\Windows CE Tools\wce500\STANDARDSDK_500\include\MIPSII\winnt.h    2975    
Error    19    error C4430: missing type specifier - int assumed. Note: C++ does not support default-int    C:\Program Files\Windows CE Tools\wce500\STANDARDSDK_500\include\MIPSII\winnt.h    2975    
Error    217    error C2146: syntax error : missing ';' before identifier 'LPCONTEXT'    C:\Program Files\Windows CE Tools\wce500\STANDARDSDK_500\include\MIPSII\winbase.h    1405    
Error    121    error C2040: 'PCONTEXT' : '_CONTEXT *' differs in levels of indirection from 'int'    C:\Program Files\Windows CE Tools\wce500\STANDARDSDK_500\include\MIPSII\excpt.h    63    
Error    377    fatal error C1083: Cannot open include file: 'errno.h': No such file or directory    d:\png__jpg__etc_on_pocketpc_src\cximage_pocketpc\zlib\zutil.h    26    

и другие... типа ошибки в winnt... вообщем муть какаято! сами не пробовали эти исходники скомпилить?

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


Эксперт
***


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

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



Brodyaga, а может лучше рисовать иконки на кнопке? Ведь намного проще.
Или тебе именно надо PNG?


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


Опытный
**


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

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



Цитата

Brodyaga, а может лучше рисовать иконки на кнопке? Ведь намного проще.
Или тебе именно надо PNG?


Мне надо png на кнопке.. дизайнер нарисовал png. Правда можно его БОЛЕЕ МЕНЕЕ сконвертить в bmp, но хреново получица :( да и потом весь интерфейс походу png-шный будет..

Вообще я решил всётаки разобраца с либпнг.. там хоть длл и либа есть готовые скопилинные.. :( может примерчик использования найдёца? 

Нашёл вот как на двумерный массив bit разобрать пример. А собрать из этого bmp или иконку какнить можно?

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


Эксперт
****


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

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



Цитата(Brodyaga @  3.6.2009,  12:14 Найти цитируемый пост)
А собрать из этого bmp или иконку какнить можно?

можно, только нужно каждую строку выровнить на 2-х байтовой границе (паддинг заполнить нулями),
для CE: http://msdn.microsoft.com/en-us/library/ms959923.aspx


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


Опытный
**


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

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



Так это получается у меня будет обычная БМП без прозрачности и т.д.? Тоесть просто нарисуется сконверченная пнг в бмп?
PM MAIL   Вверх
GremlinProg
Дата 3.6.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Brodyaga @  3.6.2009,  12:39 Найти цитируемый пост)
Так это получается у меня будет обычная БМП без прозрачности и т.д.?

ну, тут надо смотреть документацию по твоей библиотеке

32-битный цветовой ключ содержит четыре компоненты: голубой, зеленый, красный + еще одну, которая может использоваться для прозрачности

если библиотека заполняет эту компоненту, то прозрачности можно добиться в таком битмапе через AlphaBlend: http://msdn.microsoft.com/en-us/library/aa452850.aspx

правда, только с пятой серсии CE

Добавлено через 5 минут и 35 секунд
но можно и без этого обойтись, по крайней мере для фоновой прозрачности, если знать ключ прозрачности

тут принцип простой: создаем монохромный битмап по этому ключу, после чего маскируем исходный битмап по полученной маске, вобщем это уже решалось много раз, источников хватает, если что, думаю проблемы не будет применить это на CE, т.к. вариантов маскирования битмапов достаточно, какой-нибудь да подойдет


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


Опытный
**


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

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



Цитата

ну, тут надо смотреть документацию по твоей библиотеке

32-битный цветовой ключ содержит четыре компоненты: голубой, зеленый, красный + еще одну, которая может использоваться для прозрачности

если библиотека заполняет эту компоненту, то прозрачности можно добиться в таком битмапе через AlphaBlend: http://msdn.microsoft.com/en-us/library/aa452850.aspx

правда, только с пятой серсии CE

Добавлено через 5 минут и 35 секунд
но можно и без этого обойтись, по крайней мере для фоновой прозрачности, если знать ключ прозрачности

тут принцип простой: создаем монохромный битмап по этому ключу, после чего маскируем исходный битмап по полученной маске, вобщем это уже решалось много раз, источников хватает, если что, думаю проблемы не будет применить это на CE, т.к. вариантов маскирования битмапов достаточно, какой-нибудь да подойдет

ну ведь в пнг есть и полупрозрачность а в битмапе этого ведь никак не добиться...
PM MAIL   Вверх
GremlinProg
Дата 3.6.2009, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Brodyaga @  3.6.2009,  13:58 Найти цитируемый пост)
ну ведь в пнг есть и полупрозрачность а в битмапе этого ведь никак не добиться...

я про битмап и говорю: http://www.rsdn.ru/article/gdi/trsimple.xml

Добавлено через 2 минуты и 22 секунды
смотри по ссылке реализацию "альфа-канала"


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


Опытный
**


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

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



Цитата

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

Сложности возникнут вот с чем. Мне неизвестен ни один графический пакет, позволяющий сохранять растры с альфа-каналом в формате, пригодном для AlphaBlend(). При создании такого растра программно мы можем сохранить его на диск (в формате Windows Bitmap 32-bit). Он прочитывается популярными программами типа ACDSee, но функции LoadBitmap() и LoadImage() отказываются его загружать. При попытке поместить его в ресурс rc.exe у меня вывалился с сообщением Internal error...

Но унывать не стоит. Мы можем подготовить растр в памяти, скомбинировав, например, два растра - с изображением объекта и его тени. 


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


Эксперт
***


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

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



Цитата(Brodyaga @  3.6.2009,  14:35 Найти цитируемый пост)
могут ли какието программи в него сконвертить из пнг ?

Можно пнг сконвертировать в иконку и рисовать иконки. Или обязательно нужны именно пнг?


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


Опытный
**


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

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



Не обязательно.. просто есть только пнг... но и сконвертить НОРМАЛЬНО в ико не получается... какието кваратики на пустом месте появляются... а иконки(*.ико) бывают с полупрозрачностью?
PM MAIL   Вверх
GremlinProg
Дата 3.6.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Brodyaga @  3.6.2009,  16:35 Найти цитируемый пост)
А безконвертирования растров можно шденить получить растр подготовленный для выхода? могут ли какието программи в него сконвертить из пнг ?

http://students.uni-vologda.ac.ru/pages/pm01/kps/maps.htm
это еще вариант для установки альфа-канала на основе scanline 
т.е. с использованием SetDIBits и SetDIBitsToDevice
посмотри, может найдешь готовую оболочку (по крайней мере по ссылке вырисовывается класс Bitmap)


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


Опытный
**


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

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



чот я там не вижу функции SetDIBits.. и почему у функции CreateBitmap всего два параметра и созданный битмап нигде не сохраняется и не заполняется..

Кстати libpng не нашёл собранной для 5-ой CE... на сайте только для 4 есть. ПОэтому с ним не получица похоже :(

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


Опытный
**


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

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



Вообщем хрен с этим пнг.. сконвертил в кореле его в бмп.. вроде норм сконвертилось, на фоне белого цвета... следую инструкциям указанным тут сделал способом номер 2 (через TransparentBlt).
Но у меня много кнопок, удобнее было бы через ИмэджЛист, а вот с помощью него не работает :( Что я не так делаю:

Код

    HIMAGELIST hImageList=ImageList_Create(32,32,ILC_COLOR24|ILC_MASK,1,0);

    hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));

    ImageList_Add(hImageList,hBitmap,(HBITMAP)RGB(255,255,255));

    ImageList_Draw(hImageList,0,hdc,0,0,ILD_TRANSPARENT);


Картинка рисуется с белым фоном... он не убирается.. почему? уже по всякому перепробовал..
PM MAIL   Вверх
GremlinProg
Дата 4.6.2009, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Brodyaga @  4.6.2009,  09:56 Найти цитируемый пост)
чот я там не вижу функции SetDIBits.. 

судя по этому циклу:
Код

for (int j = 0; j < cy; j++)
    {
        png_read_row(png_ptr, row, NULL);
        CopyRGBtoBGRA(GetScanLine(j), row, width);
    }


используется именно эти функции
Цитата(Brodyaga @  4.6.2009,  09:56 Найти цитируемый пост)
и почему у функции CreateBitmap всего два параметра и созданный битмап нигде не сохраняется и не заполняется.

это же не API,
это обертка над ней
Цитата(Brodyaga @  4.6.2009,  11:44 Найти цитируемый пост)
ImageList_Add(hImageList,hBitmap,(HBITMAP)RGB(255,255,255));

неправильно, третий параметр должен быть именно монохромным битмапом, если список создается с флагом ILC_MASK

либо генерируй маску, либо убери флаг ILC_MASK


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


Опытный
**


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

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



Цитата

либо генерируй маску, либо убери флаг ILC_MASK


Если уберу, как мне белый фон тогда убрать при выводе изображения?
PM MAIL   Вверх
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.1045 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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