-----Исходное сообщение----- От: Radovets Konstantin Кому: 'Артем' Дата: 14 марта 2000 г. 8:55 Тема: Ответ: subscript Привет! Вообще-то проблема сводится к тому, что почему-то нельзя одновременно определить обработку функции void CMyMenuView::OnHelpTest() в классе CMyMenuView и void CMainFrame OnHelpTest::OnHelpTest() в классе CMainFrame где фунция OnHelpTest() -ф-ция обработки элемента меню ID_HELP_TEST (где ставится галочка)Кстати задача оказалась интересной. Действительно, если определять обработку команд меню в разных классах, то будет работать только один. То есть определите функцию обработки меню в классе вида View в классе рамки Frame, то будет только работать только одна. Я предлогаю свой вариант обхода данной проблеммы. Не знаю правильный он или нет и может есть другие пути. Кто знает пишите.
Идея вот какая. Мы можем определить обработку события в классе скажем вида (View) и от туда вызовем функции остальных классов. Вот примерно так.
Итак, создаем прилдожение AppWizard, как SDI с именем TestmessageTrans. Теперь идем в меню и делаем пункт меню.
К этому пункту меню прицепляем обработку сообщения в классе вида c выводом информации в окно отладки и вызов данной функции.
void CTestmessageTransView::OnTestTestmessage() { TRACE("CTestmessageTransView::OnTestTestmessage()\n"); }Данная функция вызовется обязательно. Как же вызвать функцию класса документа. Ну давайте её в классе документа создадим.
class CTestmessageTransDoc : public CDocument { ....... // Implementation public: void TestMessage(); ...... };И реализацию.
void CTestmessageTransDoc::TestMessage() { TRACE("CTestmessageTransDoc::TestMessage()\n"); }Как её вызвать в ответ на сообщение поступившее в класс вида ??? Вот так просто.
void CTestmessageTransView::OnTestTestmessage() { TRACE("CTestmessageTransView::OnTestTestmessage()\n"); CTestmessageTransDoc* pDoc = GetDocument(); pDoc->TestMessage(); }Давайте создадим функцию в классе рамки окна.
class CMainFrame : public CFrameWnd { ......... public: void TestMessage(); ....... };И реализацию
void CMainFrame::TestMessage() { TRACE("CMainFrame::TestMessage()\n"); }Тоже самое в классе приложения
class CTestmessageTransApp : public CWinApp { public: void TestMessage(); CTestmessageTransApp(); ....... };И реализацию
void CTestmessageTransApp::TestMessage() { TRACE("CTestmessageTransApp::TestMessage()\n"); }Осталось получить указатели на эти классы в классе вида.
void CTestmessageTransView::OnTestTestmessage() { TRACE("CTestmessageTransView::OnTestTestmessage()\n"); CTestmessageTransDoc* pDoc = GetDocument(); pDoc->TestMessage(); CTestmessageTransApp* cw; cw=(CTestmessageTransApp*)AfxGetApp( ); cw->TestMessage(); CMainFrame* mf; mf=(CMainFrame*)cw->m_pMainWnd; mf->TestMessage(); }Запустите приложение в режиме отладки F5 и выберите пункт меню. Вы увидите в конце отладки (Debug) текст подтверждающий, что вызовы функций прошли.
Warning: no message line prompt for ID 0x8003. CTestmessageTransView::OnTestTestmessage() CTestmessageTransDoc::TestMessage() CTestmessageTransApp::TestMessage() CMainFrame::TestMessage() The thread 0xFFF813D3 has exited with code 0 (0x0).