OKボタン、Cancelボタン削除後、リターンキーやESCで終了しない様にする方法

[戻る]
コルボックル 2005/03/29(火) 22:08:17
windowsXP、VC++6.0、SP2、MFC

・ダイアログでワークスペースを作成。
・OKボタン、Cancelボタン削除。
・IDC_BUTTON1、IDC_BUTTON2を追加。

ここで、起動してリターンキーやESCを押すと
プログラムが終了してしまうのですが、
終了しないようにできますか?

一応googleで検索をかけて
http://www.athomejp.com/goldfish/mfc/dialog/nonesc.asp
ここのホームページを見ましたが、
既にOK、Cancelボタンは削除していますし・・・

(ワークスペースを作り直せばいいのかもしれませんが)
なんとかできる方法を知っている方、いらっしゃるでしょうか?

よろしくお願い致します。

コルボックル 2005/03/29(火) 22:33:22
素人の考えですが、
WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
を使っていますが、
これでリターンとESCのボタン押下したときの
メッセージを取得して、return(0)とかしたら
出来そうな気がするのですが・・・??
だめでしょうか?

でも、だとすると、messageは?wParamは?lParamは?
値は何になるのでしょうか??

Blue 2005/03/29(火) 22:40:21
エンター押したら親クラス(CDiaolg)のOnOKがよばれますので、
ボタンがなくても、オーバーライドして、OnOKを無効にしてください。

ESCも同様で、OnCancelがよばれます。

ESCのほうはMSDNにESCキーを押したら呼ばれると明記されています。

Blue 2005/03/29(火) 22:43:40
日本語おかしかった。
>ESCのほうはMSDNにESCキーを押したら呼ばれると明記されています。
CDialog::OnCancelのほうはMSDNにESCキーを押したら呼ばれると明記されています。

コルボックル 2005/03/29(火) 23:41:13
Blueさん、お返事ありがとうございます

(確認ですが)
オーバーライドして、OnOKを無効というのは、
ダイアログのクラスに
virtual void OnOK();
virtual void OnCancel();
を登録して、

void CMyDialog::OnOK()
{
}

void CMyDialog::OnCancel()
{
}

とすることでしょうか?
とりあえず、RETとESCを押しても終了しない様になりました。

ところが今度は、
メニューを押すとダイアログを終了させていたのですが、
終了しなくなってしまいました。。。

LRESULT CMojiDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    switch(message) {

    case WM_COMMAND:

        switch(wParam) {

        case ID_MENU_ITEM_1:
            SendMessage(WM_CLOSE, 0, 0L);
            return(0);
        }
        break;

    case WM_DESTROY:
        PostQuitMessage(0);
        return(0);
    }

    return CDialog::WindowProc(message, wParam, lParam);
}

終了処理はメニューを押したときに、WM_CLOSEを送信して
その後、WM_DESTROYを受信してとの流れの様ですが...

(すいません、初心者なものなので、あまり理解してやってません...)

Blue 2005/03/29(火) 23:50:03
メニューって WM_COMMAND じゃなかったでしょうか?

LOWORD( wParam )が ID_MENU_ITEM_1 かなんかにあたるような。

# MFCつかってるならClassWizard使ったほうがいいですよ。

Blue 2005/03/29(火) 23:55:58
>メニューって WM_COMMAND じゃなかったでしょうか?
ごめんなさい、書いてありましたね。寝ぼけてました。orz

RAPT 2005/03/30(水) 00:20:34
モーダル? モードレス?
モーダルダイアログだったら、EndDialog(IDOK); などとします。

コルボックル 2005/03/30(水) 00:46:56
PAPTさん有難う御座います。

すいません(汗)
モーダル? モードレス?
どちらか分かりません。。。
ダイアログの生成はプロジェクト生成時そのままだと思うのですが。

とりあえず、
WindowProc()の
case ID_MENU_ITEM_1:
のところに
EndDialog(IDOK);
return(0);
を入れたら終了しました!

終了コードはメニューのIDとなっているのですが、
VC++は普通ですか?
(0とかで終了してませんがいいのでしょうか?)
なにとぞ、初心者なものなので、すいません。。。

風邪 2005/03/30(水) 09:36:53
えーと、検索エンジンで「モーダルダイアログ」と入力すれば
説明してるページがトップあたりに出てきますが調べましたか?
セキズイ反射のごとく質問するのではなく自分で調べることも重要です。

あと、「初心者、素人」を何度も書き込むのもいかがなものかと思います。
一度書けば、あー初心者さんなんだなーって分かります。
逆に何度も書かれると私みたいな意地悪な人の反感をかいます。
(初心者を免罪符にしてるのかー?みたいな感じで)

bros 2005/03/30(水) 10:13:41
もう解決したのかな?
参考までに、私がよくやる方法を紹介します。

http://www.expertmg.co.jp/html/cti/vctips/dialog.htm#ダイアログでEnter・Escを無
効にする

補足
 http://www.expertmg.co.jp/html/cti/vctips/index.htm
 このHPは、とても役にたちます。

コルボックル 2005/03/31(木) 23:35:47
[[解決]]
brosさん、わざわざありがとうございます。

終了コードについては分からないままですが、
とりあえず、終了する事ができたので、
解決とさせていただきます。

みなさんどうもありがとうございました。

古いスレッドには追加発言できません。