在单文档视图(SDI)结构中,视图一般用来显示数据。但是,有时也希望在视图中显示按钮或其他的控件,以满足用户的需要。下面是手动添加按钮并使按钮具有响应事件的功能的方法。
第一步:添加一个按钮 首先在 **View.h 中定义一个按钮标识 # define ID_BUTTON 100 其次给 C**View 类添加一个成员变量 CButton m_myButton; // 这条语句写在 **View.h 的类的定义中,要声明为 PUBLIC 类型 然后创建按钮实例 m_myButton.Create(_T(" 示例按钮 "), // 按钮的 caption 属性,按钮的显示 WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_ICON, // 按钮也是一种窗体,同样有窗体风格,这些常量通过或运算使按钮达到一定的效果,这些常量的含义可以参考 MSDN 。 CRect(20,320,50,340), // 这个参数指出按钮在视图中的位置和按钮的大小。 this, // 这个指针指向按钮这个窗体的父窗体 ID_BUTTON); // 这是刚才为按钮定义的常量,按钮的控制 ID 然后调用函数 m_MyButton.ShowWindow(SW_HIDE) 这个函数根据参数的样式显示按钮,此时的参数表示隐藏按钮,如果要显示按钮,可以以 SW_SHOW 作为参数,这样,就是在想用到按钮的时候调用函数 m_MyButton.ShowWindow(SW_SHOW) 显示出按钮。 说明:按钮在 C**View::OnCreate() 函数中初始化。这个函数是当窗体被创建的时候调用的一个初始化函数。像按钮这样的对象在这个时候初始化是比较合适的。 int C**View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; m_MyButton.Create(_T(" 示例按钮 "), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_ICON, CRect(20,320,50,340), this, ID_BUTTON); m_MyButton.SetIcon(AfxGetApp()->LoadIcon(ICON_SAVE)); // 给按钮加载一个图标 m_MyButton.ShowWindow(SW_HIDE); return 0;} 第二步:消息函数 此时的按钮是不能响应任何消息的。下面我们手动添加按钮的消息。 1. 声明函数原型 在 C**View 类的声明中声明一个 protected 类型的函数 //{{AFX_MSG(CSoftView) afx_msg void OnMyButton(); //}}AFX_MSG 通常的做法,也是 VC6.0 向导的做法,会将消息处理函数声明在 //{{AFX_MSG(CSoftView) ~~~ //}}AFX_MSG 标记中,当然,在 VS.NET 2003 中,我们将看不到这个标记。真正起作用的是 afx_msg ,它表明随后的函数是一个消息处理函数。 2. 函数的实现 下面实现函数,显然,这个函数也是 C**View 类的一个成员函数,所以在 **View.cpp 中实现 void C**View::OnMyButton() { MessageBox(" 你点击了我 "); } 3. 如果这个时候你就运行程序的话,按钮依然不会响应任何事件。因为事件的产生的消息是交给视图的,所以我们需要把消息从视图传给按钮,实现起来很简单,在 **View.cpp 中找到如下的标记: BEGIN_MESSAGE_MAP(C**View, CView) END_MESSAGE_MAP() 在这个标记中写入如下代码: ON_BN_CLICKED(ID_BUTTON, OnMybutton) 这句代码是说,让 ID_BUTTON 所指的对象响应单击( ON_BN_CLICKED )事件,事件的处理函数是 OnMybutton 。这是 MFC 的消息映射机制。 到此,一个可以响应单击事件的按钮就创建好了。如果要响应其他事件,可以按照这个方式创建,只需要改动这个过程中的第 3 步,将 ON_BN_CLICKED 改成希望响应的消息类型就可以了。 资料来源:http://blog.csdn.net/ninesuns02/article/details/2514658转载于:https://www.cnblogs.com/lxt287994374/p/3381736.html
相关资源:C MFC教程