ラジオボタンのフォーカス移動とピクチャーコントロールの色変更


さくら  2006-06-26 23:27:13  No: 62323

はじめまして。2つほど教えて下さい。

ダイアログAとダイアログBを持つプログラムを作りました。
ダイアログAはラジオボタン1〜3(IDC_RADIO1〜3)からなるグループとその他のコントロールを持っています。
またラジオボタン1〜3のグループは
CButton     m_RdoBtn;
という変数を持っており、ダイアログAはダイアログBで
CDialogA    m_DialogA;
という変数で定義されています。
ダイアログAのPreTranslateMessage関数で、フォーカスがラジオボタン1〜3にある時にダイアログBにフォーカスを移し、ダイアログBで条件が満たされた時またダイアログAの選択されたラジオボタンにフォーカスを返すという処理がしたいのですが上手くいきません。

ダイアログAでラジオボタンのフォーカスの取得を確認
BOOL CDialogA::PreTranslateMessage(MSG* pMsg)
{
    if (GetFocus() == GetDlgItem(IDC_RADIO1) ||
        GetFocus() == GetDlgItem(IDC_RADIO2) ||
        GetFocus() == GetDlgItem(IDC_RADIO3)) {
            // フォーカスをダイアログBに移動させる処理
    }
}

ダイアログBからダイアログAのラジオボタンにフォーカスを移動する関数
{
    switch( m_DialogA.m_RdoBtn.GetCheck() ) {
        case 0 : m_DialogA.GetDlgItem(IDC_RADIO1)->SetFocus();    break;
        case 1 : m_DialogA.GetDlgItem(IDC_RADIO2)->SetFocus();    break;
        case 2 : m_DialogA.GetDlgItem(IDC_RADIO3)->SetFocus();    break;
    }
}

無理やり処理するとすれば以上のような形になると思いますが、今後ダイアログ2にフォーカスを移す条件が他のコントロールがフォーカスを持った時になる可能性があるのでもっと簡潔で応用のきく処理を使わなければなりません。

それともう一つ、
ピクチャーコントロールの枠の色(プロパティのColor)をプログラム中で変更する方法を教えて下さい。

もう一つスレを立てるのも気がひけるのでここで質問させていただきます。
プログラミング会社に入って3ヶ月の初心者ですのでわかりやすく教えていただければ嬉しいです。

OSはXPで使っているのは.NET2000です。


三草  2006-06-27 01:32:13  No: 62324

フォーカスの移動をまとめると。。。
  ダイアログAのラジオボタンクリック  →  ダイアログBをフォーカス移動
  ダイアログBで条件成立  →  ダイアログA(のラジオボタン)をフォーカス移動
それで、思ったように動作しないのか、簡潔な処理にしたいのかどちらでしょう?
また、どのようにうまくいかないのか、どういう処理が、簡潔で応用がきくとイメージしていらっしゃいますか?

ピクチャーコントロールのほうは、サブクラス化で実現できるようです。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200303/03030039.txt
WM_CTRLCOLORで一応試してみましたが、ピクチャーコントロールの枠色は変わらないようですね。

サブクラス化とは、コントロールに特別な処理(例:CButtonに絵を貼り付けたり)をさせるときに使います。
簡単に言うと、あるコントロールをベースに、自分でそのコントロールの処理を決めることが出来ます。
ご参照までに。。。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=659311


さくら  2006-06-27 18:34:17  No: 62325

ありがとうございます。

もう少し大まかにまとめると現状ではこんな感じです。
ダイアログAのラジオボタンにフォーカスが渡る  →
ダイアログBにフォーカス移動  →
ダイアログBで一定の処理が満たされる  →
ダイアログAの元いたコントロールにフォーカス移動

まず、ダイアログBにフォーカス移動する条件として、ダイアログAのうちどれかのコントロールがフォーカスを持った時、という前提があります。
現段階ではそれがラジオボタンであって、それに限定してしまえば最初に書いたプログラムで一応は処理ができるのですが、ダイアログBにフォーカス移動するためのコントロールが他のコントロールになる可能性があります。
上記の『ダイアログAのラジオボタンにフォーカスが渡る』のラジオボタンが他のコントロールに代わる可能性があるということです。
でもこの処理ではダイアログBに移動する条件が変わるたびにプログラムを書き換えなければならず、それは今後開発が拡大するにあたって非常にまずいので、フォーカス移動の条件がどのコントロールがフォーカスを持った時であってもプログラムを変更することなく処理がしたいのです。

ピクチャーコントロールの方は枠色を変えたかったのですが、それは無理なんですね。
わかりました。ありがとうございました。


三草  2006-06-27 20:17:17  No: 62326

動作を変えるのであれば、ソースもそれに応じて変更しなければならないかと。
そうではなくて、動的に移動条件を変更したいのであれば、

1.ダイアログBかどこかで、条件となるダイアログAのコントロールのウィンドウハンドルを取得、ダイアログAに通知
    (FindWindowEx()とかEnumChildWindows()とかで調べます)
2.ダイアログAでGetFocus()を使用し、フォーカスを持っているウィンドウハンドル取得
3.ダイアログAで1.のウィンドウハンドルと、2.で取得したウィンドウハンドルが一致するかチェック
4.一致していれば、ダイアログBにフォーカス移動

ってな感じでいかがでしょう?


三草  2006-06-27 20:46:21  No: 62327

たとえば、、、

DialogA.h
public:
    CWnd *m_pcWndKey;

〜ダイアログAで判断する前に〜

//ダイアログAのコントロールのウィンドウハンドル取得
//#直接ダイアログAの変数を参照/いじるのはよろしくないですが、説明なので。。。
m_DialogA.m_pcWndKey= FindWindowEx( m_DialogA->m_hWnd, NULL, NULL, "Button1" );

〜ダイアログAの条件判断〜

    //フォーカスを持っているコントロールのウィンドウハンドル取得
    CWnd *pcWndFocus = GetFocus();

    if( *m_pcWndKey== *pcWndFocus ){
        ASSERT( "Focus Agreement!" );
        //ダイアログBにフォーカス移動させる

    }


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

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






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