カーソルの置かれたエディットボックスのフォーカスを取得するには?

[戻る]
みっち 2002/12/07(土) 08:57:02
こんにちは。

10個あるエディットボックスに順に入力するとき、
現在カーソルの置かれているエディトはどれかを、
取得したいのです。
その後、別のダイアログで入力された値を、その
エディットに出力したいです。

どうしたらよいのでしょうか?

tib 2002/12/07(土) 09:10:19
CWnd::GetFocus()が使えると思います。

みっち 2002/12/07(土) 09:59:58
CEditにも、GetFocus()は使えるのでしょうか?
(ヘルプにはなかったのですが)

コントロールクラスのm_EDIT1で、
if(m_EDIT1.GetFocus == NULL)
    別のダイアログを表示
      ・
      ・
      ・
    m_EDIT1に、ダイアログに入力されたデータを格納
}

という処理を行いたいのですが。

tib 2002/12/07(土) 10:12:30
クラス階層図を見れば解ることですが、CEditはCWndを派生させてできたクラスです。
CWndの内容を継承していますので、CWndのpublicメソッドであるGetFocus()は当然、
CEditでも使えます。

みっち 2002/12/07(土) 11:39:25
何度も申し訳ありません。
最初はボタンを無効にしておいて、
任意のエディットにフォーカスがおかれたら、
ボタンを有効にしたいのですが、
このように書くと、画面が表示されたときにはもう、
ボタンが有効になっています。
(ちゃんと初期値設定では無効にしてあります)

どうすればよいのでしょうか?


int Position = 6 ;

switch(Position){
    case 6: if (GetFocus() == GetDlgItem(IDC_EDIT1))            
           CDataInput::m_Color.EnableWindow(TRUE) ;
            else
                CDataInput::m_Color.EnableWindow(FALSE) ;
       break ;
}

tib 2002/12/07(土) 12:08:28
どうも情報が足りないので多分に想像を含んでしまいますが、

このswitch文はどこで実装されているのでしょう?
CDataInputとは違うクラスなんですよね?

とりあえずデバッガを使って、EnableWindow(TRUE)の行にbreakpointを張ってみてくださ
い。画面が表示される前にこの行を通っていませんか? 恐らく、
・IDC_EDIT1というコントロールがまだ生成されていないので
 GetDlgItem()はNULLを返す。
・画面が表示される前でフォーカスが定まっていないので
 GetFocus()はNULLを返す。
・CDataInputは既に生成が済んでいて、m_Colorを有効にできる。

ということではないでしょうか。

RAPT 2002/12/07(土) 12:38:29
こんにちは、RAPTです。

このswitch文が、CDataInputとは違うクラスだとして。

CDataInput::m_Color ってのはstaticなメンバですか?
それならいいんですけど。

Windows98/VC++6.0std/SDK-may2002/ATL3.0/WTL7.0

tib 2002/12/07(土) 13:11:40
>ちゃんと初期値設定では無効にしてあります
と書いてあるので、staticなのだろうと判断しました。

まぁ、初期値設定をちゃんとしているつもりなだけで、実はちゃんとできていなかったと
いうケースも考えられますが。


以下、質問者さんへ。
このように、質問者から提供される情報が少ないと回答者はいろんなケースを想定して回
答しなくてはなりません。複数の解釈ができてしまう文章では回答意欲をそぐことにもな
りかねず、結果的に質問者が損をします。例えばこの場合、「ちゃんと無効にしてありま
す」ではなく、例えば、

ボタンはダイアログエディタにてプロパティの無効チェックボックスをonにしてありま
す。switch文全体をコメントアウトしてみると確かにボタンは無効のまま表示されました
ので、このswitch文が問題なのだろうということまでは解るのですがその先、問題をどう
突き止めていけばいいのかが解りません。

という風にでも書かれていれば、質問者がどこまで確認しているのかがよく分かって、よ
り早くより的確なアドバイスが得られやすいと思います。

みっち 2002/12/07(土) 13:20:38
tibさん

switch文はCDataInputクラス内にあります。
コードミスでした。

画面が表示される前に、EnableWindow(TRUE)を
通っていませんでした。


RAPTさん

m_Colorはコントロールボタンです。


tibさんの言う3点のとおりのようでした。
すみませんが、どこを直したらよいのでしょうか?
お願いします。

tib 2002/12/07(土) 13:37:10
要するに、

 if (GetFocus() == GetDlgItem(IDC_EDIT1))

という条件は間違いじゃないんだけど、GetFocus()とGetDlgItem()が両方ともNULLを返し
てくる場合がある、その場合は除外したい、ということですよね?

 GetFocus()とGetDlgItem()の結果が等しくて
 なおかつ、
 それぞれが返してきた値がNULLではない。

という条件でチェックすればいいのではないでしょうか。

みっち 2002/12/07(土) 14:10:18
tibさん、質問の仕方が悪かったようです。
今後、気をつけます。

条件判定については、理解できましたが、
画面が表示されてからフォーカスとエディットの
ポインタを得るには、どうしたらよいのでしょうか?

画面表示の Domodal() は、ドキュメントクラスに
書いています。
フォーカスの取得とボタンの有効化は、
CDataInput の OnInitDialog に書いています。

今、CDataInputクラスに Domodal() を書き足したら、
リソース不足で終了してしまいました。

説明がわかりにくかったらすみませんが、
よろしくお願いします。

tib 2002/12/07(土) 14:29:06
OnShowWindow()が使えると思います。これはウィンドウを閉じるときにも呼ばれるので使
い方には注意してください。

みっち 2002/12/07(土) 16:34:38
OnShowWindow()ですが、CDataInputクラスに
関数を作り、そちらに書きなおしました。
ですが、ダイアログが立ち上がる前にフォーカスが
参照されており、フォーカスが取得できません。

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