我重载了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,却一行都不会执行???请高手回答???
非常感谢
方法如下:
点击菜单的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,却一行都不会执行???请高手回答???
非常感谢
不是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)
选中
不过多个radio button为什么不用GetCheckedRadioButton呢?
这个不行是指什么不行,呵呵如果是GetCheckedRadioButton那么GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO3)返回的那个cwnd指针就是你那个被check的button啊
返回一个CWnd指针,就是当前选中的radio button的指针ps,BST_CHECKED == 1
BST_UNCHECKED == 0
另:可利用MFC的DDX_Radio,
得到0、1、2,分别表示IDC_RADIO1、IDC_RADIO2、IDC_RADIO3被选中;
得到-1则三个都没选中。
只需要在你子类中重载 DrawItem 就行了,这里边GetCheck看是否被选 中
{ // 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);
}
}
}
-----------------------------------------------------------------------------
不会的,自绘只是自绘,和选中与否没有关系