搜档网
当前位置:搜档网 › MFC中如何动态创建控件并响应其消息

MFC中如何动态创建控件并响应其消息

MFC中如何动态创建控件并响应其消息
MFC中如何动态创建控件并响应其消息

原理:

利用窗体上的消息都会经OnCmdMsg进行路由处理的原理,在这里截获自己动态生成的那些控件,然后通过自定义消息发送出去(带上控件id),经自己的消息处理函数处理即可。

1、定义起始控件ID号,和自定义消息

UINT Start_CtlID = 1980;

#define DynamicBtnMessage WM_USER+200

后面动态创建的控件id号会基于Start_CtlID自增;

2、在OnInitDialog中动态创建控件

窗体类中定义:CArray btnArray 以保存动态创建的按钮

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;

}

相关主题