0

リストコントロールと、境界線のないCDialogから派生したフォームがいくつかあります。ユーザーが特定のリストアイテムをクリックすると、特定のフォームが表示されます。これらのフォームの基本クラスとしてCDialogクラスを使用しました。すべてがうまく機能しますが、リストとこれらのコントロールが配置されているメインウィンドウでEscキーを押すと、現在のフォームが非表示になります。エスケープキーをブロックする方法は?フォームのクラスでOnCancelメソッドを定義し、ダイアログが閉じないようにする必要がありますか、それとも問題を解決するために設定できるフラグがいくつかありますか?フォームクラス内にDoDataExchangeを含めるために、基本クラスとして主にCDialogクラスを選択しました。

4

1 に答える 1

0

あなたがフォームと呼んでいるものがわかりません。ダイアログを操作していると仮定します。

Escを押しても、ダイアログは非表示になりません。IDCANCEL終了コードで終了します。RETURNを押しても同じことが起こります。違いは、終了コードがIDOKに設定されていることです。

キャンセルハンドラの動作は変更しないでください。ユーザーがキャンセルボタンでダイアログを実際に終了したことを知る必要があります。

代わりに、リソースエディターでアクセラレータテーブルを作成し、それにEsc(VK_ESCAPE)キーを追加します。HACCELタイプのメンバー変数をアプリに追加します。InitInstance呼び出しの場合:

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

仮想PreTranslateMessageをyurアプリケーションに追加します。次のコードをオーバーライドに配置します。

BOOL CYourApp::PreTranslateMessage(MSG* pMsg)
{
    if(TranslateAccelerator(pMsg->hwnd, m_hAccel, pMsg))
    {
        return TRUE;
    }

    return CWinAppEx::PreTranslateMessage(pMsg);
}

それだ。Escが押されたときにダイアログが閉じないようにする以外に何か他のことをしたい場合を除いて、このアクセラレータのハンドラーを挿入する必要はありません。

于 2012-06-07T00:31:59.983 に答える