Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Рисуем элементы меню


Автор: LerikCo 23.4.2014, 18:49
Доброго времени суток!

Что требуется:
На диалоговом окне (C++, MFC) CMenuTestDlg есть главное и контекстные меню, созданные в редакторе ресурсов.
Необходимо добавить в него иконки и разрисовать элементы в стиле Office2003, т.е. под иконкой фон закрашивать синим, выделенный элемент подсвечивать желто-розовым, обводить рамкой.
Многим (разным) пунктам меню должна соответствовать одна и та же иконка.
Иконки 32-bit хранятся в ресурсах в виде икон (не тулбар!).

Что сделал:
В карту обработчика сообщений диалога добавил
Код
ON_WM_DRAWITEM()
ON_WM_MEASUREITEM()
ON_WM_INITMENUPOPUP()

Ну, естественно, в MenuTestDlg.h диалога добавил
Код
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis);
afx_msg void OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu);
afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpmis);
а в MenuTestDlg.cpp диалога добавил
Код
void CMenuTestDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpdis)
{
    if ((lpdis==NULL)||(lpdis->CtlType != ODT_MENU))
    {
        CDialog::OnDrawItem(nIDCtl, lpdis);
        return; //not for a menu
    }
    //..
}
void CMenuTestDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpmis)
{
     if ((lpmis==NULL)||(lpmis->CtlType != ODT_MENU))
     {
         CDialog::OnMeasureItem(nIDCtl, lpmis); //not for a menu
         return;
     }
     //..
}
void CMenuTestDlg::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu)
{
//..
}

Что получилось:
Функции OnMeasureItem() и OnDrawItem() вызываются, всё нормально. Иконку в OnDrawItem() рисую, проблем нет.
Но не могу рисовать по элементу меню в том месте, где выводится текст.
Во-первых, lpdis->rcItem определяет прямоугольник под иконой. Получить рект всего элемента не знаю как.
Во-вторых, даже задавая рект для всего элемента вручную, вижу только фрагмент отрисовки своего прямоугольника, всё остальное накрывает текст элемента.
В третьих, не понимаю, как различать выделенный и невыделенный элемент меню.

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


ЗЫ: 
Что было прочитано:
http://www.sources.ru/cpp/faqs/74.htm
http://forum.sources.ru/index.php?showtopic=64795
http://forum.sources.ru/index.php?showtopic=26844&hl=
http://forum.sources.ru/index.php?showtopic=31907&hl=
http://www.codeproject.com/Articles/16529/Simple-Menus-That-Display-Icons-Minimalistic-Appro
http://www.codeproject.com/Articles/2354/Owner-Drawn-Menu-with-Icons-Titles-and-Shading
http://www.realcoding.net/articles/glava-12-v-glubine-menyu.html

ЗЗЫ: Не откажусь от уже готового класса, если таковой имеется.

С уважением и надеждой!

Автор: vol4ek 23.4.2014, 19:48
Цитата(LerikCo @  23.4.2014,  18:49 Найти цитируемый пост)
Необходимо добавить в него иконки и разрисовать элементы в стиле Office2003, т.е. под иконкой фон закрашивать синим, выделенный элемент подсвечивать желто-розовым, обводить рамкой.

Цитата(LerikCo @  23.4.2014,  18:49 Найти цитируемый пост)
ЗЗЫ: Не откажусь от уже готового класса, если таковой имеется.

http://msdn.microsoft.com/ru-ru/library/ee354408.aspx
http://msdn.microsoft.com/ru-ru/library/bb983906.aspx
ну а если хочется покопаться в коде, создаете MDI или SDI приложение с стилем Office и можете там копошиться.

Добавлено через 42 секунды
перенесите тему пожалуйста.

Автор: LerikCo 23.4.2014, 19:53
vol4ek, не очень понял, зачем мне "ленты", если я говорил про меню в стиле 2003?

ЗЫ: Проект изначально написан на VC6. Преобразовывать к другим версиям нежелательно.

Автор: vol4ek 23.4.2014, 20:35
Цитата(LerikCo @  23.4.2014,  19:53 Найти цитируемый пост)
vol4ek, не очень понял, зачем мне "ленты", если я говорил про меню в стиле 2003?

дело в том что меню в офисе - не меню, а панель быстрого доступа созданная конструктором на ленте и класса CMenu там нет в помине.  smile 



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