前面有写过一次动态增加按钮与动态删除按钮,后来又发现了更好的办法,下面先记录一下供大家参考:
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;
}
}
}
这样就可以响应所有动态增加的按钮消息了哦~~