ダイアログを開き、Enterを押すと終了します.
ダイアログボックスでリターンキーenterをマスクする方法
ユーザーがリターンキーを押すと、Windowsは特殊なWM_を送信します.GETDEFIDメッセージはデフォルトのコマンドIDを取得し、WindowsはWM_として使用します.COMMAND送信.だから、あなたがしなければならないのはWMを再ロードすることです.GETDEFIDメッセージは、Windowsに関するドキュメントでWM_GETDEFIDは値を返します:“もしデフォルトのボタンがあるならば、戻り値の高位の字はDC_HASDEFIDを含んで、低位の字は制御の識別子を含みます.さもなくば、戻り値はゼロです.”
もう一つの不器用な方法は、ボタン、IDOKを追加して削除し、CDialogのOnOK虚関数がOKボタンを制御し、データ交換をトリガしたりダイアログボックスから退出したりすることですが、Enterキーもたまたま同じ効果を持っています.これは私たちに必要なものかもしれませんが、この機能は必要ありません.つまり、ユーザーが編集ボックスでEnterキーを押してプログラムを閉じることを望んでいないということです.どうやってこの問題を解決しますか?一、理由ユーザーがEnterキーを押すと、Windowsは自動的に入力フォーカスがどのボタンに落ちているかを探して、フォーカスを取得したボタンの周りが点線矩形に囲まれます.すべてのボタンが入力フォーカスを取得していない場合、Windowsはプログラムまたはリソースで指定されたデフォルトボタン(デフォルトボタンの枠線が太い)を自動的に探します.ダイアログにデフォルトのボタンがない場合、ダイアログにOKボタンがない場合でも、OnOK関数は自動的に呼び出されます.二、解決策Enterキーを無効にするために、最も簡単な方法はCExDlgのOnOK関数を空の関数に書き、OKボタンに対して新しい関数を書いて応答することです.具体的な手順は、まずExという名前のダイアログベースのプログラムを作成することです.
1.ClassWizardでIDOKボタンをOnOK虚関数にマッピングします.ClassWizardでCExDlgのObject IdsリストからIDOKを選択し、BN_をクリックしますCLICKEDは、OnOK関数の原形とフレームワークを生成します. 2.ダイアログエディタでOKボタンのIDを変更します.OKボタンを選択し、IDをIDOKからIDC_に変更OKし、Default Button属性のチェックマークを外します.これでOnOK関数が分離されます. 3.ClassWizardでOnClickedOKメンバー関数を作成します.ClassWizardでCExDlgのObject IdsリストからIDC_を選択OK、BN_をクリックしますCLICKEDは、関数名をOnClickedOKで、OnClickedOK関数の原形とフレームワークを生成します. 4.コードを編集します.
5.プログラムをコンパイルしてテストします.プログラムを再コンパイルし、Enterキーをテストすると、Enterキーを押すと何のアクションもなく、OKボタンをクリックすると以前と同じになります.
三、OnCancelの処理は、EnterキーがOnOK関数の呼び出しをトリガーできるように、EscキーがOnCancel関数の呼び出しをトリガーすることもできる.これにより、ダイアログボックスから制御が終了します.しかし、読者はOKボタンのように処理することができ、無効なOnCancel関数を設定することで、このような状況を防止する3つ目の方法があります.
ユーザーがリターンキーを押すと、Windowsは特殊なWM_を送信します.GETDEFIDメッセージはデフォルトのコマンドIDを取得し、WindowsはWM_として使用します.COMMAND送信.だから、あなたがしなければならないのはWMを再ロードすることです.GETDEFIDメッセージは、Windowsに関するドキュメントでWM_GETDEFIDは値を返します:“もしデフォルトのボタンがあるならば、戻り値の高位の字はDC_HASDEFIDを含んで、低位の字は制御の識別子を含みます.さもなくば、戻り値はゼロです.”
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
ON_MESSAGE(DM_GETDEFID, OnGetDefID)
...
END_MESSAGE_MAP()
LRESULT CMyDlg::OnGetDefID(WPARAM wp, LPARAM lp)
{
return MAKELONG(0,DC_HASDEFID);
}
もう一つの不器用な方法は、ボタン、IDOKを追加して削除し、CDialogのOnOK虚関数がOKボタンを制御し、データ交換をトリガしたりダイアログボックスから退出したりすることですが、Enterキーもたまたま同じ効果を持っています.これは私たちに必要なものかもしれませんが、この機能は必要ありません.つまり、ユーザーが編集ボックスでEnterキーを押してプログラムを閉じることを望んでいないということです.どうやってこの問題を解決しますか?一、理由ユーザーがEnterキーを押すと、Windowsは自動的に入力フォーカスがどのボタンに落ちているかを探して、フォーカスを取得したボタンの周りが点線矩形に囲まれます.すべてのボタンが入力フォーカスを取得していない場合、Windowsはプログラムまたはリソースで指定されたデフォルトボタン(デフォルトボタンの枠線が太い)を自動的に探します.ダイアログにデフォルトのボタンがない場合、ダイアログにOKボタンがない場合でも、OnOK関数は自動的に呼び出されます.二、解決策Enterキーを無効にするために、最も簡単な方法はCExDlgのOnOK関数を空の関数に書き、OKボタンに対して新しい関数を書いて応答することです.具体的な手順は、まずExという名前のダイアログベースのプログラムを作成することです.
1.ClassWizardでIDOKボタンをOnOK虚関数にマッピングします.ClassWizardでCExDlgのObject IdsリストからIDOKを選択し、BN_をクリックしますCLICKEDは、OnOK関数の原形とフレームワークを生成します. 2.ダイアログエディタでOKボタンのIDを変更します.OKボタンを選択し、IDをIDOKからIDC_に変更OKし、Default Button属性のチェックマークを外します.これでOnOK関数が分離されます. 3.ClassWizardでOnClickedOKメンバー関数を作成します.ClassWizardでCExDlgのObject IdsリストからIDC_を選択OK、BN_をクリックしますCLICKEDは、関数名をOnClickedOKで、OnClickedOK関数の原形とフレームワークを生成します. 4.コードを編集します.
void CExDlg::OnOK()
{
// TODO: Add extra validation here
// CDialog::OnOK();
}
void CExDlg::OnClickedOk()
{
// TODO: Add your control notification handler code here
CDialog::OnOK();
}
5.プログラムをコンパイルしてテストします.プログラムを再コンパイルし、Enterキーをテストすると、Enterキーを押すと何のアクションもなく、OKボタンをクリックすると以前と同じになります.
三、OnCancelの処理は、EnterキーがOnOK関数の呼び出しをトリガーできるように、EscキーがOnCancel関数の呼び出しをトリガーすることもできる.これにより、ダイアログボックスから制御が終了します.しかし、読者はOKボタンのように処理することができ、無効なOnCancel関数を設定することで、このような状況を防止する3つ目の方法があります.
BOOL CxxxDlg::PreTranslateMessage(MSG* pMsg)
{
//
if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN)
{
UINT nID = GetFocus()->GetDlgCtrlID();
if(ctButton != GetCtrlType(nID))
{
NextDlgCtrl();
int nFocusID = GetFocus()->GetDlgCtrlID();
if(nFocusID == 1001)
((CComboBox*)(GetFocus()->GetParent()))->ShowDropDown();
else if(ctComboBox == GetCtrlType(nFocusID))
((CComboBox*)GetFocus())->ShowDropDown();
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}