对话框和MDI中动态创建按钮CButton,并响应事件

来源:互联网 发布:js中字符串是引用类型 编辑:程序博客网 时间:2024/05/20 19:18

原文:http://blog.csdn.net/tmljs1988/article/details/6219168

 

一.对话框中动态创建按钮CButton:
(1)在对话框(如CAboutDlg)的类中加一个CButton数据成员
class CAboutDlg : public CDialog
{ ......
::CButton m_btn;//按钮
}

(2)在对话框CAboutDlg)的初始化函数中创建按钮对象:
BOOL CAboutDlg::OnInitDialog()
{
if ( !m_btn.Create( _T("123"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
CRect(  0,60,20,70),this, ID_BUTTON2)
)
{
  TRACE0("未能创建按钮/n");
  return FALSE;      // 未能创建
}

return TRUE;
}
其中BS_PUSHBUTTON表示是下压按钮(普通按钮),ID_BUTTON2为用户定义的按钮的ID号,以便与事件响应

函数绑定,ID_BUTTON2应有前面定义:
如 #define ID_BUTTON2 2000

(3)将按钮的ID号ID_BUTTON2与事件响应函数绑定:
(3.1)事件响应函数的声明:
class CAboutDlg : public CDialog
{ ......
::CButton m_btn;//按钮

afx_msg void OnBnClickedButton1();//事件声明,前面一定要加afx_msg
}
(3.2)按钮的ID号ID_BUTTON2与事件响应函数绑定
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
......
ON_BN_CLICKED(ID_BUTTON2, &CAboutDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
(3.3)事件响应函数的定义:
void CAboutDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox( _T("donow"));
}

========================================================================
二.MDI中动态创建按钮CButton:
(A)在视图view中创建CButton(按钮会显示在view窗口内):
(1)在CMDI_testView类中加入CButton的数据成员:
class CMDI_testView : public CView
{ ......
::CButton m_btn;//按钮
}
-------------------------
(2)重载OnCreate():
----------
(2.1)OnCreate()声明:
class CMDI_testView : public CView
{ ......
::CButton m_btn;//按钮

int OnCreate(LPCREATESTRUCT lpCreateStruct);
}
------------
(2.2)拦截OnCreate(),注意,此处一定要,否则不会调用OnCreate()函数
BEGIN_MESSAGE_MAP(CMDI_testView, CView)
ON_WM_CREATE() //拦截OnCreate()
ON_BN_CLICKED( ID_BUTTON1, &CMDI_testView::MSG)//ID_BUTTON1为按钮ID号,与MSG()绑定
END_MESSAGE_MAP()
-------------
(2.3)OnCreate()定义:
int CMDI_testView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
  return -1;

if ( !btn.Create( _T("123"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, CRect

(10,60,70,100),this, ID_BUTTON1))
//如果ID号是IDOK,但程序中没有把IDOK与某消息函数绑定也不行.
{
  TRACE0("未能创建按钮/n");
  return -1;      // 未能创建
}


return 0;
}
---------------------------------------
(3)定义按钮的事件处理函数MSG():
-------------
(3.1)MSG()声明:
class CMDI_testView : public CView
{ ......
::CButton m_btn;//按钮

afx_msg void MSG();//事件声明,前面一定要加afx_msg
}
-------------
(3.2)按钮的ID号ID_BUTTON2与MSG()函数绑定:
BEGIN_MESSAGE_MAP(CMDI_testView , CView)
......
ON_WM_CREATE() //拦截OnCreate()
ON_BN_CLICKED( ID_BUTTON1, &CMDI_testView::MSG)//ID_BUTTON1为按钮ID号,与MSG()绑定
END_MESSAGE_MAP()
-------------
(3.3)MSG()定义:
void CMDI_testView ::MSG()
{
// TODO: 在此添加控件通知处理程序代码
MessageBox( _T("donow"));
}

===========================================
特别注意:
(1)最好在视图view中创建CButton,这样可以响应按钮事件.如果是在CChildFrame或CMainFrame内创建

CButton,则只能显示按钮,但不能响应事件!!!!!!
这可能是因为在MDI(或SDI)中view挡在Mainframe的前面。此时假如编写针对Mainframe的mouseClick

事件,将不会有反应.


(2)ON_BN_CLICKED消息是CButton发送的唯一感兴趣的消息。它等同于CWnd中的ON_COMMAND消息,只是

一个更简单方便的同义词而已。