3

Visual Studio 2013 を使用して単純な分割ウィンドウ アプリケーションを作成しました。2 つのビューがあり、1 つのビューは default-view-class で作成され、もう 1 つのビューは から派生した custom-view-class で作成されCScrollViewます。

/////////////////////////
// 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この問題は、メニュー項目の 1 つにハンドラを追加しようとしたときに発生します。ON_COMMANDハンドラーを default-view-class に配置しても問題はありません。メニュー項目がうまくクリックされ、ハンドラーが機能します。

しかし、ON_COMMANDハンドラーを custom-view-class に配置すると、メニュー項目がまったく有効になりません。

カスタムビュークラスにメッセージマップを適切に実装するためにすべてを行ったと思います。

/////////////////////////
// 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 にあります。もちろん、 MyCustomView.cpp ファイルBEGIN_MESSAGE_MAPに ,END_MESSAGE_MAP()ペアを追加しました。

/////////////////////////
// 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そもそも、custom-view-class にハンドラを追加することは不可能ですか? ないことを願っています。

私に何かアドバイスをください。ありがとうございました。

4

1 に答える 1

5

理由はとても簡単です。コマンド ルーティングは次の規則に従います。

  1. フレーム
  2. アクティブ ビュー
  3. 書類
  4. DocTemplate
  5. 応用

分割ウィンドウ内の別のビューへのルーティングはありません。

別の動作が必要な場合は、分割ウィンドウをホストするフレームに OnCmdMsg ハンドラーを作成します。最初の OnCmdMsg をアクティブなスプリッター ビューに呼び出し、(処理されない場合) 2 番目の埋め込みビューに再ルーティングします。

TN021を参照

于 2015-11-26T10:54:18.387 に答える