MFC中动态创建多个按钮并实现其消息响应
在MFC中,一般通过控件栏直接向对话框中添加按钮控件,并双击按钮添加该按钮控件的消息响应函数。但是经常我们需要根据程序输入或运行时信息在界面上动态生成一个或多个按钮,并分别添加消息响应,实现这一目标包括如下几步:
1.在类中声明按钮变量指针CButton* btn。
2.在类中声明并定义按钮控件的ID, buttonID=10000。
3.在类的OnInitDialog()函数中动态创建按钮。
btn = new CButton[n]; DWORD dwStyle = WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON; for(int i = 0; i < DBUtil::OrdnanceSiteNum; i++){ btn[i].Create(str, dwStyle,CRect(x1,y1,x2,y2),this,buttonID+i); btn[i].SetFont(GetParent()->GetFont()); }
上述代码中,n表示运行时获得的按钮控件的个数,一共创建n个按钮控件,且控件ID在buttonID~buttonID+n-1之间。
4.创建按钮消息响应。
(1)在对话框类的定义文件(.h文件)中声明消息响应函数OnButtonClick。
// Implementation protected: // Generated message map functions //{{AFX_MSG(COrdnanceLocus) virtual BOOL OnInitDialog(); //}}AFX_MSG afx_msg void OnButtonClick(UINT uID); DECLARE_MESSAGE_MAP()
注意,OnButtonClick函数必须声明在对话框类自动生成的控件响应函数声明列表的后面(上述代码中OnInitDialog函数就是自动生成的函数声明),即程序员添加的动态按钮消息响应函数声明应该在在//}}AFX_MSG和DECLARE_MESSAGE_MAP()两行之间,以免系统将其当做自动生成的消息响应函数。OnButtonClick函数的参数nID代表响应函数对应按钮控件的ID号。
(2)在对话框类的函数实现文件(.cpp文件)中定义消息映射ON_COMMAND_RANGE。
在函数实现文件中的消息映射部分(BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间)定义按钮控件与其消息响应函数之间的映射关系。
ON_COMMAND_RANGE(buttonID,buttonID+n-1,OnButtonClick)
对于所有动态创建的n个按钮(ID号在buttonID~buttonID+n-1之间),定义其消息映射函数为OnButtonClick函数,根据其输入ID分辨具体响应那个按钮。
注意:若是单个按钮,则消息映射的定义方式为ON_BN_CLICKED(IDC_BUTTON_ID, OnButtonFunc)
(3)实现消息响应函数OnButtonClick。
在对话框类的函数实现文件(.cpp文件)中给出具体的按钮消息响应