C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 150 - Обработка команды в разных классах / MFC шаг за шагом / Visual C++

Шаг 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).

Загрузить проект | | |
Автор Каев Артем.
[AD]