1.在Menu\View\Resource Symbols中建立一些连续的ID,比如IDC_MYBUTTONS值为900,在此之后要留出足够多连续的空的ID。
2.以做按钮数组为例:在头文件中定义一组按钮指针,我这里定义16个:
CButton* m_pButton[16];
3.在需要建立控件数组的地方,比如Dialog的InitDialog()中,生成按钮:
for(int i=0,j=0,k=0;i<16;i++,k++){
if(i>0 && i%4==0){
j+=100;
k=0;
}
this->m_pButton[i] = new CButton;
//this->m_pButton[i]->Create(TEXT("按钮标题"),BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(j,k*40,j+100,k*40+40),this,IDC_MYBUTTONS+i); //CRect中指定按钮的位置与大小。
CString s;
s.Format("%d", i);
this->m_pButton[i]->Create(TEXT(s.GetBuffer(s.GetLength())),BS_PUSHBUTTON|WS_CHILD|WS_VISIBLE,CRect(j,k*40,j+100,k*40+40),this,IDC_MYBUTTONS+i); //CRect中指定按钮的位置与大小。
}
运行效果如下:
4.控件生成后要自己做消息映射,ClassWizard不支持。
在CPP文件中建立消息映射:
ON_COMMAND_RANGE(IDC_MYBUTTONS,IDC_MYBUTTONS+15,OnButton)
注意:要在ClassWizard添加其他消息映射时必须先注释以上语句,否则会出错!
在头文件中声明响应消息的函数:
afx_msg void OnButton(UINT nID);
在CPP文件中实现消息响应函数:
void CAbcDlg::OnButton(UINT nID)
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItem(nID)->GetWindowText(str);
MessageBox("该按钮的标题是:"+str);
}
上面比较关键的是在做响应函数时要带UINT nID参数,否则在函数中就无法分辨是一组控件中的哪一个产生的消息。有了nID就可以很方便的用GetDlgItem(nID)来获得指向该控件的指针,并对控件进行必要的操作。