none
CDockablePaneでCButtonをCreateしても、ボタンが有効にならない。 RRS feed

  • 質問

  • VS2008 VC++ にてアプリケーションを作成しています。

    サンプルで作成されるソースを元に、CFileView(::CDockablePane)クラス内でCButtonを作成しているのですが、ボタンコントロールが有効にならず困っています。

    何が問題なのでしょうか?

     

    CButtonの内容は以下の様に記述しています。

    ---

    Code Snippet

    //Resource.h

    #define  IDC_BT_TEST  150

     

    //FileView.h 

    CButton m_btnTest; //(CMFCButtonでも同様となる)


    afx_msg void OnBtnTest();

     

    //FileView.ccp
    BEGIN_MESSAGE_MAP(CFileView, CDockablePane)
    ON_BN_CLICKED(IDC_BT_TEST, OnBtnTest)
    END_MESSAGE_MAP()

    CFileView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    m_btnTest.Create(_T("OK"), WS_VISIBLE | WS_CHILD, rectDummy, this, IDC_BT_TEST)
    m_btnTest.EnableWindow(TRUE);
    }

    void CFileView::OnBtnTest()
    {
    TRACE0("OK\n");
    }

     

    ボタンオブジェクトの挙動としてアプリケーションが起動した一瞬に有効になっていますが、すぐ無効表示になってしまいます。

    ※有効表示の時に、そのボタンをクリックすると、メッセージは拾えている。

     

    CDockablePaneクラスに何か設定をしなければならないのでしょうか?

    どなたかご教授いただきたく。

    2008年11月18日 8:29

回答

  • どうも、以下の様にするとボタンが有効化するようです。

     

    Code Snippet

    //Resource.h

    #define  IDC_BT_TEST  150

     

    //FileView.h 

    CButton m_btnTest; //(CMFCButtonでも同様となる)


    afx_msg void OnBtnTest();

    afx_msg void OnUpdateButton(CCmdUI *pCmdUI);

     

    //FileView.ccp
    BEGIN_MESSAGE_MAP(CFileView, CDockablePane)
    ON_BN_CLICKED(IDC_BT_TEST, OnBtnTest)

    ON_UPDATE_COMMAND_UI(IDC_BT_TEST, OnUpdateButton)
    END_MESSAGE_MAP()

    CFileView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    m_btnTest.Create(_T("OK"), WS_VISIBLE | WS_CHILD, rectDummy, this, IDC_BT_TEST)
    m_btnTest.EnableWindow(TRUE);
    }

    void CFileView::OnBtnTest()
    {
    TRACE0("OK\n");
    }

     

    void CFileView::OnUpdateButton(CCmdUI *pCmdUI)
    {
    pCmdUI->Enable(TRUE);
    }

     

     

    CDockablePaneは、子のコントロールが有効か?無効か? ON_UPDATE_COMMAND_UI で

    調べているようです。

    #以上は、実験の結果なので、正確性は保障できません。

    2008年12月21日 2:45

すべての返信

  • どうも、以下の様にするとボタンが有効化するようです。

     

    Code Snippet

    //Resource.h

    #define  IDC_BT_TEST  150

     

    //FileView.h 

    CButton m_btnTest; //(CMFCButtonでも同様となる)


    afx_msg void OnBtnTest();

    afx_msg void OnUpdateButton(CCmdUI *pCmdUI);

     

    //FileView.ccp
    BEGIN_MESSAGE_MAP(CFileView, CDockablePane)
    ON_BN_CLICKED(IDC_BT_TEST, OnBtnTest)

    ON_UPDATE_COMMAND_UI(IDC_BT_TEST, OnUpdateButton)
    END_MESSAGE_MAP()

    CFileView::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    m_btnTest.Create(_T("OK"), WS_VISIBLE | WS_CHILD, rectDummy, this, IDC_BT_TEST)
    m_btnTest.EnableWindow(TRUE);
    }

    void CFileView::OnBtnTest()
    {
    TRACE0("OK\n");
    }

     

    void CFileView::OnUpdateButton(CCmdUI *pCmdUI)
    {
    pCmdUI->Enable(TRUE);
    }

     

     

    CDockablePaneは、子のコントロールが有効か?無効か? ON_UPDATE_COMMAND_UI で

    調べているようです。

    #以上は、実験の結果なので、正確性は保障できません。

    2008年12月21日 2:45
  • こんにちは。中川俊輔 です。

     

    ビトーさん、回答ありがとうございます。

     

    norimaさん、フォーラムのご利用ありがとうございます。

    その後いかがでしょうか?

    有用な情報と思われたため、ビトーさんの回答へ回答済みチェックをつけさせていただきました。

    調べてみたところ、ユーザー インターフェイス更新コマンド メッセージを処理するための

    メッセージ ハンドラを実装しないと、ボタンが無効になってしまうようです。

     

    今後ともフォーラムをよろしくお願いします。

    それでは!

    2008年12月29日 7:23