Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Обработка сообщения в двух классах


Автор: torero 20.4.2007, 18:59
      Я хотел бы сделать так: нажимаю на кнопку меню "удалить файл"(ID_CUT) и, чтобы это сообщение обрабатывалось 
   вначале в "виде", а потом ещё в "документе".  В MSDN есть на эту тему 1. ON_COMMAND_EX  и 
   2. Technical Note 6 , но не всё понятно. Согласно MSDN пишу так:
   Header file "вида"-             afx_msg BOOL OnCont(UINT nID);
                                                   afx_msg void OnDelete();

   cpp file "вида"-                   ON_COMMAND(ID_CUT,OnDelete)
                                ON_COMMAND_EX(ID_CUT,OnCont)
                                                  ..........................................................................
                                                void CComposeViewNewf::OnDelete()         { .............}      
                       
                                                 BOOL CComposeViewNewf::OnCont(UINT nID) 
                                                {  CCmdUI::ContinueRouting();
                                   return FALSE;
                                                }
     ON_COMMAND(ID_CUT,OnDelete)-работает правильно, но в "документ" не идёт.
     Не могу понять что такое  UINT nID , и ,наверное, ещё что-то не так.
     Сначала делал всё в "документе", работало правильно.
                               

Автор: dizzy1984 20.4.2007, 19:47
Зачем тебе обработка и в том, и в другом?
Обычна вся модификация данных проходит в CDocument, а CView ее использует для показа.
Думаю, ты запутался в логике представление/документ

Автор: Earnest 20.4.2007, 19:50
Обработчик конкретной команды в конкретной карте должен быть ровно один. Остальные просто смысла не имеют, т.к. берется первый найденный.

Логика обработки такая: если обработчик выставил флаг "обработано", то все, а если нет, поиск обработчика продолжается, но не в текущей карте, а в цепочке передачи ответственности (Frame->View->Document и т.д.)
Стандартные обработчики (void) всегда считаются выполненными, а расширенные - возвращают этот самый флаг.

Таким образом, чтобы сначала обработать команду в виде, а потом в документе, нужно на виде написать один расширенный обработчик ID_CUT, т.е. ON_COMMAND_EX, сделать что надо и вернуть из него FALSE.
Код

BOOL CComposeViewNewf::OnDelete (UINT nID)         
{ 
   .............
   return FALSE;
}      

И никаких OnCont не надо, а CCmdUI::ContinueRouting - это вообще из другой оперы.

Цитата(torero @  20.4.2007,  19:59 Найти цитируемый пост)
 Не могу понять что такое  UINT nID, и ,наверное, ещё что-то не так.
 

Это ид-р обрабатываемой команды ( в данном случае ID_CUT). А сделал ты неправильно все. smile 
Надеюсь, теперь понятно.

Автор: torero 21.4.2007, 08:40
Earnest, большое спасибо, всё получилось.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)