画面右端の[×]ボタンが押されたことを判定するには?

[戻る]
まゆたん 2001/03/05(月) 19:38:34
こんばんわ。まゆなです。
ダイアログベースでプログラム作ってるんですけど、
エディットボックスのキルフォーカスイベントで、
こんなことをやりたいんですが、やり方がわかんなくって、
困っています。

1)エディットボックスのなかみがNULLのとき、
  そのエディットボックスがフォーカスを失うと、
  メッセージボックス「字を入れてね。」を表示します。

2)画面左端をクリックすると、
  何も表示せずに画面を閉じる。


でも、キルフォーカスイベントは、キルした後、
どのボタンが押されても、平等に発生する(あたりまえですよね)
ので、2)で書いたようなことはできないですよね。

でも、もし、

  if("[×]にフォーカスがあっている")
    {
        return;
    }

って書ければ、2)ができると思うんです。
(でも、[×]にフォーカスが合う以前に、キルイベントが発生してるなら、
 この方法じゃダメですね・・・)

もし、2)ができるような方法があったら、
教えてください。
お願いします。

まゆたん 2001/03/05(月) 20:13:04
ちょっと、書き方がへたで、「右端」か「左端」か、
混乱させてしまったまもしれません。

ごめんなさい。

わたしが言いたい[×]ボタンとゆうのは、
画面「右端」の、クリックしたら画面が閉じるボタンのことです。
2)で書いた「左端」は、わたしの書き間違いです。
ごめんなさい。

よく、最小化・最大化ボタンの右となりにチョコンとある、
あのボタンです。
(名前がわからないので、[×]ボタンって書きました。
 困惑させてたら、ごめんなさい。)

ご迷惑をおかけして、すみません。

Hal 2001/03/05(月) 21:11:45
次のようにすればできますよ。
まず、エディットコントロールをサブクラス化します。
そして、そのクラスのpublicメンバー変数に
メインダイアログの終了可否を判定するフラグを追加します。
KillFocus()については、サブクラス化したクラス内で
イベントを追加してください。
KillFocus()内では、追加したフラグが立っていなかったら
メッセージを表示し、立っていなかったらメッセージを
表示しないように記述します。
後は、メインダイアログにOnClose()イベントを追加して
OnClose()内で、追加したフラグを立ててやることで
実現できます。
試してみてください。

まゆたん 2001/03/06(火) 09:28:23
Halさん、お返事ありがとうございます。

>まず、エディットコントロールをサブクラス化します。
>そして、そのクラスのpublicメンバー変数に
>メインダイアログの終了可否を判定するフラグを追加します。
>KillFocus()については、サブクラス化したクラス内で
>イベントを追加してください。

すみません、「サブクラス化」の方法が、よく分かっていないんです。
クラスウィザードや、コントロールのプロパティを見ても、
それらしいところは見つかりませんでした。

それとも、コーディングの方で記述してあげないといけないんでしょうか?
(〜.cppファイルとか、〜.hのどこかに?)

OnCloseイベントのほうは、追加することができました。
クラスウィザードで、ダイアログのWM_CLOSEイベントを追加したら、
それがOnClose()イベントになりました。
(これでいいんですよね?)

もし、よろしければ、「サブクラス化」する方法について、
どうやったらコントロールを「サブクラス化」できるのか、
教えていただけないでしょうか。
よろしくお願いします。

Hal 2001/03/06(火) 10:59:15
Halです。
サブクラス化のやり方については、冷たいようですが
ここでは、説明しません。自分で調べて理解して作成してください。
プログラマにとって自分で悩み、考えることが必要だからと思うからです。
サブクラス化するということは、今回のエディットコントロールについて
言えば、CEditクラスから派生した自前のクラスを作るということです。
今後、ウィンドウズアプリケーションを作っていく上でサブクラス化することは
避けて通れない道です。クラスウイザードでは通常追加できないイベントや
コントロール間での引数の受け渡しなど、サブクラス化の技術を習得すれば
割と簡単にできるようになります。
その代わり、自分でコーディングする部分がかなり増えまが・・・。
是非チャレンジしてみてください。
コントロールについては、現段階ではリソースエディタを使用して作っていると
思いますが、それでした手始めにSubclassDlgItem()を調べていかがでしょうか。
それでは。

Hal 2001/03/06(火) 11:10:44
Halです。
サブクラス化のやり方については、冷たいようですが
ここでは、説明しません。自分で調べて理解して作成してください。
プログラマにとって自分で悩み、考えることが必要だからと思うからです。
サブクラス化するということは、今回のエディットコントロールについて
言えば、CEditクラスから派生した自前のクラスを作るということです。
今後、ウィンドウズアプリケーションを作っていく上でサブクラス化することは
避けて通れない道です。クラスウイザードでは通常追加できないイベントや
コントロール間での引数の受け渡しなど、サブクラス化の技術を習得すれば
割と簡単にできるようになります。
その代わり、自分でコーディングする部分がかなり増えまが・・・。
是非チャレンジしてみてください。
コントロールについては、現段階ではリソースエディタを使用して作っていると
思いますが、それでした手始めにSubclassDlgItem()を調べていかがでしょうか。
それでは。

2001/03/06(火) 11:40:31
Halさんの言われる事も解りますので、調べ方のみを・・・

MSDN使用、「テクニカルノート」で検索、
「カテゴリ別テクニカルノート」を選択、

「カテゴリ別テクニカルノート」のウィンドウクラス登録に
コントロールのサブクラス化について書いてあります。

2001/03/06(火) 11:49:24
追記です。

Inside Visual C++ (アスキー発行)にもサブクラス化について書かれています。

まゆたん 2001/03/06(火) 13:14:38
Halさん、重さん、ありがとうございます。

Halさんが言ってくれたとおり、
自分で調べて解決方法を見つけていかないと、
いつまでも身につきませんね。

甘えた発言をしてしまったこと、反省します。

Halさんと重さんのお心づかいには、
とっても感謝しています。

まだ、サブクラス化の方法については
調べているところですが、
もし、できたら、ご報告させていただきたいと思います。

Halさんが注意してくれたこと、心にとめておきます。
まず自分で調べられることは調べて、
質問するのはその後にするべきですよね。

重さん、調べ方を教えてくれて、
ありがとうございます。

これからも、よろしくお願いします。

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