Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

AppendMenu и BITMAP

243
25 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Занчится так: насколько мне удалось разобраться, функция AppendMenu должна принимать последний параметр в виде хэндла загруженного
рисунка если в ней указан флаг MF_BITMAP. Пишу код:
 
Код:
h_bitmap =(HBITMAP) LoadImage(h_inst, "picture.bmp", IMAGE_BITMAP,n_dimensions * 2,n_dimensions, LR_LOADFROMFILE);
    AppendMenu( GetMenu(win), MF_BITMAP, IDM_Bitmap,h_bitmap);

Компилятор (VC++ 6.0) выдает что не может преобразовать "HBITMAP__*" в "const char*". Т.е. как будто в вызове функции не указан флаг MF_BITMAP.
Что сделано неправильно?
406
26 июня 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by pacific_7
Занчится так: насколько мне удалось разобраться, функция AppendMenu должна принимать последний параметр в виде хэндла загруженного
рисунка если в ней указан флаг MF_BITMAP. Пишу код:
 
Код:
h_bitmap =(HBITMAP) LoadImage(h_inst, "picture.bmp", IMAGE_BITMAP,n_dimensions * 2,n_dimensions, LR_LOADFROMFILE);
    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);

243
26 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by vitaly2003s
При чем тут 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 несколько поменялись стандарты?

406
26 июня 2005 года
vitaly2003s
481 / / 27.07.2004
В МСДН все правильно написано. Тебе ошибку выдал компилятор,и ему пофиг какие ты параметры и флаги передаеш в данную функцию ему важно чтобы ты передаал праильные параметры указанные в прототипе данной функции из заголовочного файла,а в прототипе жестко указан что тот то параметр является таким то типом (в данном случае LPCSTR). Соответственно передавая в данную функцию все что не относится к LPCSTR необходимо делать преобразование,ну а по сути ты передаеш всего лиш адрес,что строки что хэндла картинки,а функция уже при исполнении смотрит на флаги и интерпретирует данную переменную - адрес либо как картинку либо как строку используя.
А насчет глючности примеров,обычно это бывает из за того что они написаны для Cи компиляторов а ты используеш С++ компилятор,да и в самой МСДН встречаются такие корявые примеры,не обращяй внимание.
243
27 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by vitaly2003s
В МСДН все правильно написано. Тебе ошибку выдал компилятор,и ему пофиг...


Спасибо. Уже сам понял - все ж не совсем чайник :).

Цитата:
Originally posted by vitaly2003s

А насчет глючности примеров,обычно это бывает из за того что они написаны для Cи компиляторов а ты используеш С++ компилятор,


Пожалуй тут не в компилере дело - ведь нарушена хронология событий: сперва в меню добавляется рисунок, а потом происходит собственно создание и привязка меню. Бред!

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

243
27 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Активное окно:
243
27 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Не активное окно:
406
27 июня 2005 года
vitaly2003s
481 / / 27.07.2004
Попробуй следующий код со своими значениями,ниче при этом не исчезает,а у тебя не знаю че ты там понаписал,покажи свой код,а пока посмотри на мой пример:

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);
243
28 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Да в общем - все то же самое у меня и написано:
 
Код:
h_bit_help=(HBITMAP) LoadImage(h_inst, "help.bmp", IMAGE_BITMAP,n_dimensions * 4 ,n_dimensions, LR_LOADFROMFILE);
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. Может в этом все дело?
406
28 июня 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by pacific_7
Да в общем - все то же самое у меня и написано:
 
Код:
h_bit_help=(HBITMAP) LoadImage(h_inst, "help.bmp", IMAGE_BITMAP,n_dimensions * 4 ,n_dimensions, LR_LOADFROMFILE);
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 хотя это не зависит так от системы как ты думаеш. Дай лучше сюда архив с исходным кодом а я посмотрю что можно сделать.

243
28 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by vitaly2003s
У меня XP хотя это не зависит так от системы как ты думаеш.


ХЕЗ на счет системы, давай испытаем :)

406
29 июня 2005 года
vitaly2003s
481 / / 27.07.2004
Цитата:
Originally posted by pacific_7
ХЕЗ на счет системы, давай испытаем :)



Короче разобрался я в чем дело. Просто меню не поддерживает 24 битный картинки,необходимо использовать 16 или 256 цветные картинки,либо для 24 ьитных делать собственную прорисовку (OWNERDRAW) меню,что я для тебя здесь и зделал. Теперь все работает корректно,смотри в исходник.

243
29 июня 2005 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by vitaly2003s
Короче разобрался я в чем дело. Просто меню не поддерживает 24 битный картинки,необходимо использовать 16 или 256 цветные картинки,либо для 24 ьитных делать собственную прорисовку (OWNERDRAW) меню,что я для тебя здесь и зделал. Теперь все работает корректно,смотри в исходник.


Спасибо, разобрался. Только пожалуй ты перестарался - зря все за меня сделал :) Мне лучше, когда я сам разбираюсь, нужно только ткнуть куда смотреть, а то я без понятия был.
В любом случае - спасибо.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог