4

私はこのリンクを見つけました:http ://support.microsoft.com/kb/222829

でもそんなに理解できません。

わかりました。これをヘッダーファイルに追加する必要があることを理解しました。

HACCEL  m_hAccelTable;

そしてこれ:

m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));

私のメインの.cppに

しかし、これはどこに行きますか?

BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) {
   if (m_hAccelTable) {
      if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) {
         return(TRUE);
      }
   }
   return CDialog::PreTranslateMessage(pMsg);

}

約6つのショートカットが必要です(何かをロードするにはCTRL + U、その他をロードするにはCTRL + O)、これがどのように機能するか理解できません。少し助けが必要です

4

2 に答える 2

13

さて、MSDN の記事は誤解を招くものです。About ボックスにアクセラレータを追加する方法を示しており、About ボックスのみがアクセラレータを処理できます。この場合、IDC_BUTTON1 ID のボタンを押すのと同じです。

アプリケーション内のすべてのオブジェクトがこのメッセージを処理する機会を得られるように、非常に異なることを行う必要があります。これは、MDI/SDI アプリで自動的に行われます。

リソースにアクセラレータ テーブルを作成したら、アクセラレータを追加する必要があります。追加が完了したら、ID ごとにコマンド メッセージ ハンドラーを作成する必要があります。アクセラレータを使用すると、ハンドラーが呼び出され、必要なコードを追加できます。HACCEL 型変数をアプリ クラスに宣言します。InitInstance で LoadAccelerators を呼び出します。ウィザードを使用して、PreTranslateMessage オーバーライドをアプリケーション クラスに挿入します。以下を追加します。

      if (m_hAccelTable) 
      {
                if (::TranslateAccelerator(*m_pMainWnd, m_hAccelTable, pMsg)) 
                {
                          return(TRUE);
                }
      }

これにより、メイン ダイアログがアクセラレータを処理できるようになります。*m_pMainWnd に注意してください。これはダイアログ ハンドルです (自動的にキャストされます)。これで、任意のアクセラレータのハンドラーをダイアログまたはアプリケーション クラスに追加できるようになりました。OnCmdMsg を使用して、アプリケーション内の任意のウィンドウにコマンド メッセージをルーティングすることもできます。

将来のための私のアドバイス。アプリをダイアログ ベースにする場合は、CFormView 派生クラスを使用して SDI アプリケーションを作成することを検討してください。サイズ変更を許可しないようにフレーム スタイルを変更すると、ダイアログ ベースのように見えますが。. . ツールバーとメニューを無料で使用でき、最も重要なことは、すべてのアクセラレータとコマンド ルーティングを無料で利用できることです。

于 2012-05-22T22:56:43.507 に答える
0

参照したページでは、アクセラレータ テーブルをダイアログ ベースのアプリケーションに追加する方法について説明しています。

ダイアログ ベースのアプリケーションを作成していますか、それともメニュー バーを備えた通常の MFC フレーム ベースのアプリケーションを作成していますか?

前者を実行している場合は、参照したページが示唆しているように、PreTranslateMessage ダイアログ ボックスのメソッドをオーバーライドする必要があります。

後で行う場合は、CFrameWnd::LoadAccelTable関数を呼び出すだけで済みます。

于 2012-05-22T16:39:47.003 に答える