CButton:
MFC 中的CButton类继承与CWnd类,利用CButton类可以非常简单的实现按钮的创建和事件响应。
初识CButton:
CButton 类封装了win32 中button类的所有类型的按钮实现方法,例如:PushButton,CheckBox,RadioButton,GroupBox,3StateButton…
MSDN 里有这样一段话:
You can create a button control either from a dialog template or directly in your code. In both cases, first call the constructor CButton to construct the CButton object; then call the Create member function to create the Windows button control and attach it to the CButton object.
显然,这和win32中是一样的,我们可以在对话框中拖拉实现按钮,也可以用代码自己实现,首先,我们要构造CButton对象,然后调用Create函数创建按钮,下面我们分别在自己的代码中以代码的方式和在对话框模板中实现按钮的创建和单击事件的响应实现。
方案一:代码实现按钮
利用MFC向导创建一个单文档的程序,然后在view类中的OnCraete消息里创建按钮,当然,我们首先要在view类中添加成员变量:
Private:
CButton m_btn;
当然我们也可以将这个变量定义为全局变量,不过这样就不符合mfc标准了(类),需要说明的是,这个变量必须是以上面两种方法之一定义的,不能将其定义为局部变量,否者当程序调试执行时当出了作用域,这个变量会执行析构函数销毁对象,这样我们永远没有机会看到按钮了。
然后我们就可以在OnCreate消息里处理创建,当然这个消息使我们利用MFC向导生成的。
int CbuttonView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
m_btn.Create("btn",WS_CHILD|WS_VISIBLE|WS_BORDER|BS_PUSHBUTTON,CRect(40,40,140,100), this, 101);
return 0;
}
好了,一切搞定,现在我们可以为按钮添加单击事件了。
MSDN里如是介绍:
If you want to handle Windows notification messages sent by a button control to its parent (usually a class derived from CDialog), add a message-map entry and message-handler member function to the parent class for each message.
Each message-map entry takes the following form:
ON_Notification( id, memberFxn )
where id specifies the child window ID of the control sending the notification and memberFxn is the name of the parent member function you have written to handle the notification.
The parent’s function prototype is as follows:
afx_msg void memberFxn( );
Potential message-map entries are as follows:
Map entry |
Sent to parent when... |
ON_BN_CLICKED |
The user clicks a button. |
ON_BN_DOUBLECLICKED |
The user double-clicks a button. |
显然,这一点和WIN32是有一点区别的,需要说明的是,MFC是基于消息映射的(Message_Map),它在后台维护了一个映射表,处理任何类型的MFC界面元素的事件响应,这和win32里的窗口消息是有区别的,当然我们应该相信运行机制是和win32是一样的,因为MFC本来就是封装WIN32,只是它这样做应该更为高效和方便吧。
好了现在解释下上面出自MSDN里的英文文档:
如果我们想发送一个通知消息给父窗口,要增加一个消息映射和一个消息映射函数。
按钮通知消息有两种映射类型:
ON_BN_CLICKED和ON_BN_DOUBLECLICKED(即单击事件和双击事件)
消息函数格式为:afx_msg void memberFxn( );
好了,现在开始给按钮添加消息响应:
1.添加映射:
BEGIN_MESSAGE_MAP(CbuttonView, CView)
// 标准打印命令
ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
ON_WM_CREATE()
ON_BN_CLICKED(101,&CbuttonView::btnclick)
END_MESSAGE_MAP()
2.添加函数
public:
afx_msg void btnclick(void);
3.实现函数
afx_msg void CbuttonView::btnclick(void)
{
MessageBox("btn click");
return afx_msg void();
}
就是这样简单…关于其他样式的按钮,可以参考MSDN
当然这里创建的按钮有点单一,不要紧,后面我会带来精心设计的自绘控件篇
方案二:对话框模板上实现按钮
这个就简单了,VS或VC等任何编译器都提供了一个控件工具箱,里面有我们想要的按钮控件,只要点击拖放到对话框模板上即可,在响应事件时只要鼠标双击按钮即可,这时MFC向导会自动会我们添加按钮事件响应函数。