Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Платформы Windows Mobile и Windows Embedded > Картинка на кноку в WinCE


Автор: Brodyaga 1.6.2009, 08:30
Всем доброго времени суток! Подскажите кто знает.. как всётакие добавить картинку на кнопку в WinCE средствами WinApi ???

Автор: Andrey44 1.6.2009, 08:49
Самый простой способ - 
Код

#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

Автор: 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
Цитата

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

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

Цитата

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

попробую

Автор: Andrey44 2.6.2009, 07:10
При создании кнопки задаешь ей стиль 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; 


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

Автор: Brodyaga 2.6.2009, 07:26
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);


Просто нашёл несколько примеров где по разному сделано..
ни так ни так не работает :(

Автор: Andrey44 2.6.2009, 07:39
В 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);

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

Автор: Brodyaga 2.6.2009, 08:19
Цитата

Цитата(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);

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

это взял http://forum.vingrad.ru/forum/topic-178519.html, где чел утверждает что картинка на кнопку у него таким макаром поставилась..

Цитата

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

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

Цитата

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

так тоже не пустой и не работает.

Автор: Andrey44 2.6.2009, 08:27
Brodyaga, а покажите как вы создаете статик?
У него hwnd тоже не нулевой? Его видно вообще?

Автор: Brodyaga 2.6.2009, 08:31
Цитата

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


просто кидаю на диалог.. Да сам текст статика видно.

Автор: Andrey44 2.6.2009, 08:53
Ну так ему-же надо стиль поставить что-бы рисунок отображался

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

да, стиль поставить надо
либо 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
ну то что загнать как биты можно это я знаю.. мне какраз то и надо КАК и ЧЕМ рисовать узнать smile а чем можно? smile

Автор: Andrey44 2.6.2009, 10:47
GDI+ можно smile

Автор: Brodyaga 2.6.2009, 10:51
а ещё чем?

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

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

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

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: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 

Автор: 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
Цитата(GremlinProg @  2.6.2009,  11:33 Найти цитируемый пост)

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

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

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

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

Автор: Andrey44 2.6.2009, 12:40
GremlinProg, ход мысли понятен. smile 

Автор: Brodyaga 2.6.2009, 13:00
Цитата

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


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

http://www.rsdn.ru/article/files/Classes/InitGdiPlus.xml:
Цитата

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

Автор: 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
Сначала писал чтото типа
Код

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... вообщем муть какаято! сами не пробовали эти исходники скомпилить?

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

Автор: Brodyaga 3.6.2009, 10:14
Цитата

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


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

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

Нашёл вот как на двумерный массив bit разобрать http://zarb.org/~gc/html/libpng.html. А собрать из этого bmp или иконку какнить можно?

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

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

Автор: Brodyaga 3.6.2009, 10:39
Так это получается у меня будет обычная БМП без прозрачности и т.д.? Тоесть просто нарисуется сконверченная пнг в бмп?

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

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

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

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

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

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

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

Автор: Brodyaga 3.6.2009, 11:58
Цитата

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

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

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

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

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

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

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

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

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

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

Автор: Brodyaga 3.6.2009, 14:35
Цитата

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

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

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


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

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

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

Автор: Brodyaga 3.6.2009, 15:13
Не обязательно.. просто есть только пнг... но и сконвертить НОРМАЛЬНО в ико не получается... какието кваратики на пустом месте появляются... а иконки(*.ико) бывают с полупрозрачностью?

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

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).
Но у меня много кнопок, удобнее было бы через ИмэджЛист, а вот с помощью него не работает :( Что я не так делаю:

Код

    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);


Картинка рисуется с белым фоном... он не убирается.. почему? уже по всякому перепробовал..

Автор: GremlinProg 4.6.2009, 09:58
Цитата(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

Автор: Brodyaga 4.6.2009, 10:39
Цитата

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


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

Автор: GremlinProg 4.6.2009, 10:55
Цитата(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 (только параметров меньше)

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

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

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

Если рисуешь в 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
Цитата

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

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

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

P.S.
Извините за, может быть, глупые вопросы.. Просто с винапи почти не работал smile

Автор: Andrey44 5.6.2009, 12:59
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
   }
}


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

Автор: Brodyaga 5.6.2009, 13:30
Цитата

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? Тогда почему очистка не работает?

Автор: Brodyaga 5.6.2009, 14:07
Извините, понял свой косяк.

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

GetClientRect(drawItemStruct->hwndItem,&rect);

вот так!

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

Andrey44,GremlinProg спасибо! +1!

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)