先说一下 静态创建的方法:
单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别。
假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态。
我们先来看静态制作方法:在对话框中放置三个单选按钮,设置属性如下:
Radio1属性:Visible、Group、Tab stop、Auto
Radio2属性:Visible、Tab stop、Auto
Radio3属性:Visible、Tab stop、Auto
这样的属性设置就把三个单选按钮分成了一组,它们一次只能有一个被选中,若对话框中还有其它成组的单选按钮,使用时也会互不干扰。但这时还没有使第一个按钮处于选中状态。接着就用ClassWizard为这组单选按钮添加变量,这里只需为第一个单选按钮添加变量即可。设变量名为m_Radio,类型选为int型。在构造函数中ClassWizard把m_Radio的值设置为-1,我们把它改为0,这样在运行程序时可以看到第一个单选按钮处于选中状态了。之后,还应该用ClassWizard为三个单选按钮添加单击响应函数,在里面修改m_Radio的值对应三个单选按钮就可以了。
在这个静态创建时,是手工指定了Group属性.那么如何在动态创建时,指定这个属性呢.我在所有的方法里面找了一圈,没有发现.
那会是在哪儿设置呢,总得有个办法吧! 那就只省下哪一个办法了,就是 ModifyStyle 方法,看看这个方法里面有没有相应的样式!
我先查了按钮的样式
#define BS_PUSHBUTTON 0x00000000L
#define BS_DEFPUSHBUTTON 0x00000001L
#define BS_CHECKBOX 0x00000002L
#define BS_AUTOCHECKBOX 0x00000003L
#define BS_RADIOBUTTON 0x00000004L
#define BS_3STATE 0x00000005L
#define BS_AUTO3STATE 0x00000006L
#define BS_GROUPBOX 0x00000007L
#define BS_USERBUTTON 0x00000008L
#define BS_AUTORADIOBUTTON 0x00000009L
#define BS_PUSHBOX 0x0000000AL
#define BS_OWNERDRAW 0x0000000BL
#define BS_TYPEMASK 0x0000000FL
#define BS_LEFTTEXT 0x00000020L
#if(WINVER >= 0x0400)
#define BS_TEXT 0x00000000L
#define BS_ICON 0x00000040L
#define BS_BITMAP 0x00000080L
#define BS_LEFT 0x00000100L
#define BS_RIGHT 0x00000200L
#define BS_CENTER 0x00000300L
#define BS_TOP 0x00000400L
#define BS_BOTTOM 0x00000800L
#define BS_VCENTER 0x00000C00L
#define BS_PUSHLIKE 0x00001000L
#define BS_MULTILINE 0x00002000L
#define BS_NOTIFY 0x00004000L
#define BS_FLAT 0x00008000L
#define BS_RIGHTBUTTON BS_LEFTTEXT
#endif /* WINVER >= 0x0400 */
找到所有的样式,里面在没有相应的设置,与GROUP相关的,只有一个 BS_GROUPBOX ,我试了一下,这个样式的意思,就是将按钮改造成一个GROUPBOX,而不是指定 GROUP.不对. 除此之外,就只能找上一层的样式也就是 CWnd的样式了.
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
#define WS_CHILD 0x40000000L
#define WS_MINIMIZE 0x20000000L
#define WS_VISIBLE 0x10000000L
#define WS_DISABLED 0x08000000L
#define WS_CLIPSIBLINGS 0x04000000L
#define WS_CLIPCHILDREN 0x02000000L
#define WS_MAXIMIZE 0x01000000L
#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
#define WS_BORDER 0x00800000L
#define WS_DLGFRAME 0x00400000L
#define WS_VSCROLL 0x00200000L
#define WS_HSCROLL 0x00100000L
#define WS_SYSMENU 0x00080000L
#define WS_THICKFRAME 0x00040000L
#define WS_GROUP 0x00020000L
#define WS_TABSTOP 0x00010000L #define WS_MINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L #define WS_TILED WS_OVERLAPPED
#define WS_ICONIC WS_MINIMIZE
#define WS_SIZEBOX WS_THICKFRAME
#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
里面果真有一个 WS_GROUP ,这就是我想要的,于是
((CButton*)GetDlgItem(IDC_CHECK1))->ModifyStyle(BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON | WS_GROUP, 0);
至此 动态创建按钮组的方法也有了!