Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / контекстные меню(и не только) / 7 сообщений из 7, страница 1 из 1
09.07.2005, 19:33
    #33158103
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
как сделать, чтобы в меню рядом с командой отображался рисунок 16x16(в CMenu есть метод SetMenuItemBitmaps, но он позволяет прикрепить к команде рисунок 13x13, и когда команда выделена, рисунок оказывается инвертирован). в MSDN я ничего больше не нашел, неужели нельзя написать меню как в том же Internet Explorer?(VC++ 6.0, MFC)
...
Рейтинг: 0 / 0
11.07.2005, 10:45
    #33158845
SeraTJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
Есть такая хорошая вещь, как "owner-draw". Добавляй к item-ам тип MFT_OWNERDRAW, и в дорогу! На WM_DRAWITEM можно рисовать что хочешь.
...
Рейтинг: 0 / 0
11.07.2005, 16:09
    #33159733
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
Никак не могу разобраться с owner-draw.
Помогите кодом, please
...
Рейтинг: 0 / 0
11.07.2005, 16:43
    #33159824
SeraTJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
Код: plaintext
1.
2.
3.
MENUITEMINFO mii;
mii.fMask=MIIM_TYPE|MIIM_ID;
mii.cbSize=sizeof(MENUITEMINFO);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
для каждого i-item-a:
mii.fType=MFT_SEPARATOR;
либо 
mii.fType=MFT_OWNERDRAW;
        
mii.wID=id[i];
InsertMenuItem(hMenu,i,TRUE,&mii);

В окне, которому принадлежит это меню нужно обработать сообщения:
WM_MEASUREITEM and WM_DRAWITEM

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
OnMeasureItem(LPMEASUREITEMSTRUCT lpmis)
{
	lpmis->itemWidth	=  120 ;//длина каждого item-а. Лучше высчитывать динамически длину (найти длину текста в пикселах)
	lpmis->itemHeight	=  18 ;//здесь лучше всего поставить максимум (высота картинок, высота текста)
}

OnDrawItem(LPDRAWITEMSTRUCT pdis)
{
	здесь достаем данные по item-у с id-кой pdis->itemID;
	RECT rc(pdis->rcItem);//это ректангл item-а
	HDC hdc = pdis->hDC;

	DrawText(hdc, ...) .... DrawIconEx... здесь рисуешь, что хочешь
}
...
Рейтинг: 0 / 0
11.07.2005, 16:47
    #33159835
roman10
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
Лучше залезьте на Codeproject.com , там этих меню навалом.
...
Рейтинг: 0 / 0
11.07.2005, 17:41
    #33159969
Slip
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
SeraTJ
Код: plaintext
1.
2.
3.
MENUITEMINFO mii;
mii.fMask=MIIM_TYPE|MIIM_ID;
mii.cbSize=sizeof(MENUITEMINFO);

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
для каждого i-item-a:
mii.fType=MFT_SEPARATOR;
либо 
mii.fType=MFT_OWNERDRAW;
        
mii.wID=id[i];
InsertMenuItem(hMenu,i,TRUE,&mii);

В окне, которому принадлежит это меню нужно обработать сообщения:
WM_MEASUREITEM and WM_DRAWITEM

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
OnMeasureItem(LPMEASUREITEMSTRUCT lpmis)
{
	lpmis->itemWidth	=  120 ;//длина каждого item-а. Лучше высчитывать динамически длину (найти длину текста в пикселах)
	lpmis->itemHeight	=  18 ;//здесь лучше всего поставить максимум (высота картинок, высота текста)
}

OnDrawItem(LPDRAWITEMSTRUCT pdis)
{
	здесь достаем данные по item-у с id-кой pdis->itemID;
	RECT rc(pdis->rcItem);//это ректангл item-а
	HDC hdc = pdis->hDC;

	DrawText(hdc, ...) .... DrawIconEx... здесь рисуешь, что хочешь
}


это конечно здорово, работает и т.д.
а можно сделать то же самое, но меню загружать из ресурса, а не создавать динамически?
...
Рейтинг: 0 / 0
11.07.2005, 18:47
    #33160102
SeraTJ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
контекстные меню(и не только)
Для ресурса MENU (обычного, который создает визард) не получится. Здесь нет атрибута типа "OWNERDRAW". Значит, не получится.

Здесь я вижу два обходных варианта:
1) в ресурсах создать меню. После загрузки меню из ресурсов пробежать по всем, и нужным item-ам добавить тип ownerdraw. Дальше то же. Однако при прорисовке ondrawitem можно вытягивать текст из ресурсов меню, используя id.

2) лично у меня нет такого опыта, но есть смысл попробовать создать ресурс меню вручную, используя:
MENUEX (поищи в msdn-e в index-e).
Здесь можно: Use of the MFT_* type flags and MFS_* state flags.
Но это уже для девелопера: разбираться без примеров - нелегкое дело.
Если получится правильно создать rc-файл, тогда тебе останется только обрабатывать те же ondrawitem, onmeasureitem.

Вперед и Только вперед!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / контекстные меню(и не только) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]