Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |  |  |  |
так и должно быть :))) 15.07.01 02:34 Число просмотров: 928
Автор: kabanchik Статус: Незарегистрированный пользователь
|
> И как же всётаки всё каряво и непродуманно, пора переходить > на Borland C Builder ты видомо действительно еще не встречал корявых библиотек :)))
у меня еще никогда проблем не было с MFC, хотя баги там находил. но больше всего мне нравится то что все таки разработчику всегда можно поизвращатся, что и давало возможность исправлять баги, не трогая исходники. а это очень большая редкость, когда библиотека дает такую возможность - это собственно и есть хорошо продуманная библиотека :))) может не идеальная, я бы даже сказал на сегодняшний день уже устаревшая (наглядный пример сокеты, там до сих пор версия 1.1), но многие вещи хорошо продуманые.
я не есть ярый сторонник M$, но не могу отрицать того что хорошо :)))
|
|
<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$, но не могу отрицать того что хорошо :)))
|
|
|