AppendMenu и BITMAP
рисунка если в ней указан флаг MF_BITMAP. Пишу код:
AppendMenu( GetMenu(win), MF_BITMAP, IDM_Bitmap,h_bitmap);
Компилятор (VC++ 6.0) выдает что не может преобразовать "HBITMAP__*" в "const char*". Т.е. как будто в вызове функции не указан флаг MF_BITMAP.
Что сделано неправильно?
Занчится так: насколько мне удалось разобраться, функция AppendMenu должна принимать последний параметр в виде хэндла загруженного
рисунка если в ней указан флаг MF_BITMAP. Пишу код:
AppendMenu( GetMenu(win), MF_BITMAP, IDM_Bitmap,h_bitmap);
Компилятор (VC++ 6.0) выдает что не может преобразовать "HBITMAP__*" в "const char*". Т.е. как будто в вызове функции не указан флаг MF_BITMAP.
Что сделано неправильно?
При чем тут MF_BITMAP? Тебе компилятор же говорит что он не может преобразовать тип с HBITMAP в LPCSTR. Используй явное преобразование:
AppendMenu( GetMenu(win), MF_BITMAP, IDM_Bitmap,(LPCSTR)h_bitmap);
При чем тут MF_BITMAP?
В MSDN'е написано:
lpNewItem
Specifies the content of the new menu item. The interpretation of lpNewItem depends on whether the uFlags parameter includes the MF_BITMAP, MF_OWNERDRAW, or MF_STRING flag, as follows:
Value Description
MF_BITMAP Uses a bitmap as the menu item. The lpNewItem parameter contains the handle to the bitmap.
Вот я и думал, что он должен понять, что ему передали картинку, а не строку. Про преобразования там ничего не написано, а самому показалось как-то неразумно преобразовывать хэндл картинки в указатель на строку. Теперь разобрался - работает.
Главное не в этом. Начал я изучать win32API по книжке Румянцева "Азбука программирования в win32 API". Приведенные строчки кода оттуда. И они не работают! Еще баг, в этой же программе-примере: данная картинка должна загружаться при получении окном сообщения WM_CREATE, но! Всё опирается на GetMenu(), а как она может взять хэндл меню еще не связанного с окном? Ведь меню связывается с окном после создания окна при помощи SetMenu(), следовательно на момент получения окном сообщения WM_CREATE, у окна нет никакого меню и GetMenu() ничего не может получить! Я прилепил это меню обычным образом - работает нормально. Вопрос: почему в примере написано так коряво?
Это что, книжка такая плохая, или я что-то конкретно недопонимаю? Может от того, что книжица не нова и у MS несколько поменялись стандарты?
А насчет глючности примеров,обычно это бывает из за того что они написаны для Cи компиляторов а ты используеш С++ компилятор,да и в самой МСДН встречаются такие корявые примеры,не обращяй внимание.
В МСДН все правильно написано. Тебе ошибку выдал компилятор,и ему пофиг...
Спасибо. Уже сам понял - все ж не совсем чайник :).
А насчет глючности примеров,обычно это бывает из за того что они написаны для Cи компиляторов а ты используеш С++ компилятор,
Пожалуй тут не в компилере дело - ведь нарушена хронология событий: сперва в меню добавляется рисунок, а потом происходит собственно создание и привязка меню. Бред!
Ладно, с этим я удачно разобрался, теперь интересно другое - в прицепленных рисунках одно и то же окно, но в одном случае: оно активно, а в другом - нет. Можно сделать так, что бы рисунки в неактивном варианте окна, не исчезали? Сейчас не важно, но на будущее может пригодиться.
HMENU hm=CreateMenu();
//загружаем картинку ч,важно получить HBITMAP и не важно через какую функцию,я здесь гружу из ресурсов для всех менюшек одинаковую
HBITMAP hbm=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
bool be=InsertMenu(hm,-1,MF_BYPOSITION | MF_BITMAP | MF_ENABLED,1,(LPCSTR)hbm);
be=InsertMenu(hm,-1,MF_BYPOSITION | MF_BITMAP | MF_ENABLED,2,(LPCSTR)hbm);
be=InsertMenu(hm,-1,MF_BYPOSITION | MF_BITMAP | MF_ENABLED,3,(LPCSTR)hbm);
//m_hWnd -HWND окна где должна быть менюшка
SetMenu(m_hWnd,hm);
h_menu=CreateMenu();
InsertMenu( h_menu,-1,MF_BYPOSITION | MF_BITMAP | MF_POPUP,(UINT)h_help_menu,(LPCSTR)h_bit_help);//ваш вариант
//AppendMenu(h_menu, MF_BITMAP| MF_POPUP,(UINT)h_help_menu,(LPCSTR)h_bit_help); - мой вариант
И оба одинакого не работают так как мне хочется :(. От флагов MF_POPUP|MF_ENABLED не зависит - проверял. У вас какая ОС? Я не раз видел, как нормально сделанное в 2000-ной меню выглядело коряво в ХР. У меня ХР SP2. Может в этом все дело?
Да в общем - все то же самое у меня и написано:
h_menu=CreateMenu();
InsertMenu( h_menu,-1,MF_BYPOSITION | MF_BITMAP | MF_POPUP,(UINT)h_help_menu,(LPCSTR)h_bit_help);//ваш вариант
//AppendMenu(h_menu, MF_BITMAP| MF_POPUP,(UINT)h_help_menu,(LPCSTR)h_bit_help); - мой вариант
И оба одинакого не работают так как мне хочется :(. От флагов MF_POPUP|MF_ENABLED не зависит - проверял. У вас какая ОС? Я не раз видел, как нормально сделанное в 2000-ной меню выглядело коряво в ХР. У меня ХР SP2. Может в этом все дело?
Короче все должно работать как с AppendMenu так и с InsertMenu. У меня XP хотя это не зависит так от системы как ты думаеш. Дай лучше сюда архив с исходным кодом а я посмотрю что можно сделать.
У меня XP хотя это не зависит так от системы как ты думаеш.
ХЕЗ на счет системы, давай испытаем :)
ХЕЗ на счет системы, давай испытаем :)
Короче разобрался я в чем дело. Просто меню не поддерживает 24 битный картинки,необходимо использовать 16 или 256 цветные картинки,либо для 24 ьитных делать собственную прорисовку (OWNERDRAW) меню,что я для тебя здесь и зделал. Теперь все работает корректно,смотри в исходник.
Короче разобрался я в чем дело. Просто меню не поддерживает 24 битный картинки,необходимо использовать 16 или 256 цветные картинки,либо для 24 ьитных делать собственную прорисовку (OWNERDRAW) меню,что я для тебя здесь и зделал. Теперь все работает корректно,смотри в исходник.
Спасибо, разобрался. Только пожалуй ты перестарался - зря все за меня сделал :) Мне лучше, когда я сам разбираюсь, нужно только ткнуть куда смотреть, а то я без понятия был.
В любом случае - спасибо.