孙鑫VC++视频二十集的第九集有涉及。
部分参考了:http://blog.sina.com.cn/s/blog_4a87cb870100adrm.html

内容为:

每一个单文档程序,都固定的有一个CMainFrame类,要产生Button按钮。两种方法:

Way 1:

  1. 定义一个CButton类的对象btn。在MainFrm.h里定义一个private:类型的CButton btn;

  2. 在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数的return 0;前边加上btn.Create("豆豆的按钮",WS_CHILD|WS_VISIBLE,CRect(0,0,100,40),this,123);  注意:(1)btn不能放在OnCreate里,否则OnCreate的生命期结束了,就析构了btn了。(2)btn.Create里的第二个参数或上了一个WS_VISIBLE就不用调用btn.ShowWindow(SW_SHOWNORMAL)了。否则需要显示调用ShowWindow。(3)第四个参数之所以可以是this指针,因为它是指向对象,是从CWnd派生出来的,所以匹配。第五个参数随便制定,为int就好。

运行结果截图:VC 单文档添加按钮_VC添加按钮第二个参数或了一个BS_AUTORADIOBUTTON,显示为一个三态选择按钮。

Way 2:

  1. 在CLesson3View类上右键Add Member Viarable。也可以在Lesson3View.h里添加private:类型的 CButton btn;注意不是在MainFrm.h

  2. 在CLesson3View类上右键选择Add Windows Message Handlers,在New Windows Message/events:里选择WM_CREATE,选择Add Handler,点Edit Existing,看到多了一个Oncreate,在return 0前加代码即可。

运行结果截图:VC 单文档添加按钮_VC添加按钮_02

//////////////////////////////////////////////////////////////////////////////////////////

way1:

在MainFrm.h里定义

private:

CButton btn1;

CButton btn2;

CButton btn3;

在int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)函数的return 0;前边加上

btn1.Create("开始",WS_CHILD|WS_VISIBLE,CRect(240,5,320,25),this,123);

btn2.Create("暂停",WS_CHILD|WS_VISIBLE,CRect(325,5,405,25),this,124);

btn3.Create("结束",WS_CHILD|WS_VISIBLE,CRect(410,5,490,25),this,125);

运行显示为:

VC 单文档添加按钮_VC添加按钮_03
其中现实的”豆豆的按钮“对应下面的操作:

即way2。

可以知道,way1在CMainFrame类中创建的按钮在标题栏下的任务栏处。

way2在view类中创建的按钮在窗户的客户区内。

////////////////////////////////////////////////////////下面为按钮添加处理函///////////////////////////////////////////////////////////////////////////


(1)在窗户的客户区内添加按钮及其响应函数

参考:http://blog.sina.com.cn/s/blog_65bda7120100hfvb.html

第一步:添加一个按钮
首先在**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改成希望响应的消息类型就可以了。

/////////////////////////////////////////////////////////////////////////////////

在单文档的工具栏中添加按钮及其响应函数

在工具栏上的图标就是菜单栏中的快捷项。

比如工具栏的“打开”按钮,其ID就是菜单栏文件下“打开”选项的ID,故只需在工具栏上添加一个按钮,然后在菜单栏下建一个选项即可,二者ID设置相同。再对菜单栏下对应选项创建command响应函数(利用ClasWizard,在CMainFrame中添加Command消息映射即可)。

例如:

在Toolbar下添加一个按钮


VC 单文档添加按钮_VC添加按钮_04


双击工具栏中的T按钮,设置ID

VC 单文档添加按钮_VC添加按钮_05

再在菜单栏下添加一个选项

VC 单文档添加按钮_VC添加按钮_06

给菜单栏下的T选项添加消息响应函数:

在T上右击—>class wizard,MessageMaps:class name选择 CMain Frame,找到ID_ToolbarT,点击COMMAND,再点击ADD Function,Editing Code,在消息响应函数中添加一句:

AfxMessageBox(“hello world”);

编译,运行,点击T按钮后,

VC 单文档添加按钮_VC添加按钮_07


把菜单栏的“测试”菜单去掉后,工具栏中的T按钮仍可用。