はじめまして。
WindowsXP Home, VC++6.0SP6で開発を行っています。
MFC/SDIで
CTabCtrlのタブ切り替えにあわせてCEditの表示/非表示を
切り替えようとしているのですがCEditが表示された際に
キャレットが表示されなくなってしまいます。
キャレットは表示されていないだけで本来あるべき位置に
文字の入力は出来ています。
以下コードです。(CSditabtestViewはCFormView継承です)
void CSditabtestView::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
CEdit* pEdit;
pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
int i = ((CTabCtrl*)GetDlgItem(IDC_TAB1))->GetCurSel();
if (i == 1){
pEdit->ShowWindow(SW_HIDE);
}else{
pEdit->ShowWindow(SW_SHOW);
pEdit->SetFocus();
//pEdit->ShowCaret(); これを入れても変わりませんでした
}
*pResult = 0;
}
ダイアログベースで同じコードを用いた場合ではキャレットは正しく表示
されています。
また、下のコードのようにButtonで切り替えた際はSDI/Dialogどちらでも
キャレットが表示されます。
void CSditabtestView::OnButton1()
{
CEdit* pEdit;
pEdit = (CEdit*)GetDlgItem(IDC_EDIT1);
if (pEdit->IsWindowVisible()){
pEdit->ShowWindow(SW_HIDE);
}else{
pEdit->ShowWindow(SW_SHOW);
pEdit->SetFocus();
}
}
SDIの時にキャレットを表示させるにはどうしたらよいでしょうか?
よろしくお願いします。
SDIでは、フォーカスのあるコントロール表示になった場合に、
そのままフォーカスが残ってしまうようですね。
# 消えた状態でもキー入力できてしまいます。
そのため、再表示時にSetFocus()しても、
「俺はもうフォーカス持っているから何もしないよ~ん」
となって、カレットの再表示をしてくれないようです。
というわけで、
こんな感じでできるかと思います。
CTabCtrl* pTab = (CTabCtrl*)GetDlgItem(IDC_TAB1);
if (i == 1){
pEdit->ShowWindow(SW_HIDE);
// エディットからフォーカスを引っぺがす。
// (タブに移す事に特に意味は無い)
pTab->SetFocus();
}else{
pEdit->ShowWindow(SW_SHOW);
pEdit->SetFocus();
}
訂正
× SDIでは、フォーカスのあるコントロール表示になった場合に、
○ SDIでは、フォーカスのあるコントロールが非表示になった場合に、
です。
返事が遅れてしまって申し訳ありません。
dairygoods様のコードでキャレットを表示することが出来ました。
ありがとうございました。