none
CDialogBarのアクセラレータキー RRS feed

  • 質問

  • SDIにCDialogBarを貼り付けています。

    そのダイアログバー上にはボタンがあり、キャプションに(&A)などとアクセラレータキーを割り付けています。

    このボタンにフォーカスがあるときにはAlt+Aで動作するのですが、

    View等(ダイアログバー以外)にフォーカスがあるとAlt+Aが動作しません。これは仕様なのでしょうか?

    ちなみにメニューは「ファイル(&F)」等どこにフォーカスがあっても大丈夫です。

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    ...
    	m_dlgBar.Create(this, IDD_DIALOGBAR, CBRS_TOP, AFX_IDW_PREVIEW_BAR)
    /*
    	HACCEL m_hAccelSave = m_hAccelTable;
    	HINSTANCE hInst = AfxFindResourceHandle( _T("IDR_DIALOGBAR"), RT_ACCELERATOR );
    	if( hInst != NULL )
    		m_hAccelTable = ::LoadAccelerators(hInst, _T("IDR_DIALOGBAR"));	// NULLになる
        }
    */ 
    	return 0;
    }

    2012年6月5日 7:52

回答

  • 細かい説明を全てすっとばすと、・・・
    メイン(トップ)レベルフレームのアクセラレータに当該のダイアログバーの対象アクセラレータと
    同等の機能を実現するためのWM_COMMAND+IDを発行するアクセラレータキーを
    登録してみてはどうでしょう。

    ちなみに、このような表現になってしまうのは、当該ダイアログバーの対象コントロールのIDが、
    メインフレームの何らかとぶつかっている場合を想定しているためです(vv;)。

    2012年6月5日 9:06
  • アクセラレータテーブルにダイアログバー上のボタンIDを追加することで解決できました。

    ありがとうございました。

    • 回答としてマーク pragmanaka 2012年6月6日 0:47
    • 回答としてマークされていない pragmanaka 2012年6月6日 0:47
    • 回答としてマーク pragmanaka 2012年6月6日 0:47
    2012年6月6日 0:46

すべての返信

  • 細かい説明を全てすっとばすと、・・・
    メイン(トップ)レベルフレームのアクセラレータに当該のダイアログバーの対象アクセラレータと
    同等の機能を実現するためのWM_COMMAND+IDを発行するアクセラレータキーを
    登録してみてはどうでしょう。

    ちなみに、このような表現になってしまうのは、当該ダイアログバーの対象コントロールのIDが、
    メインフレームの何らかとぶつかっている場合を想定しているためです(vv;)。

    2012年6月5日 9:06
  • アクセラレータテーブルにダイアログバー上のボタンIDを追加することで解決できました。

    ありがとうございました。

    • 回答としてマーク pragmanaka 2012年6月6日 0:47
    • 回答としてマークされていない pragmanaka 2012年6月6日 0:47
    • 回答としてマーク pragmanaka 2012年6月6日 0:47
    2012年6月6日 0:46