CEditのキャレット表示

[戻る]
max 2004/09/09(木) 15:32:38
はじめまして。
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の時にキャレットを表示させるにはどうしたらよいでしょうか?
よろしくお願いします。

dairygoods 2004/09/14(火) 16:24:42
SDIでは、フォーカスのあるコントロール表示になった場合に、
そのままフォーカスが残ってしまうようですね。
# 消えた状態でもキー入力できてしまいます。

そのため、再表示時にSetFocus()しても、
「俺はもうフォーカス持っているから何もしないよ〜ん」
となって、カレットの再表示をしてくれないようです。

というわけで、
こんな感じでできるかと思います。

CTabCtrl* pTab = (CTabCtrl*)GetDlgItem(IDC_TAB1);
if (i == 1){
    pEdit->ShowWindow(SW_HIDE);
    // エディットからフォーカスを引っぺがす。
    // (タブに移す事に特に意味は無い)
    pTab->SetFocus(); 
}else{
    pEdit->ShowWindow(SW_SHOW);
    pEdit->SetFocus();
}

dairygoods 2004/09/14(火) 17:19:27
訂正

× SDIでは、フォーカスのあるコントロール表示になった場合に、
○ SDIでは、フォーカスのあるコントロールが非表示になった場合に、

です。

max 2004/09/17(金) 10:08:32
[[解決]]
返事が遅れてしまって申し訳ありません。
dairygoods様のコードでキャレットを表示することが出来ました。

ありがとうございました。

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