Шаг 150 - Обработка команды в разных классах

	-----Исходное сообщение-----
	От: Radovets Konstantin 
	Кому: 'Артем' 
	Дата: 14 марта 2000 г. 8:55
	Тема: Ответ: subscript
	Привет!
	Вообще-то проблема сводится к тому, что почему-то нельзя одновременно
	определить обработку функции 
	void CMyMenuView::OnHelpTest() в классе CMyMenuView
	и void CMainFrame OnHelpTest::OnHelpTest() в классе CMainFrame
	где фунция OnHelpTest() -ф-ция обработки элемента меню
	ID_HELP_TEST (где ставится галочка)
Кстати задача оказалась интересной. Действительно, если определять обработку команд меню в разных классах, то будет работать только один. То есть определите функцию обработки меню в классе вида View в классе рамки Frame, то будет только работать только одна. Я предлогаю свой вариант обхода данной проблеммы. Не знаю правильный он или нет и может есть другие пути. Кто знает пишите.

Идея вот какая. Мы можем определить обработку события в классе скажем вида (View) и от туда вызовем функции остальных классов. Вот примерно так.

150_1.gif (2791 b)

Итак, создаем прилдожение AppWizard, как SDI с именем TestmessageTrans. Теперь идем в меню и делаем пункт меню.

150_2.gif (6131 b)

К этому пункту меню прицепляем обработку сообщения в классе вида 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).

Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.