动态增加按钮,动态删除按钮,一个函数响应动态增加的N个按钮的消息~

来源:互联网 发布:星际2经典比赛 知乎 编辑:程序博客网 时间:2024/05/21 11:00

前面有写过一次动态增加按钮与动态删除按钮,后来又发现了更好的办法,下面先记录一下供大家参考:

1.在对话框头文件中加入以下代码:

private:
#pragma pack(push,1)
struct SBtnInfo
{
TCHAR m_btnTxt[20];//用于记录动态生成的按钮的按钮文本
CMyButton * m_pBtn;//指向按钮类的指针
UINT m_btnId;//记录当前按钮的ID
SBtnInfo(){ memset( this, 0, sizeof(SBtnInfo) ); }
};
#pragma pack(pop)
//存储所用动态生成的按钮的信息
CArray <SBtnInfo,SBtnInfo&> m_btnAry;

以上都有注释,就不多说了,不过这里用到了CArray,故需要包含头文件afxtempl.h,即:#include "afxtempl.h"

2.在对话框的原文件中需要动态加入按钮的地方加入代码如下:

                   for(int ii=0;ii<mydlg.m_HH;ii++)
for(int jj=0;jj<mydlg.m_VV;jj++)
{
                SBtnInfo btnInfo;
sprintf(btnInfo.m_btnTxt,_T("%d"),ii*mydlg.m_VV+jj);
m_btnAry.Add(btnInfo);
}


 for(int i=0;i<mydlg.m_HH;i++)
for(int j=0;j<mydlg.m_VV;j++)
{
CMyButton * pBtn=new CMyButton;
CRect rcButton(50*j, 30*(i+4), 50*(j+1), 30*(i+5)); // 按钮在对话框中的位置

pBtn->Create(m_btnAry[i*mydlg.m_VV+j].m_btnTxt,
0,
rcButton,this,10000+i*mydlg.m_VV+j);
m_btnAry[i*mydlg.m_VV+j].m_btnId=10000+i*mydlg.m_VV+j;
m_btnAry[i*mydlg.m_VV+j].m_pBtn=pBtn;
pBtn->ShowWindow(SW_SHOW);

}

在需要删除动态加载的按钮的地方,加入代码:

                      int nBtnCz=m_btnAry.GetSize();
for( int k=0;k<nBtnCz;k++)
{
delete m_btnAry[k].m_pBtn;
}
m_btnAry.RemoveAll();

这样就完成了动态按钮的添加与删除,接下来再说说响应动态按钮的响应,


首先从CButton中派生出新类CMyButton,然后重载OnLButtonUp消息,

并传送自定义消息

GetParent()->PostMessage(WM_BTNCLICKED,GetWindowLong(this->m_hWnd,GWL_ID));

而后在对话框中处理自定义消息WM_BTNCLICKED,代码如下:

LRESULT CSHSTiHua2Dlg::OnMyBtnClicked(WPARAM wParam, LPARAM lParam)
{
if(wParam>=10000)
{
int nBtnCz=m_btnAry.GetSize();
for( int k=0;k<nBtnCz;k++)
{
if(m_btnAry[k].m_btnId==wParam)
{
CString cs;
cs.Format(_T("你点击的按钮的ID为: %d"), wParam);
MessageBox(cs);
return true;
}
}
}

这样就可以响应所有动态增加的按钮消息了哦~~