对于按钮动态生成的文章网上很多,但看过之后会发现它们的响应函数似乎都做得是那样的生硬,在一些情形下并不适用,我也看过一篇针对此问题的论文“一种基于VC_的动态生成控制按钮的方法”在文中作者使用ON_CONTROL_RANGE()解决了这个问题但是这样ID似乎总有上限,对于处理动态生成按钮的数目不确定的情况时,总让人感到不完美。好了,问题说到这相信大家已经清楚了,下面我给出我的解决方案。
一、创建一个基于对话框的工程并于stdafx.h中作如下宏定义
#define UM_BTNCLICKED WM_USER+1
本示例示例创建TestDBtn工程
二、从CButton类派生CMyButton类
//MyButton.h文件
#pragma once
// CMyButton
class CMyButton : public CButton
{
DECLARE_DYNAMIC(CMyButton)
public:
CMyButton();
virtual ~CMyButton();
protected:
afx_msg void OnBnClicked();//按钮点击响应函数
DECLARE_MESSAGE_MAP()
};
// MyButton.cpp文件
//仅列出OnBnClicked()函数
#include "stdafx.h"
#include "MyButton.h"
void CMyButton::OnBnClicked()
{
GetParent()->PostMessage(UM_BTNCLICKED,GetWindowLong(this->m_hWnd,GWL_ID));
}
三、在CTestDBtnDlg中作如下处理
1、在类声明中添加如下内容
public:
afx_msg void OnDestroy();
afx_msg LRESULT OnMyBtnClicked(WPARAM wParam, LPARAM lParam);
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;
2、在类实现文件中添加如下内容
LRESULT CTestDBtnDlg::OnMyBtnClicked(WPARAM wParam, LPARAM lParam)
{
if(wParam>99)
{
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;
}
}
}
return LRESULT();
}
void CTestDBtnDlg::OnDestroy()
{
CDialog::OnDestroy();
int nBtnCz=m_btnAry.GetSize();
for( int k=0;k<nBtnCz;k++)
{
delete m_btnAry[k].m_pBtn;
}
m_btnAry.RemoveAll();
}
3、按钮的动态生成
在CTestDBtnDlg::OnInitDialog()添加如下内容
int nBtnCz=5;
for(int i=0;i<nBtnCz;i++)
{
SBtnInfo btnInfo;
tsprintf(btnInfo.m_btnTxt,_T("按钮%d"),i);
m_btnAry.Add(btnInfo);
}
int btnLeft=22; //第一个按钮的左坐标
int btnTop=42;//第一个按钮的上坐标
int btnW=344;//按钮宽度
int btnH=23;//按钮高度
for( int k=0;k<nBtnCz;k++)
{
CMyButton * pBtn=new CMyButton;
int left=btnLeft;
int top=btnTop+k*btnH;
CRect btnRct(left,top,left+btnW,top+btnH);
pBtn->Create(m_btnAry[k].m_btnTxt,
WS_CHILD|WS_VISIBLE,
btnRct,this,100+k);
m_btnAry[k].m_btnId=100+k;
m_btnAry[k].m_pBtn=pBtn;
}
其他细节请参看源代码
OK,大功告成,现在编译一下看看效果吧!
当然,不止Button控件的clicked事件能用上述方法处理,其他控件的其他事件也可以运用上述方法处理
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/colduwu/archive/2009/06/25/4296947.aspx