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 を使っています。
自力で色々やらなくても、
子ダイアログ(この場合 PropertySheet)に
DS_CONTROL スタイルを付け足したらうまくいきませんか?
すみません、遅くなりました。返答ありがとうございます。
C++に関しては初心者なので
>DS_CONTROL スタイルを付け足し
の方法がよくわからないのですが、もう少し詳しく教えてもらえませんか?
もし、以下のような部分があれば、
m_pSheet->Create(ハンドル, スタイル, 拡張スタイル);
以下のようにします。
m_pSheet->Create(ハンドル, スタイル|DS_CONTROL, 拡張スタイル);
ありがとうございます。
その方法でやってみました。
が、上手くいかず、邪道とは思いますがTab移動したい時は
PropertyPage、PropertySheetのPreTranslageMessageでfalseを返し、
CFormViewのPretranslateMessageまで退避させ、そこで処理をすることで解決しました。
結局自己解決になってしまってすみません。
ご指導ありがとうございました。
ツイート | ![]() |