Проблема с меню. Помогите кто нибудь.

Общие вопросы, не зависящие от языка реализации.

Модераторы: Duncon, Hawk, Romeo, Eugie

Ответить
silvianamateush
Сообщения: 5
Зарегистрирован: 11 ноя 2007, 23:07

Добрый день.
Дело в том что я студентка.
У меня лаба по меню.
Мне надо создать всплывающее меню. В котором рядом с тестом будет находится картинка. Которая должна хранится в ImageList.
Вот кодик.
HBITMAP Bit=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAPA));
imageList=ImageList_Create(16,16,ILC_COLOR32,2,10);
ImageList_Add(imageList,Bit,0);
DeleteObject(hBitmap);
Bit=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAPB));
ImageList_Add(imageList,Bit,0);
DeleteObject(hBitmap);
HMENU hmenu=CreatePopupMenu();
MENUITEMINFO menuInfo;
ZeroMemory(&menuInfo,sizeof(MENUITEMINFO));
IMAGEINFOInfo;
for(int iter=0; iter<2;iter++)
{
ImageList_GetImageInfo(imageList,iter,&Info);
menuInfo.fMask=MIIM_BITMAP|MIIM_STRING| MIIM_DATA|MIIM_ID ;
menuInfo.fType=MFT_BITMAP|MFT_STRING;
menuInfo.cbSize=sizeof(MENUITEMINFO);
menuInfo.wID=i;
menuInfo.fState=MFS_ENABLED;
menuInfo.hbmpItem=imageInfo.hbmImage;
menuInfo.dwTypeData="status";
menuInfo.cch=strlen("status");
InsertMenuItem(hmenu,i,true,&menuInfo);
}
TrackPopupMenu(hmenu,TPM_RIGHTALIGN,TPM_RETURNCMD,0,0,hwndDlg,NULL);
DestroyMenu(hmenu);

Но почемуто кодик не работает. :(
Вернее текст появляется а какртинка нет :(
Помогите пожалуйста блондинке.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

См. MSDN:

The MFT_BITMAP, MFT_SEPARATOR, and MFT_STRING values cannot be combined with one another.
...
MFT_BITMAP is replaced by MIIM_BITMAP and hbmpItem.
...
MFT_STRING is replaced by MIIM_STRING.
Попробуй так:

Код: Выделить всё

    
for(int iter=0; iter<2;iter++)
{
    ImageList_GetImageInfo(imageList,iter,&Info);     
    menuInfo.cbSize=sizeof(MENUITEMINFO);
    [b]menuInfo.fMask=MIIM_BITMAP | MIIM_STRING | MIIM_STATE | MIIM_ID;[/b]
    menuInfo.wID=i;
    menuInfo.fState=MFS_ENABLED;
    menuInfo.hbmpItem=Info.hbmImage;
    menuInfo.dwTypeData="status";
    menuInfo.cch=strlen("status");
    InsertMenuItem(hmenu,i,true,&menuInfo);
}
silvianamateush
Сообщения: 5
Зарегистрирован: 11 ноя 2007, 23:07

К сожалению ничего не выходит. :(
Может у кого - то есть рабочий примерчик.
Поделитесь пожалуйста.
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Попробуй так:

Код: Выделить всё

 
   <..>
   menuInfo.hbmpItem=HBMMENU_SYSTEM;
   <..>
Если иконка появится (стандартная иконка Windows), тогда смотри, что получаешь в GetImageInfo. Если нет, попробуй сначала создать текстовое меню, потом с помощью SetMenuItemInfo подключи иконки.
silvianamateush
Сообщения: 5
Зарегистрирован: 11 ноя 2007, 23:07

Так вроде картинки теперь показываются.
Но есть одна проблема. У меня картинка 16X16 а показывается только 13X13.
Как это поправить.
Вот невезет с одним разобралась так другое теперь. :confused:
Eugie
Сообщения: 708
Зарегистрирован: 17 фев 2004, 23:59
Откуда: SPb

Либо используй StretchBlt() чтобы подогнать свои битмапы под стандартный размер (его можно узнать с помощью GetSystemMetrics(), параметры SM_CXMENUCHECK, SM_CYMENUCHECK), либо задавай fType = MFT_OWNERDRAW и рисуй все сама. Как это делается - см. в MSDN, там и примеры есть.
Ответить