информационная безопасность
без паники и всерьез
 подробно о проекте
Все любят медГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Модульный ботнет от русских хакеров 
 Торвальдс и вайбтестеры 
 Атака на GitHub 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Спасибо так даже не только при Debug но и Release работает 14.07.01 22:50  Число просмотров: 981
Автор: Паша Статус: Незарегистрированный пользователь
<"чистая" ссылка>
И как же всётаки всё каряво и непродуманно, пора переходить на Borland C Builder
<programming>
Как из CView в MDI получить доступ к CMenu гланого окна 13.07.01 17:30  
Автор: Паша Статус: Незарегистрированный пользователь
<"чистая" ссылка>
У меня MDI приложение, в классе, производном от CView нужно изменить главное меню, в соответствии с настройками. Я делаю это в ф-ции OnInitialUpdate()
вот так вот:
CMenu *prtmenu = AfxGetMainWnd()->GetMenu()->GetSubMenu(2);
а потом вноше изменения в меню. Но, как известно, в MDI приложении есть два меню - для пустого окна и для окна с открытым дочерним окном. Так вот, изменения вносятся почему-то именно в меню для пустого MDI приложения. Что за шляпа???? Помогите!
Как из CView в MDI получить доступ к CMenu гланого окна 13.07.01 20:36  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> У меня MDI приложение, в классе, производном от CView нужно
> изменить главное меню, в соответствии с настройками. Я
> делаю это в ф-ции OnInitialUpdate()
> вот так вот:
> CMenu *prtmenu =
> AfxGetMainWnd()->GetMenu()->GetSubMenu(2);
> а потом вноше изменения в меню. Но, как известно, в MDI
> приложении есть два меню - для пустого окна и для окна с
> открытым дочерним окном. Так вот, изменения вносятся
> почему-то именно в меню для пустого MDI приложения. Что за
> шляпа???? Помогите!

не то трогаешь. попробуй так

CMainFrame* pMain = (CMainFrame *)AfxGetMainWnd();
CMenu* pMenu = pMain->MDIGetActive()->GetMenu();

меню у тебя создается когда создается CMDIChildFrame, и "принадлежит" ему.
Облом 13.07.01 23:44  
Автор: Паша Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Я так уже проывал, и вообще как только не пробывал - нифига!
В данном случае ошибка возникает в отмеченной строке:

CMainFrame* pMain = (CMainFrame *)AfxGetMainWnd();
CMenu* pMenu = pMain->MDIGetActive()->GetMenu(); //Runtime Error
CMenu* pSubMenu = pMenu->GetSubMenu(4);

Доступ получаю или к главному меню, или Runtime Error
никакого облома :)) 14.07.01 03:08  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
сорри, в предыдущей мессаге я ошибся :)))
То что ты не можешь достать GetSubMenu(4); говорит о том что он еще не создан.
тут небольшой пример. месаг WM_GET_SUBMENU определен как User Defined:
#define WM_GET_SUBMENU	(WM_USER + 1)
его обработчик OnGetSubmenu

void CMdiTestView::OnInitialUpdate() 
{
	CEditView::OnInitialUpdate();
	
	CMainFrame* pMain = (CMainFrame *)::AfxGetMainWnd();
	CMenu* pMenu = pMain->GetMenu();
	UINT nCount = pMenu->GetMenuItemCount();

	CString str;
	for (UINT i = 0; i < nCount; i ++)
		pMenu->GetMenuString(i, str, MF_BYPOSITION);

	PostMessage(WM_GET_SUBMENU);
}

LRESULT CMdiTestView::OnGetSubmenu(WPARAM wParam, LPARAM lParam)
{
	CMainFrame* pMain = (CMainFrame *)::AfxGetMainWnd();

	CMenu* menu = pMain->GetMenu(); 
	CMenu* submn= menu->GetSubMenu(4);
	UINT nCount = menu->GetMenuItemCount();

	CString str;
	for (UINT i = 0; i < nCount; i ++)
		menu->GetMenuString(i, str, MF_BYPOSITION);
	
	return 0;
}

---
вся проблема в том, что "расширенное" меню еще не создано, когда уже создан CView. и ChildFrame еще даже и не активен.
прогони пример дебагером и убедись, что у тебя при OnInitialUpdate меню меньше чем при OnGetSubmenu.
за одно просмотришь какие меню созданы
Пашет, спасибо, а можно проще? 14.07.01 04:33  
Автор: Паша Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Неужели Мелкософт ничего не предусмотрели в этом плане?
можно и попроще 14.07.01 22:02  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Неужели Мелкософт ничего не предусмотрели в этом плане?

в твое App классе, например CMdiTestApp делаешь такие изменения:
1) в класе добавь afx_msg void OnFileNew();
2) в MESSAGE_MAP - e измени
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
на
ON_COMMAND(ID_FILE_NEW, OnFileNew)
3) ну и собственно сама ф-ия OnFileNew, можешь проверить
void CMdiTestApp::OnFileNew()
{
        CWinApp::OnFileNew();

        CMainFrame* pMain = (CMainFrame *)::AfxGetMainWnd();
        // или
        // CMainFrame* pMain = (CMainFrame *)m_pMainWnd;

        CMenu* menu = pMain->GetMenu(); 
        CMenu* submn= menu->GetSubMenu(4);
        UINT nCount = menu->GetMenuItemCount();

        CString str;
        for (UINT i = 0; i < nCount; i ++)
                menu->GetMenuString(i, str, MF_BYPOSITION);
}

---
только не стоит так пугаться собственных мессаг. я много таких трюков делал, до сих пор никаких проблем не было. а иногда они просто незаменимы.
Спасибо так даже не только при Debug но и Release работает 14.07.01 22:50  
Автор: Паша Статус: Незарегистрированный пользователь
<"чистая" ссылка>
И как же всётаки всё каряво и непродуманно, пора переходить на Borland C Builder
так и должно быть :))) 15.07.01 02:34  
Автор: kabanchik Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> И как же всётаки всё каряво и непродуманно, пора переходить
> на Borland C Builder
ты видомо действительно еще не встречал корявых библиотек :)))
у меня еще никогда проблем не было с MFC, хотя баги там находил. но больше всего мне нравится то что все таки разработчику всегда можно поизвращатся, что и давало возможность исправлять баги, не трогая исходники. а это очень большая редкость, когда библиотека дает такую возможность - это собственно и есть хорошо продуманная библиотека :))) может не идеальная, я бы даже сказал на сегодняшний день уже устаревшая (наглядный пример сокеты, там до сих пор версия 1.1), но многие вещи хорошо продуманые.
я не есть ярый сторонник M$, но не могу отрицать того что хорошо :)))
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach