DIALOGベースのプロジェクトなのですが、
ESCキーやRETURNキーを押すと、プログラムが終了してしまいます。
どうしたら防げるのでしょうか?
VC++256TIPSの方の「リターンキー、エスケープキーの終了処理回避」
に方法がありますよ~。
PreTranslateMessage()をオーバーライドすればOK。
>VC++256TIPSの方の「リターンキー、エスケープキーの終了処理回避」
>に方法がありますよ~。
はどこにあるんでしょう?(^^;
過去ログはみたのですが...、すいません。教えて下さい。m(_)m
念の為、PreTranslateMessage()を使用して下記のように試してみたところ。
if (pMsg->message==WM_KEYFIRST) {
if ((pMsg->wParam==13) || (pMsg->wParam==27)) {
return(FALSE);
}
}
リターン・エスケープで終了されなくなったのですが、
リターンでボタンも押せません。
(CTreeCtrl内ではリターンがうまく利くようになりましたが)
処理方法が違うのでしょうか? (過去ログで解決するなら、これは無視してくださいm(_)m)
度々すいませんが、よろしくお願いします。m(_)m
↑、失敗失敗。タグでちゃったよ。
あ。それと、↑のHPの「Vc Tips」です。
まわりくどくなっちゃったよ。
そのまま、やりかた書けばよかったっす。
度々すいません。
VC++Tips知りませんでした。m(_)m
で、そこのサンプル通りにやったのすが、ESC,リターンで終了しなくなったのですが、
リターンキーが全く利かなくなりました。
(ボタンでも、CTreeCtrlのEditなどでも)
これは防げないのでしょうか?
そもそも、なんで終了しちゃうんでしょうか?(^^;
何度もお手数をお掛けしますが、宜しくお願いします。m(_)m
サンプルは、リターンキーをきかなくする
方法でしたね。すみません。
そもそも終了する理由ですが
OKボタンがアクティブなときに、リターンキーが
押されると、OnOK()
ESCキーで、OnCancel()が呼ばれているからです。
ボタン等をリターンキーで扱いたい場合は、
OnOK()をオーバーライドして
void CxxxDlg::OnOK()
{
// CDialog::OnOK();
}
OnOK()を呼ばなくすればOKです。
そのかわりに終了する処理は自分で書いてください。
OnCancel()でも自分で呼ぶようにすれば終了します。
恐縮ながら、らららさんの補足をさせて頂きます。
OnOk()とOnCancel() は、ダイアログフォームを最初に作ったときに付いているボタン
「OK」と「キャンセル」をそれそれダブルクリックした時に作られるルーチンへ対して
行うのですが、ダイアログ作成時に私は、考え無しにボタンを削除してしまい、後で
後悔してしまった事が度々あります(^^;)
そんな時は、クラスビューの対応ダイアログのクラス上で右クリックして「メンバ関数の追加」
によって、「virtual void OnOk()」および「virtual void OnCancel()」を追加すれば
大丈夫です。
あと、終了時の方法として、ウィンドウを閉じるボタン(右上の「×」マーク)を押した時に
WM_CLOSEイベントが発生しますので、それに対応する関数(OnClose())を作成して、終了時
の処理を行います。最終的に、ダイアログを閉じる時はOnClose()の中で EndDialog() を
呼び出してやればOKです。下に、終了時のサンプルを書きますね。
----------------------------------------
<<OnClose()の例>>
void CNetClassDlg::OnClose()
{
// 既存の処理をコメント化
// CDialog::OnClose();
if(MessageBox(終了しますか?,終了確認,MB_ICONQUESTION|MB_YESNO)== IDYES)
{
EndDialog(IDOK);
}
}
----------------------------------------
> if (pMsg->message==WM_KEYFIRST) {
> if ((pMsg->wParam==13) || (pMsg->wParam==27)) {
> return(FALSE);
> }
> }
13はリターンキー27はエスケープキーのキーコードです。
13をはずしたらいいのではないでしょうか?