フォーカスが設定されていたコントロールを取得するには


kun  2004-03-06 00:51:46  No: 53269

ダイアログが非アクティブ時に、フォーカス(タブストップ)があるコントロールを
取得したいのですが、そういうメッセージ等は用意されているのでしょうか。
(ダイアログがアクティブの時は GetFocus() で取得できるのですが)

例を上げますと、
ダイアログ1(モードレス)にa、b、c、3つのチェックボックスがあります。
ダイアログ2(モードレス)にはボタンAがあり、ボタンAをクリックすると
ダイアログ1のa、b、cの現在タブストップが在る(最後にフォーカスがあった)
チェックボックスにチェックをつける、(この時ダイアログ1はアクティブにならない)
という風な処理しています。

「ダイアログ1のa、b、cのどれに現在フォーカスあるか」なのですが
これは、メッセージ等で取得する方法は無いのでしょうか。
どれにフォーカスがあったかという情報を自分で管理しておかなければダメなのでしょうか?

ダイアログがアクティブに戻った時には以前フォーカスがあったコントロールに
フォーカスが再設定される事や、WM_NEXTDLGCTL メッセージから
ダイアログで「どのコントロールにフォーカスがある」という情報を管理している
ように思えるのですが、それを取得する方法はないのでしょうか?

ダイアログ自体で情報を持っているのならば自分が同じ情報を持つ必要は無い、
と思い今回質問させてもらいました。
よろしくお願いします。


kun  2004-03-06 00:54:03  No: 53270

すみません。環境記載を忘れてました。
Win98 VC6.0+SP5 SDK/MFC拘らず


hiroyuki  2004-05-24 20:44:35  No: 53271

ダイアログ1とダイアログ2はどちらが親ウィンドウなのでしょうか?
よくわかりませんが、ダイアログ1を親にした場合
ダイアログ2のボタンAが押されたときの場合は
以下になります。

//ダイアログ1のヘッダーをインクルードする
#include Dialog1.h

//ダイアログ2のボタンAがおされた
void CDialog2::OnA_Button() 
{
   CDialog1* pDialog;

   //親ウィンドウであるダイアログ1のポインタを取得する
   pDialog = (CDialog1*)GetOwner();
  
pTestDlg->SetActiveWindow();

  CWnd* pCheck;
  pCheck = pTestDlg->GetFocus();
  ((CButton*)pCheck)->SetCheck(1);

//  pTextDlg->SetWindowText("aaaa");
}


hiroyuki  2004-05-24 20:55:02  No: 53272

ごめんなさい
間違って送信しました。
ただしいのは以下となります。
#include Dialog1.h
void CDialog2::OnA_Button() 
{
  CDialog1* pDlg1;
         //親ウィンドウであるダイアログ1のポインタを取得する
  pDlg1 = (CDialog1*)GetOwner();
  
          //ダイアログ2のボタンを押したので
          //ダイアログ2がアクティブになるので
          //ダイアログ1を強制的にアクティブにする
  pDlg1->SetActiveWindow();

  CWnd* pCheck;
         //ダイアログ1のチェックボックスの
          //フォーカスの当たっているコントロールポインタを取得します。
  pCheck = pDlg1->GetFocus();

          //コントロールポインタをCButtonクラスにキャストして
          //SetCheck関数をよんでチェックをONにします。
          //ちなみにキャストしないと
          //CButtonクラスのメンバー関数である
          //SetCheck関数を呼ぶことができません。
  ((CButton*)pCheck)->SetCheck(1);

}

こんな感じで、フォーカスのあるチェックボックスに
チェックを入れることができます。
あとは、状況に応じてカスタマイズして下さい。


hiroyuki  2004-06-24 21:18:51  No: 53273

Kunさんへ
Kunさんの質問を回答してから、一ヶ月たちました。
まだ、解決していないんでしょうか?

もし、解決しているのであれば、解決方法を
記載して、ここを「解決」にして下さい。

意思表示がないと、回答した私が馬鹿にされている
ように思えます。
このようなことが続くと、だれもあなたの質問に
回答しなくなりますので、気をつけてください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加