2016-04-26 14 views
4

はじめに:CWNDから派生したクラス(カスタムウィンドウ)があります。このカスタムクラスにはラジオボタン(CButton)とその他の静的コントロールがあります。CWndからサブクラス化されたクラスでMFC:RadioButtonが機能しない(グレー表示)

問題::ラジオボタンが作成されると、グレーアウトされてクリックされても何も起こりません。 コードを作成するために使用することは非常に簡単です:

m_radioButton->Create(_T("rButton1.1"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON , CRect(5,5,300,15), this,2001); 

私は

ON_BN_CLICKED(2001、メソッド())

イベントを追加しようとしましたが、それがトリガーになっていません。

私はShowWindow()とEnableWindow()メソッドも持っていますが、それもうまくいきませんでした。

質問:このクラスはCDialogから派生したものではないため、DDXは利用できません。それは問題になることができますか?それを回避する方法はありますか?私のメッセージマップは、ON_BN_CLICKED以外のSIZE、CREATE、DESTROYしか持っていません。

ご提案は大歓迎です。

SIDE NOTE:MFC初心者ここに、あなたの助けが大変ありがとうございます。

リサーチ:これは関連するstack overflow questionとしか見つかりませんでしたが、私の場合は役に立ちません。また、このcool page on mfc subclassingに出くわしましたが、私の質問には答えません。

SIDE質問:私はどんな答えが届かないので、このような状況は、共通されておらず、これは根本的に間違っている私はすべてのCWNDから派生し、CDialogのか、何か他のものから派生するべきではありませんされていますか?

+1

グループの最初のラジオボタンが 'WS_GROUP'セットを持っている、ともタブ内の最後のラジオボタンを以下のものは何でもコントロールすべきです注文。 –

+0

P.S.この問題は、ジェネリックな 'BUTTON'クラスではなく、' Create'コールで独自のボタンクラスを使用している可能性があります。 –

+0

それにもかかわらず、WS_GROUPを持たないことはこれらの問題を正しく引き起こすべきではありません。また、作成はCButtonに対して呼び出されています。問題は、私のカスタムクラス内のCButtonがグレー表示され、そのイベントを処理できないということです。私は質問の説明にそれを追加しましたので、より明確です。 – AdRoiT

答えて

0

シナリオを複製しようとしましたが、再現できませんでした。 CWndから派生しても問題ありません。以下のサンプルコードを提供しています。私はCWndから派生した "CTestWindow"というカスタムクラスを作成し、CTestWindowのOnCreate()の中にリボンボタンを作成しています。私はラジオボタンをクリックすることができ、メソッド()も期待どおりに呼び出されています。

IMPLEMENT_DYNAMIC(CTestWindow,CWnd) 
BEGIN_MESSAGE_MAP(CTestWindow, CWnd) 
    ON_WM_CREATE() 
    ON_BN_CLICKED(2001, method) 
END_MESSAGE_MAP() 

int CTestWindow::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
    CButton *m_radioButton = new CButton; 
    if (CWnd::OnCreate(lpCreateStruct) == -1) 
     return -1; 
    if(!m_radioButton->Create(_T("rButton1.1"), WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON , CRect(5,5,300,25), this,2001)){ 
     return -1; 
    } 
    return 0; 
} 

void CTestWindow::method(){ 
    AfxMessageBox(_T("I m clicked")); 
} 

カスタムウィンドウのインスタンスを作成するためのコードの下に検索:

CString strMyClass; 
    try 
    { 
     strMyClass = AfxRegisterWndClass(
      CS_VREDRAW | CS_HREDRAW, 
      ::LoadCursor(NULL, IDC_ARROW), 
      (HBRUSH) ::GetStockObject(WHITE_BRUSH), 
      ::LoadIcon(NULL, IDI_APPLICATION)); 
    } 
    catch (CResourceException* pEx) 
    { 
     AfxMessageBox(_T("Couldn't register class! (Already registered?)")); 
     pEx->Delete(); 
    } 
    if(m_wndTest.Create(strMyClass,_T("Custom Window"),WS_OVERLAPPEDWINDOW | WS_VISIBLE,CRect(0,0,400,400),this,200,NULL) == -1){ 
     return; 
    } 
    m_wndTest.SetWindowPos(NULL,120,120,500,500,SWP_SHOWWINDOW); 
+0

えええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ、私もそれを働かせることができました。 – AdRoiT