Tabキーによるフォーカスの移動ができない

解決


くるりんぱ  2006-06-23 18:53:22  No: 62303

CFormViewの持つダイアログ(以下:ViewDlg)にリソース側で任意にコントロールを配置しています。
ViewDlg上にPropertySheetを配置し、さらにPropertyPageを配置しています。

見た目としてはWindowsのコントロールパネル→画面のプロパティのような形で、
OK・キャンセル・適用ボタンをプロパティシートではなくViewDlg上で配置しているといった感じです。

デフォルトの状態ではTabキーを押すとプロパティページ内のコントロールとページのタブにフォーカスが移動します。
画面プロパティでTabを押した時のOK・キャンセル・適用ボタンを飛ばしてフォーカスが移動している感じです。
それを画面プロパティのようにTabでViewDlg含む全てのコントロールに移動できるようにしたいのですが上手くいきません。

現状ではViewDlg上のコントロールにフォーカスがある状態からアクティブなプロパティページのコントロールにフォーカスを移動させることには成功しました。
下記はCFormViewに記述したものです。
m_pSheet はプロパティシートのポインタ、m_pPage1・m_pPage2はそれぞれプロパティページのポインタです。

BOOL CTestView::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_KEYDOWN) {
        switch (pMsg->wParam) {
            case VK_TAB:
                // Ctrl+Tabは基底処理でページ移動をさせる
                if (GetKeyState(VK_CONTROL) & 0x80) {
                    break;
                }

                // 印刷ボタンから各ページの最後尾のコントロールに移動
                if (GetKeyState(VK_SHIFT) & 0x80) {
                    if (m_pSheet->GetFocus() == GetDlgItem(IDC_PRINT)) {
                        m_pSheet->GetActivePage()->SetFocus();
                        if (m_pSheet->GetActivePage() == theApp.m_pKubun) {
                            m_pPage1->GetDlgItem(IDC_CTRL5)->SetFocus();
                        }
                        if (m_pSheet->GetActivePage() == theApp.m_pTanni) {
                            m_pPage2->GetDlgItem(IDC_CTRL6)->SetFocus();
                        }
                        return TRUE;
                    }
                }

                // ページのタブにフォーカスを移動
                else {
                    if (theApp.m_pSheet->GetFocus() == GetDlgItem(IDC_EXIT)) {
                        m_pSheet->GetActivePage()->SetFocus();
                        m_pSheet->GetTabControl()->SetFocus();
                        return TRUE;
                    }
                }
        }
    }

    return CFormView::PreTranslateMessage(pMsg);
}

同じように各プロパティページの最後尾のコントロールにフォーカスがある状態でTabを押すとCFormViewに記述した以下の関数を呼ぶようにしました。

void CTestView::TabSetFocusFirstCtrl()
{
    SetFocus();
    GetDlgItem(IDC_PRINT)->SetFocus();
}

問題はこの関数の2行目でプログラムが強制終了してしまうことです。
デバックしたところ、  GetDlgItem(IDC_PRINT)  でNULL値が返ってくることがわかりました。
ViewDlgに対する  SerFocus  の記述だけではいけないのでしょうか?
教えて下さい。

Windows NT 2000  /  Microsoft Visual Studio .NET 2003  を使っています。


dairygoods  2006-06-23 19:59:33  No: 62304

自力で色々やらなくても、
子ダイアログ(この場合 PropertySheet)に 
DS_CONTROL スタイルを付け足したらうまくいきませんか?


くるりんぱ  2006-06-26 23:59:55  No: 62305

すみません、遅くなりました。返答ありがとうございます。
C++に関しては初心者なので
>DS_CONTROL スタイルを付け足し
の方法がよくわからないのですが、もう少し詳しく教えてもらえませんか?


dairygoods  2006-06-27 00:22:37  No: 62306

もし、以下のような部分があれば、
m_pSheet->Create(ハンドル, スタイル, 拡張スタイル);

以下のようにします。
m_pSheet->Create(ハンドル, スタイル|DS_CONTROL, 拡張スタイル);


くるりんぱ  2006-06-27 02:23:56  No: 62307

ありがとうございます。
その方法でやってみました。
が、上手くいかず、邪道とは思いますがTab移動したい時は
PropertyPage、PropertySheetのPreTranslageMessageでfalseを返し、
CFormViewのPretranslateMessageまで退避させ、そこで処理をすることで解決しました。
結局自己解決になってしまってすみません。
ご指導ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加