MFC:RadioButton在CWnd

时间:2016-04-26 04:50:33

标签: c++ winapi visual-c++ mfc

简介:我有一个从CWND派生的类(自定义窗口)。这个自定义类有一个单选按钮(CButton)和一堆其他静态控件。

问题:创建单选按钮时,它显示为灰色并单击它不会执行任何操作。 用于创建的代码非常简单:

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

我尝试添加

  

ON_BN_CLICKED(2001,method())

事件,但没有被触发。

我也有ShowWindow()和EnableWindow()方法,但这也没有用。

问题:由于此类不是从CDialog派生的,因此DDX不可用。这可能是问题吗?有办法解决它吗?我的消息映射只有ON_BN_CLICKED以外的SIZE,CREATE和DESTROY。

欢迎任何建议。

SIDE NOTE :MFC新手在这里,非常感谢您的帮助。

研究:我发现只有这个相关stack overflow question,但这对我的情况没有帮助。还遇到了这个cool page on mfc subclassing,但它没有回答我的问题。

侧面问题:由于我没有得到任何答案,这种情况是不是很常见,如果我根本不从CWND派生出来并从CDialog或其他东西派生出来,这是根本错误的吗? / p>

1 个答案:

答案 0 :(得分:0)

我尝试复制该方案,但无法重现。从CWnd派生不应该是任何问题。我在下面提供了示例代码,我创建了一个名为“CTestWindow”的自定义类,该类来自CWnd,并在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);