子ウィンドウへフォーカスを復帰するには?

解決


hiro  2011-08-07 04:59:07  No: 72863  IP: 192.*.*.*

apiを使用しています。
親ウィンドウに子ウィンドウA・子ウィンドウBがあり、子ウィンドウAがフォーカスを得ている状態で、
他のアプリケーションにフォーカス移動後、親ウィンドウにフォーカスが戻ったときに、
子ウィンドウAへフォーカスを移動するにはどうしたらよいのでしょうか?
今現在の対策としては、子ウィンドウAがフォーカスを得るときに、
現在のフォーカスしているHWNDを記録して、親ウィンドウがフォーカスを得るときに、
子ウィンドウをフォーカスしています。
この方法では存在していないウィンドウへメッセージを送らないように、
ウィンドウの作成破棄時のタイミングを考慮しなければならないので面倒です。

編集 削除
仲澤@失業者  2011-08-08 10:42:02  No: 72864  IP: 192.*.*.*

一般的にはhiroさんが施している処理で正しいですね。
皆さんも同じようにやっていると思います。
ただし、
>この方法では存在していないウィンドウへメッセージを送らないように、
>ウィンドウの作成破棄時のタイミングを考慮しなければならないので面倒で>す。
については、アプリケーションの振る舞いによりますよね。
いちいち子ウインドウの存在を検査しなければならない理由が
あるとすると、

1.当該の子ウインドウは親がアクティブでない(又はフォーカスを失って
  いる)状態で、つまり、ユーザーが操作できない状態であるにも
  かかわらず、閉じられる性質を持っている。
2.かつ、子ウインドウのHWNDを、親がまったく把握していない。

という、割と「まれ」な性質のアプリケーションの場合だけですよね(^^)。

編集 削除
hiro  2011-08-08 20:14:45  No: 72865  IP: 192.*.*.*

仲澤@失業者さんありがとうございます。
おかげで設計方針が固まりました。

>ウィンドウの作成破棄時のタイミングを考慮しなければならないので面倒で>す。

これは子ウィンドウを破棄するとデータを更新する使用になっていたので、
プログラム終了前データを管理するため安易に子ウィンドウを想定外の方法で
破棄してしまったことによる副産物でした。

編集 削除