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

一.对话框中动态创建按钮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消息,只是

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

你可能感兴趣的:(command,Class,button)