Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
1 / 1 / 1
Регистрация: 22.12.2009
Сообщений: 42
1

Переход на "новые" MFC классы

05.07.2022, 11:58. Показов 2949. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
дошли руки наконец освежить старую программу (ну собсно в основном купился на иконки в строках меню, давно хотелось добавить такое), но с плюсами как полагается образовались и минусы...

Итак, заменил старые классы на CWinAppEx и CMDIFrameWndEx, CMFCMenuBar и CMFCStatusBar и т.п.
Перестало работать добавление/удаление строк в меню через CMenu::AppendMenu() / CMenu::RemoveMenu(). Нашел в инете "решение" этой проблемы -- создавать CMenu объект из своих ресурсов, а из него уже с помощью CMFCMenuBar::CreateFromMenu создавать меню. В общем то сработало, но перестали появляться имена чайлд-доков в меню "Окна", а для меня это очень нужная функциональность -- то рубаха коротка, то член наружу (как говорил мой ком. роты). Долго копал в инете, но в основном все вариации вышеописанного. Может есть у кого еще вариант как это порешать?

При максимизации окон чайлд-доков, как известно, в строке меню появляется системное меню этого чайлд-дока в виде пиктограмки. Так вот эта пиктограмма НЕ меняется, когда я табаюсь на другой тип чайлд-дока -- такой проблемы не было со "старыми" классами. Подскажите плз как это порешать.

Добавлено через 2 часа 58 минут
по системной иконке... если в чайлд-окне в обработчике WM_MDIACTIVATE задействовать вот такой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
void CO2BlnFrm::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
{
    BOOL bMaximized;
    CMDIChildWnd* pChild = ((CMainFrm*)theApp.m_pMainWnd)->MDIGetActive(&bMaximized);
 
    if (bActivate && bMaximized)
    {
        ((CMainFrm*)theApp.m_pMainWnd)->m_wndMenuBar.SetMaximizeMode(FALSE, pChild);
    }
 
    CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
}
то иконки меняются, но при этом мигает вся строка меню -- очевидно, что из-за неправильного FALSE в SetMaximizeMode -- системное меню удаляется, а потом создается, перерисовываясь таким кривым образом... надо как-то апдэйтить менюшку без пересоздания.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2022, 11:58
Ответы с готовыми решениями:

MFC новые компоненты CEdit...
Привет. Подскажите, как в MFC добиться чтобы CEdit выглядел в новом стиле с тенями, а не как...

Не добавляются новые данные в БД (MFC)
Здравствуйте! Проект MFC. У меня есть четыре EditControl и кнопка. Пользователь вводит необходимые...

Новые элементы меню не появляются (MFC)
Я создаю MFC application потом class view/add/resource/menu. Создаю элементы меню ,и запускаю...

MS VS-2017 C++ переход с MFC в STL
Наконец, наверху осознали необходимость такого перехода. Первое на что я наткнулся - это поиск...

4
1 / 1 / 1
Регистрация: 22.12.2009
Сообщений: 42
05.07.2022, 18:35  [ТС] 2
вопрос с иконками чайлд-доков решен:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void CO2BlnFrm::OnMDIActivate(BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd)
{
    if (bActivate)
    {
        BOOL    bMaximized;
        ((CMainFrm*)theApp.m_pMainWnd)->MDIGetActive(&bMaximized);
 
        if (bMaximized)
        {
            CMFCMenuBar &MB = ((CMainFrm*)theApp.m_pMainWnd)->m_wndMenuBar;
 
            MB.SetMaximizeMode(FALSE, NULL, FALSE);
            MB.SetMaximizeMode(TRUE , NULL, FALSE);
            MB.InvalidateButton(0);
        }
    }
 
    CMDIChildWnd::OnMDIActivate(bActivate, pActivateWnd, pDeactivateWnd);
}
(подсмотрено в реализации метода CMFCMenuBar::CreateFromMenu())
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
05.07.2022, 19:02 3
Цитата Сообщение от SergeyKN Посмотреть сообщение
((CMainFrm*)theApp.m_pMainWnd)->
и не лень всё время приводить тип? Проще сразу сделать указатель нужного типа в классе приложения
0
1 / 1 / 1
Регистрация: 22.12.2009
Сообщений: 42
05.07.2022, 19:27  [ТС] 4
чёт как то даже не обращал внимания, что называется стерпелось-слюбилось... запустил поиск -- 85 таких вызовов -- действительно надо переделать. щас этим и займусь, как раз успею до прихода ответа по вопросу о добавлении/удалении строк в меню
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,346
05.07.2022, 19:51 5
SergeyKN, я с новыми классами не заморачивался, как-то старыми обхожусь. Поэтому не подскажу.
Но все новые проекты делаю на Qt, а не на MFC
0
05.07.2022, 19:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2022, 19:51
Помогаю со студенческими работами здесь

Собственные классы в MFC
Вот я создаю новые классы в проекте MFC, вызываю из них стандартные функции типа Invalidate(). По...

C++11 новые классы стандартной библиотеки
Здравствуйте. Программирую в eclipse на С++, использую С++11. Код в новом стандарте компилируется,...

Переход между диалоговыми окнами (MFC)
Помогите пожалуйста. Как реализовать переход между 2-мя диалоговыми окнами по кнопке? Раньше...

Переход предприятий на новые версии Windows и проблема пиратства
Не скажи допустим у нас на предприятии она будет жить пока будет возможно установить дрова на XP...

MFC или программный переход между элементами управления
Уважаемые клиенты-программеры, подскажите пожалуйста, как в диалоговом окне программно реализовать...

Переход на классы
Эмн... Вот тут возникла такая ситуация... Есть задание и код (написанный мною естессна), но его...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru