在单文档视图(SDI)结构中,视图一般用来显示数据。但是,有时也希望在视图中显示按钮或其他的控件,以满足用户的需要。VC6.0没有直接给出在视图中添加按钮的向导(或许有,我没找到)。下面我将给出一个手动添加按钮并使按钮具有响应事件 的功能。
第一步:添加一个按钮
首先在
**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)); // 给按钮加载一个图标
{
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;
}
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
改成希望响应的消息类型就可以了。