子ダイアログ間の移動

[戻る]
亀山 2010/03/15(月) 12:28:13
VC2008 MFCです。

CView派生クラスの中に子ダイアログを2つ作成しています。
調査的なものなので適当なソースになってしまいますが、
C***View::OnCreate()の中で以下のようにし、ダイアログ自体は表示されています。

m_dlg1.Create(CDialog1::IDD, this);
m_dlg1.MoveWindow(0, 0, 300, 300);
m_dlg2.Create(CDialog2::IDD, this);
m_dlg2.MoveWindow(300, 0, 300, 300);

View自身にはコントロールは無いため、
また、将来的には任意のCWnd派生のウィンドウにも
同じように子ダイアログを置くかもしれないので、
CFormViewではなくCViewをそのまま使っています。

この子ダイアログ間をTabキーで行き来できるようにしたいのですが、
以下のような方法を組み合わせて試してみても実現できていません
(子ダイアログ内でループしてしまう)。
正しい方法をご存じのかたはいらっしゃいませんでしょうか。

1:
2つの子ダイアログにDS_CONTROLを設定

2
C***View::PreCreateWindow()の中で
cs.dwExStyle |= WS_EX_CONTROLPARENT;
を追加

3:
C***View::PreTranslateMessage()を以下のように作成
if (IsDialogMessage(pMsg)) {
    return TRUE;
}
return CView::PreTranslateMessage(pMsg);

仲澤@失業者 2010/03/15(月) 20:32:53
レス付きませんねぇ。

WS_EX_CONTROLPARENTはDLG内の子コントロールに適用するフラグ
で、そのコントロールの子(DLGから見ると孫)コントロールを、DLGの
子と同様にタブ移動させるためのフラグだったような気がします(やや弱気)。

それと、DS_CONTROLスタイルは、そのDLGの親がDLGでないと意味ないです。

そもそも、DLG1のどのコントロール(DLG1_CTRL_Last)にフォーカスがあるときに、
タブキーを押されたらDLG2のどのコントロール(DLG2_CTRL_First)にフォーカスを
移動したいのでしょう。

それが決まれば、DLG1_CTRL_Lastにフォーカスが一旦あたってから、
その後フォーカスを失った時点でDLG2_CTRL_Firstにフォーカスを
移動するコードが書けるでしょう。

当然DLG1_CTRL_Lastは上記条件が成立したことをDLG又はViewに
報告しなければなりません。

仲澤@失業者 2010/03/15(月) 20:37:50
えっと、書き忘れたので連投ご容赦。

Viewを全て覆うDLG_MAINにDLG1とDLG2を貼り付けた場合は、
両者がDS_CONTROLであれば、希望する動きになる可能性
が残されています。が、確認してません。あしからず。

亀山 2010/03/20(土) 23:14:59
> それと、DS_CONTROLスタイルは、そのDLGの親がDLGでないと意味ないです。

今回の子ダイアログの親はCViewなので、これが原因の一つっぽいですね。
それを思って3番のようにC***View::PreTranslateMessage()の中で
IsDialogMessage()を使ってみたのですが、それでもダメでした。

> Viewを全て覆うDLG_MAINにDLG1とDLG2を貼り付けた場合は、

これは
View
└ 親ダイアログ
    ├ 子ダイアログ
    └ 子ダイアログ
というような親子関係とすればよいということですよね。
子ダイアログの親となれるのは、やっぱりダイアログのみなのでしょうか。

自前でキー入力を見てもよいのですが、
SHIFT同時押しでは逆順にしたりとかいろいろありそうですし、
通常の親子ダイアログのように、タブキーだけでなくアクセスキーでも
移動できるようにしようとすると、自前はかなり難しくなりそうです。

もうちょっといろいろ試してみようと思います。
ありがとうございます。

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