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

    技术2022-05-20  36

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

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


    最新回复(0)