`
helpbs
  • 浏览: 1159389 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

分享到:
评论

相关推荐

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

    对于按钮动态生成的文章网上很多,但看过之后会发现它们的响应函数似乎都做得是那样的生硬,在一些情形下并不适用,我也看过一篇针对此问题的论文“一种基于VC_的动态生成控制按钮的方法”在文中作者使用ON_CONTROL_...

    VC++常用的共用函数100多页

    ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给...

    PT80-NEAT开发指南v1.1

    事件驱动和消息响应机制 ..................................................................................................................... 17 建立一个应用程序 ..........................................

    在单文档程序中动态切换多个窗体的源码程序

    &lt;br&gt; (二) 点选菜单"Insert"、"Resource…",在弹出的"Insert Resource"对话框中"Dialog"树 里的"IDD_FORMVIEW",点击"New"按钮,生成了一个新的窗体,将其ID号改为"IDD_NEXTFORM"。 在原有的窗体上...

    VC++常用功能实例

    ◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给...

    Visual C++ 2005入门经典--源代码及课后练习答案

    7.4.4 在构造函数中使用初始化列表 320 7.5 类的私有成员 320 7.5.1 访问私有类成员 323 7.5.2 类的友元函数 324 7.5.3 默认复制构造函数 326 7.6 this指针 328 7.7 类的const对象 331 7.7.1 类的...

    MFC的程序框架剖析

    这个函数很特殊,它本身是个消息响应函数,当我们点击ID为ID_FILE_NEW的菜单时,会产生一个命令消息,由于命令消息可以被CCmdTarget类及其派生类来捕获,而CWinApp是从CCmdTarget派生出来的,因此可以捕获这个消息。...

    400个DreamWeaver插件

    mxp/以前的连接外部javascript文件的插件都做的一般,使用不直观,这个在object面板中加入了一个按钮,使用方便多了 mxp/使页面中的图片都恢复到原始大小,可以作用到单个页面或者整个站点,甚至是site窗口选中的...

    VC学习大纲 VC学习讲义

    AppWizard是一个原代码生成工具,是计算机辅助程序设计软件,Winmain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对...

    ExtAspNet_v2.3.2_dll

    -Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle="float:left;"属性。 -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle="float:left;"属性。 -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox...

    flex3的cookbook书籍完整版dpf(包含目录)

    在多个应用程序中访问同一个共享对象 17.8节. 记住用户输入文本框的内容 第十八章. 数据服务和服务端通信(574) 18.1节. 配置HTTPService 18.2节. 在Flex程序之间使用RESTful通信 18.3. 配置和连接RemoteObject 18.4...

    MFC多窗口例程

    演示如何在工程中拥有多个对话框,及如何在一个对话框中调用另一个对话框。 重点:1、多个对话框类的建立;2、对话框的模式(Modal)调用方法;3、Spin控件的使用。 新建一个基于对话框的MFC工程, 通过菜单...

    java源码包2

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...

    Visual C++ 2005入门经典.part06.rar (整理并添加所有书签)

    21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...

Global site tag (gtag.js) - Google Analytics