連投すまんです。
ryoさんの実験について
http://support.microsoft.com/kb/125644
[FIX] プロパティ シートで編集が Esc キーを閉じる
[現象]
フォーカスが複数行エディット コントロール内にあるときに Esc キーを押してプロパ
ティ シートを IDCANCEL ボタンがある場合でも (OnCancel) を閉じます発生しませ
ん。 この問題も発生自体フォーカスが WM_GETDLGCODE メッセージに対する返信で、
DLGC_WANTALLKEYS または DLGC_WANTMESSAGE の値を返すその他の子コントロールである
ときにします
[状況}
Microsoft は、この資料の冒頭に記載した Microsoft 製品にかかわる問題であることを
確認済みです。 この問題は、Windows NT の Visual C++ バージョン 2. 10 で修正され
ました。
修正されたはずなのですが、復活ですか。
> また、VCのプロジェクトのプロパティで
> [構成プロパティ]-[C/C++]-[コマンドライン]を開き
> 追加のオプションの項目もマルチラインだったのでここでも試してみましたが
> やっぱり閉じることはありませんでした。
>
> マルチラインのときは閉じないのがデフォルトなのかも知れません
たしかにVisualStudioのプロパティやオプションのダイアログも
複数行のエディットボックスでは閉じないようです。
本来は閉じないのがデフォルトだったけど、
MS自身がCDialogのクラス内で気を利かせて閉じるようにコードを付け加えた結果、
CDialogを子ダイアログとして使うとそのままでは副作用が起きてしまう
ということですよね?
> そもそも子DLGなんだから、かってに閉じちゃだめなんであって。
> 本件での一番簡単な解決方法は、VSのDLG等がやっているように、
> MyDLG::OnCansel(){
> /*なんもしない*/
> }
> MyDLG::OnClose(){
> /*なんもしない*/
> }
> とすれば済む問題なんですね(vv;)。
それだと、親ダイアログ上に直接複数行エディットボックスを置いているときと
違う動きになってしまいます。
DS_CONTROLの子ダイアログで複数行エディットボックスが無い場合には、
OnCancel()のオーバーライド自体が不要ですよね。
親ダイアログのキャンセル処理に行きますから。
ところが、エディットボックスを複数行にしたとたんに
MyDLG::OnCancel()に来るようになってしまうのが問題なのです。
> 子ダイアログの場合、DS_CONTROLに限定して、何か細工をしたほうが良いと思います。
> # ESCキーで閉じたい子ダイアログもあります。
これは、
if (GetStyle() & WS_CHILD)
の部分にさらにDS_CONTROLも判定したほうがよいということですか?
> if (GetStyle() & WS_CHILD)
> の部分にさらにDS_CONTROLも判定したほうがよいということですか?
と思います。
MDIのChildFrameのようなダイアログを作りたい場合は、
子ダイアログのIDCANCELで閉じたいです。
逆の例として トップレベルウィンドウの一部分に子ダイアログを貼り付けたような
場合(ドッキングしたように見えるやつ)、ESCでメインが閉じるのはまずいとおもいま
す。
ただし、
DS_CONTROLで判定すべきか、WS_EX_CONTROLPARENTの方が良いのかはよくわかりません。
識者の方よろしく。
> 逆の例として トップレベルウィンドウの一部分に子ダイアログを貼り付けたような
> 場合(ドッキングしたように見えるやつ)、ESCでメインが閉じるのはまずいとおもいま
> す。
すみません、親にWM_CLOSEを送って閉じるのと混同していました。
この部分取り消します。
>> if (GetStyle() & WS_CHILD)
>> の部分にさらにDS_CONTROLも判定したほうがよいということですか?
>
> と思います。
>
> MDIのChildFrameのようなダイアログを作りたい場合は、
> 子ダイアログのIDCANCELで閉じたいです。
MDIアプリを作成したことが無いため、
そのようなケースがあることは考えていませんでした。
「WS_CHILDかつDS_CONTROLなら」という判定にしておきます。
ありがとうございます。