原理:
利用窗体上的消息都会经OnCmdMsg进行路由处理的原理,在这里截获自己动态生成的那些控件,然后通过自定义消息发送出去(带上控件id),经自己的消息处理函数处理即可。
1、定义起始控件ID号,和自定义消息
UINT Start_CtlID = 1980;
#define DynamicBtnMessage WM_USER+200
后面动态创建的控件id号会基于Start_CtlID自增;
2、在OnInitDialog中动态创建控件
窗体类中定义:CArray
int btnw=120;int btnh = 50;//创建*3个button,顺序排列
for (int i=0;i<5;i++)
{
for (int j=0;j<5;j++)
{
CString str;
str.Format(_T("Cam%d"),Start_CtlID-1980);
r.left =100 + (j*btnw);
r.top =250 + (i*btnh);
r.bottom = r.top + btnh;
r.right =r.left + btnw;
CButton *btn = CreateButton(Start_CtlID,str,r, BS_FLAT);
btn->ShowWindow(SW_SHOW);
btnArray.Add(btn);
}
}
3 在OnCmdMsg中处理控件点击消息
BOOL CFormDlg::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
// 判断传进来的控件id位于动态创建button的id之间,并且命令nCode是控件命令(比如点击事件消息),注:其它系统事件也会走到这个函数里进行分发的。
if (nID>=1980 && nID<=Start_CtlID-1 && CN_COMMAND==nCode)
{
//发送自定义消息,并附上控件ID
PostMessage(DynamicBtnMessage,nID,NULL);
}
return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
4、在自定义消息处理函数中处理点击事件
在BEGIN_MESSAGEMAP和END_MESSAGE_MAP之间加入以下消息映射:
ON_MESSAGE(DynamicBtnMessage, &CpngFormDlg::OnDynamicBtnMessage)
在头文件中定义消息响应函数:
afx_msg LRESULT OnDynamicBtnMessage(WPARAM wParam, LPARAM lParam);
LRESULT CpngFormDlg::OnDynamicBtnMessage(WPARAM wParam, LPARAM lParam) {
g_ClickBtnID = (UINT)wParam-1980;
if (g_ClickBtnID>=0 && g_ClickBtnID<=100)
{
CString str;
str.Format(_T("button %d is clicked!"),g_ClickBtnID);//获取到点击的是谁
AfxMessageBox(str);
}
return TRUE;
}