对于按钮动态生成的文章网上很多,但看过之后会发现它们的响应函数似乎都做得是那样的生硬,在一些情形下并不适用,我也看过一篇针对此问题的论文“一种基于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_...
◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给...
事件驱动和消息响应机制 ..................................................................................................................... 17 建立一个应用程序 ..........................................
<br> (二) 点选菜单"Insert"、"Resource…",在弹出的"Insert Resource"对话框中"Dialog"树 里的"IDD_FORMVIEW",点击"New"按钮,生成了一个新的窗体,将其ID号改为"IDD_NEXTFORM"。 在原有的窗体上...
◆如果在对话框中自定义一个消息的方法,假设对话框名为CXX◆ 28 ◆消息传递◆ 29 ◆在一个函数引用另外的一个对话框◆ 29 ◆全局函数的申明问题◆ 29 ◆在应用程序中*APP.CPP中的InitInstance()的事件◆ 29 ◆给...
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 类的...
这个函数很特殊,它本身是个消息响应函数,当我们点击ID为ID_FILE_NEW的菜单时,会产生一个命令消息,由于命令消息可以被CCmdTarget类及其派生类来捕获,而CWinApp是从CCmdTarget派生出来的,因此可以捕获这个消息。...
mxp/以前的连接外部javascript文件的插件都做的一般,使用不直观,这个在object面板中加入了一个按钮,使用方便多了 mxp/使页面中的图片都恢复到原始大小,可以作用到单个页面或者整个站点,甚至是site窗口选中的...
AppWizard是一个原代码生成工具,是计算机辅助程序设计软件,Winmain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对...
-Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle="float:left;"属性。 -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox...
-Button控件将不再自动拥有display:inline属性,如果希望两个按钮在一行显示,请为第一个按钮设置CssStyle="float:left;"属性。 -修正了弹出菜单的位置在Firefox下不正确的BUG(feedback:eroach)。 -为TriggerBox...
在多个应用程序中访问同一个共享对象 17.8节. 记住用户输入文本框的内容 第十八章. 数据服务和服务端通信(574) 18.1节. 配置HTTPService 18.2节. 在Flex程序之间使用RESTful通信 18.3. 配置和连接RemoteObject 18.4...
演示如何在工程中拥有多个对话框,及如何在一个对话框中调用另一个对话框。 重点:1、多个对话框类的建立;2、对话框的模式(Modal)调用方法;3、Spin控件的使用。 新建一个基于对话框的MFC工程, 通过菜单...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...
21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...
21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...
21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...
21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...
21.3.14 处理按钮单击事件 21.3.15 响应上下文莱单 21.4 小结 21.5 练习 第22章 在Windows Forms应用程序中访问数据源 22.1 使用数据源 22.2 访问并显示数据 22.3 使用DataGridView控件 22.4 在无约束模式中使用...