Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2014, 21:11   #1
Lerik-Co
Новичок
Джуниор
 
Регистрация: 23.04.2014
Сообщений: 1
Вопрос Рисуем элементы меню (на диалоге)

Доброго времени суток!

Что требуется:
На диалоговом окне (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 определяет прямоугольник под иконой. Получить рект всего элемента не знаю как.
Во-вторых, даже задавая рект для всего элемента вручную, вижу только фрагмент отрисовки своего прямоугольника, всё остальное накрывает текст элемента.
В третьих, не понимаю, как различать выделенный и невыделенный элемент меню.

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


ЗЫ:
Что было прочитано:
ФАК 74
Как вставить иконки в стандартное меню
иконки в меню
menu
www.codeproject.com/Articles/16529/Simple-Menus-That-Display-Icons-Minimalistic-Appro
www.codeproject.com/Articles/2354/Owner-Drawn-Menu-with-Icons-Titles-and-Shading
www.realcoding.net/articles/glava-12-v-glubine-menyu.html

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

С уважением и надеждой!
Lerik-Co вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работают элементы управления в диалоге MFC nubak Помощь студентам 0 16.04.2013 19:56
Элементы управления(кнопки, меню) в fullscreen OpenGL приложении suc-daniil Общие вопросы C/C++ 4 30.03.2011 22:11
Элементы управления(кнопки, меню) в fullscreen OpenGL приложении suc-daniil Помощь студентам 0 15.02.2011 18:05
Автосатически нажать OK в диалоге eglantier Microsoft Office Excel 2 16.03.2009 16:27
Присвоение имени файлу в диалоге Beliyd Общие вопросы Delphi 3 05.09.2007 18:54