我重载了CButton类,
方法如下:
点击菜单的Insert/new class
然后输入子类 CDumpBtn, 父类为CButton (public继承)
class CDumpBtn : public CButton
{
........
};然后在Dialog应用程序中添加三个RadioButton(手工添加),
CDumpBtn m_btnRadio1;
CDumpBtn m_btnRadio2;
CDumpBtn m_btnRadio3;//再添Dialog上放一个普通Button
//然后在XXXDlg.cpp文件的DoDataExchange函数体中添加(手工添加)DDX_Control(pDX, IDC_RADIO1, m_btnRadi1);
DDX_Control(pDX, IDC_RADIO2, m_btnRadi2);
DDX_Control(pDX, IDC_RADIO3, m_btnRadi3);//再添加普通Button的BN_CLICKED事件,
void CXXXDlg::OnButton1()
{
CString strTemp;
BOOL bFlag = ((CMyButton*)GetDlgItem(IDC_RADIO1))->GetCheck();
if ( bFlag )
{
strTemp = "TRUE";
}
else
{
strTemp = "FALSE";
}
AfxMessageBox(strTemp);}编译成功,运行后,RadioButton表现得和平时一样,三个RadioButton同时只有一个能被选中,点击其中一个未被选中的RadioButton,则另外 一个被选中的会自动Uncheck,同时Check当前被点击的,
但问题是,((CMyButton*)GetDlgItem(IDC_RADIO1))->GetCheck();总是返回TRUE,不管第一个Radio是否被选中,没有check标记时也返回TRUE,
如果删除DoDataExchange的三行/*
DDX_Control(pDX, IDC_RADIO1, m_btnRadi1);
DDX_Control(pDX, IDC_RADIO2, m_btnRadi2);
DDX_Control(pDX, IDC_RADIO3, m_btnRadi3);
*/后,((CMyButton*)GetDlgItem(IDC_RADIO1))->GetCheck();能得到正确值,此时三个RadioButton也互斥的被选中,但此时,如果在CDumpBtn中添加代码,如设置风格为BS_OWNERDRAW,却一行都不会执行???请高手回答???
非常感谢

解决方案 »

  1.   

    CMyButton是什么BOOL bFlag = ((CMyButton*)GetDlgItem(IDC_RADIO1))->GetCheck();是CDumpBtn 吧
      

  2.   

    还有GetCheck的返回值不是true和false
    不是BOOL刑的int GetCheck( ) 
    const; BST_UNCHECKED Button state is unchecked. BST_CHECKED Button state is checked. BST_INDETERMINATE Button state is indeterminate; applies only if the button has the BS_3STATE or BS_AUTO3STATE style. 所以得
    int n = ((CMyButton*)GetDlgItem(IDC_RADIO1))->GetCheck();if (n == BST_CHECKED)
    选中
      

  3.   

    没仔细看,不过你完全可以先用向导生成CButton类型的空间变量和消息响应,然后再将CButton修改为CMyButton就可以了,不用全部手工来添加代码。
      

  4.   

    嗯。弄错了GetCheck的意义。
    不过多个radio button为什么不用GetCheckedRadioButton呢?
      

  5.   

    谢谢 handsomerun(毛毛) 的回复,我照你这样做了,可还是不行啊!
      

  6.   

    To : : pomelowu(羽战士) 我在类的成员函数中怎么知道 GetCheckedRadioButton 的参数啊???
      

  7.   

    ,可还是不行啊!
    这个不行是指什么不行,呵呵如果是GetCheckedRadioButton那么GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3)返回的那个cwnd指针就是你那个被check的button啊
      

  8.   

    GetCheckedRadioButton 的第一个参数是第一个radio button的id,第二个参数是最后一个radio button的id。
    返回一个CWnd指针,就是当前选中的radio button的指针ps,BST_CHECKED == 1
    BST_UNCHECKED == 0
      

  9.   

    这不是重载的问题,你用CButton类先利用MFC试一下,结果将一样;
    另:可利用MFC的DDX_Radio,
      得到0、1、2,分别表示IDC_RADIO1、IDC_RADIO2、IDC_RADIO3被选中;
      得到-1则三个都没选中。
      

  10.   

    TO: pt2519515(爱好者) 你说得很对,把派生的Button换成CButton结果也是一样,我的目的是想自绘RadioButton,谁有办法吗????帮帮我吧!
      

  11.   

    帮我想想办法啊,我要自绘RadioButton!!!!!!
      

  12.   

    自绘和你的选择行为是没有关系的
    只需要在你子类中重载 DrawItem 就行了,这里边GetCheck看是否被选 中
      

  13.   

    void CBeautyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
    { // TODO:  添加您的代码以绘制指定项
    CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
    UINT style = GetWindowLong(GetSafeHwnd(), GWL_STYLE);

    if ((style & BS_RADIOBUTTON) || (style & BS_AUTORADIOBUTTON))
    {
    if (lpDrawItemStruct->itemAction == ODA_SELECT)
    {
    pDC->MoveTo(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.top);
    pDC->LineTo(lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.bottom);
    pDC->MoveTo(lpDrawItemStruct->rcItem.right, lpDrawItemStruct->rcItem.top);
    pDC->LineTo(lpDrawItemStruct->rcItem.left, lpDrawItemStruct->rcItem.bottom);
    }
    else
    {
    pDC->Rectangle(&lpDrawItemStruct->rcItem);
    }
    }
    }
      

  14.   

    TO:  Mackz(在相互) 感谢您的回复,这样是可以重绘的,但重绘以后,我怎么知道是不是被Checked?好象自绘了RadioButton后,GetCheck()永远返回FALSE了.
      

  15.   

    好象自绘了RadioButton后,GetCheck()永远返回FALSE了.
    -----------------------------------------------------------------------------
    不会的,自绘只是自绘,和选中与否没有关系