您的位置:首页 > 其它

在一个消息响应函数中响应多个动态生成的按钮点击事件

2009-06-25 11:25 746 查看
源代码下载地址(示例代码编译环境Visual studio 2008)

对于按钮动态生成的文章网上很多,但看过之后会发现它们的响应函数似乎都做得是那样的生硬,在一些情形下并不适用,我也看过一篇针对此问题的论文“一种基于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事件能用上述方法处理,其他控件的其他事件也可以运用上述方法处理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐