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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
можно и попроще 14.07.01 22:02  Число просмотров: 1408
Автор: 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);
}

---
только не стоит так пугаться собственных мессаг. я много таких трюков делал, до сих пор никаких проблем не было. а иногда они просто незаменимы.
<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