在VC的Windows界面上动态创建几个CButton控件,虽然创建CButton的按钮样子正常,但是按钮就始终是禁用状态,其它控件都正常,找不出问题在哪了。
下面是部分代码:
//目的:用于保存当前登录账号的拥有的角色信息。Add by 石民生 on 2017.10.11 roleCount = pDoc->loginUserRoleDic.GetCount(); if (roleCount > 1) { pRadioButton = new CButton[roleCount]; CString strText(_T("")); CONST UINT MAX_CHECKBOX_WIDTH = 100; // 定义CheckBox的宽度 CONST UINT MAX_CHECKBOX_HEIGHT = 20; // 定义CheckBox的高度 CONST UINT MAX_CHECKBOX_X_GAP = 10; // 定义CheckBox之间的水平间隔距离 CONST UINT MAX_CHECKBOX_Y_GAP = 10; // 定义CheckBox之间的垂直间隔距离 CRect rect; rect.SetRectEmpty(); rect.bottom = 50; //从保存的字典中读取登录账号的角色信息加载供登录账号进行选择 CString roleName; int roleID; int i = 0; POSITION pos = pDoc->loginUserRoleDic.GetStartPosition(); while (pos) { pDoc->loginUserRoleDic.GetNextAssoc(pos, roleName, roleID); if (0 == (i % 2)) { rect.left = 115; rect.top = rect.bottom + MAX_CHECKBOX_Y_GAP; } else { rect.left = rect.right + MAX_CHECKBOX_X_GAP; } rect.right = rect.left + MAX_CHECKBOX_WIDTH; rect.bottom = rect.top + MAX_CHECKBOX_HEIGHT; strText.Format(_T("%s"), roleName); VERIFY(pRadioButton[i].Create(strText, WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_RADIOBUTTON, rect, this, IDC_ROLE_RADIO_LOGIN_SELECT + i)); i++; } pRadioButton[0].SetCheck(1);//默认选中该角色 }
最后查找原因,找到了出错的地方。
解决方法:
是因为在创建单选按钮时,使用了属性值为"BS_RADIOBUTTON",虽然可以创建出来单选按钮,但是为禁用状态,不能进行选择,如果改为"BS_AUTORADIOBUTTON"就正常可以使用了,即按钮是可用状态。对于复选按钮,我也进行了测试,如果在创建复选按钮时,如果使用了属性值为"BS_CHECKBOX",创建出来的复选按钮不能进行选择,即为禁用状态,如果将其替换为属性值"BS_AUTOCHECKBOX",即可正常使用,进行多选、复选。