您的位置:首页 > 其它

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

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