2015-11-26 2 views
3

Я создал простую приложение с разделенным окном с помощью Visual Studio 2013. Существует два вида: один вид сделан из класса по умолчанию, а другой вид сделан из класс пользовательского вида, полученный от CScrollView.Элемент меню отключается даже после добавления обработчика ON_COMMAND

///////////////////////// 
// MainFrm.cpp 

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext* pContext) 
{ 

    split_wnd.CreateStatic(this,1,2); 

    CRect cr; 
    GetClientRect(&cr); 

    split_wnd.CreateView(0,0,RUNTIME_CLASS(CProjectMainView),CSize(cr.Width()/2,cr.Height()),pContext); 

    split_wnd.CreateView(0,1,RUNTIME_CLASS(CMyCustomView),CSize(cr.Width()/2,cr.Height()),pContext); 

    return true; 

} 

Этот разветвитель прекрасно работает.

Проблема возникает, когда я попытался добавить обработчик ON_COMMAND в один из пунктов меню. Если я поместил обработчик ON_COMMAND в класс по умолчанию, проблем нет. Элемент меню щелкает хорошо, и обработчик работает.

Но если я помещаю обработчик ON_COMMAND в класс пользовательского вида, элемент меню не включается вообще.

Я считаю, что я сделал все для правильной реализации карты сообщений в своем классе пользовательского вида.

///////////////////////// 
// CMyCustomView.h 

class CMyCustomView:public CScrollView 
{ 
public: 
    DECLARE_DYNCREATE(CMyCustomView) 
    CMyCustomView(); 
    ~CMyCustomView(); 
    virtual void OnDraw(CDC* /*pDC*/); 
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs); 
    virtual void OnInitialUpdate(); 


public: 
    DECLARE_MESSAGE_MAP() 
    afx_msg void OnMenuIdTestMessageMap(); 
}; 

DECLARE_MESSAGE_MAP() определенно есть в MyCustomView.h И, конечно же, я добавил BEGIN_MESSAGE_MAP, END_MESSAGE_MAP() пар в MyCustomView.cpp файл.

///////////////////////// 
// CMyCustomView.cpp 

BEGIN_MESSAGE_MAP(CMyCustomView,CScrollView) 
    ON_COMMAND(MENU_ID_TEST_MESSAGE_MAP,&CMyCustomView::OnMenuIdTestMessageMap) 
END_MESSAGE_MAP() 


void CMyCaptureView::OnMenuIdTestMessageMap() 
{ 
    // TODO: Add your command handler code here 
} 

Но все же элемент меню не будет включен вообще. Он просто остается серым.

Я искал как можно больше, но кажется, что до сих пор никто не имел этого опыта. Невозможно добавить обработчик ON_COMMAND в пользовательский вид-класс, в первую очередь? Надеюсь нет.

Прошу дать мне несколько советов. Спасибо.

ответ

5

Причина очень проста. Команда маршрутизации следует этому правилу:

  1. кадров
  2. Active View
  3. Документ
  4. DocTemplate
  5. Применение

Там нет маршрутизации с другой точки зрения в окне сплиттер.

Если вы хотите по-другому, создайте обработчик OnCmdMsg в своем фрейме, в котором размещаются окна разделителя. Сначала вызовите OnCmdMsg в представление активного сплиттера и (если не обрабатывать) переадресуйте его во второй встроенный вид.

См. TN021

+0

Wow. Спасибо. Я не ожидал, что ответ наступит так быстро. Огромное спасибо. Я попробую, как вы упомянули. Я действительно надеюсь найти разрешение. –

+0

И неутешительно знать, что командная маршрутизация является настолько ограничительной, хотя. –

+1

Он ограничен, но хорошо документирован ...;) TN021 https://msdn.microsoft.com/en-us/library/xt2c310k.aspx?f=255&MSPPError=-2147217396 – xMRi