CEditのキャレット表示 – プログラミング – Home

通知
すべてクリア

[解決済] CEditのキャレット表示


max
 max
(@max)
ゲスト
結合: 21年前
投稿: 2
Topic starter  

はじめまして。
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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

訂正

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

です。


返信引用
max
 max
(@max)
ゲスト
結合: 21年前
投稿: 2
Topic starter  

返事が遅れてしまって申し訳ありません。
dairygoods様のコードでキャレットを表示することが出来ました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました