加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – MFC:RadioButton在CWnd子类中不起作用(灰显)

发布时间:2020-12-16 06:51:47 所属栏目:百科 来源:网络整理
导读:简介:我有一个从CWND派生的类(自定义窗口).这个自定义类有一个单选按钮(CButton)和一堆其他静态控件. 问题:当创建单选按钮时,它显示为灰色,单击它不会执行任何操作. 用于创建的代码非常简单: m_radioButton-Create(_T("rButton1.1"),WS_CHILD | WS_VISIBL
简介:我有一个从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.

欢迎任何建议.

侧面注意:MFC新手在这里,非常感谢您的帮助.

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

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

解决方法

我试图复制场景,但无法重现.从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"),25),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,400,400),200,NULL) == -1){
        return;
    }
    m_wndTest.SetWindowPos(NULL,120,500,SWP_SHOWWINDOW);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读