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

对于按钮动态生成的文章网上很多,但看过之后会发现它们的响应函数似乎都做得是那样的生硬,在一些情形下并不适用,我也看过一篇针对此问题的论文“一种基于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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值