当前位置:C++技术网 > 资讯 > MFC创建按钮并响应按钮事件

MFC创建按钮并响应按钮事件

更新时间:2015-06-23 11:44:10浏览次数:1+次

    MFC中,每一种控件都对应了一个控件类,这个控件类可以对控件进行各种操作。而按钮控件是我们最常用的控件,因此我就最先讲解其编程使用。从现在开始,不要再使用完全用API函数对控件进行操作了,因为这样效率实在太低了。当然,如果懂API函数操作控件,那使用MFC控件类操作就更加顺手了,因为MFC只是封装了API函数而已。
    按钮控件,很多人以为只是那就只能单击的凸起的按钮,以为单选框、复选框等都是另外一种按钮。其实它们都属于按钮,只是样式不一样而已。它们都是由CButton按钮类来进行操作,当然,如果你酷爱API的话,也可以混用API函数。不过一般情况没有必要,也是代码简洁起见,还是尽量使用MFC控件类操作。
    此文主要讲解按钮的基础,包括基本的按钮创建,之后系列文章再铺开讲解按钮的各种使用。所以,再看其他系列文章,请务必先把按钮基础背景知识了解一下,不然一些细节总是让你模糊不清,制造不必要的烦恼。
    按钮其实也是一个窗口,只不过是一个比较特殊的窗口,按钮是做了封装的窗口,这才使你可以调用一个简单的创建函数就可以把按钮制造出来,而在API编程中,想要制造一个窗口出来,是要做很多事情的,这里就不细说。所以对于窗口使用的函数,对于控件基本都是可以使用的。所以,虽然MSDN中,CButton中的成员函数虽然比较有限,但是因为它是继承自CWnd窗口类的,也就是说按钮类的基类是窗口类,继承的机制保证了非私有基类的成员是可以被子类直接使用的。

    因此,虽然按钮类没有的函数,其实在基类是有的,所以就可以直接使用 。其他控件类也是如此。如果想详细了解其基类有哪些函数,可以查看MSDN的CWnd类。
     按钮的创建有两种方法,一种是静态创建,一种是动态创建。对于程序中一直需要的按钮,一般使用静态创建,而动态创建则是因为没满足某一条件就不需要显示的按钮,比如,在写入大量数据的文件时,开始写入时可以动态创建一个取消按钮可以让用户随时取消写入,而在写入之前则不需要。其他控件也都是有这两种创建方法。


    静态创建:在IDE中,选择资源视图下,点开项目文件夹,出现一个Dialog文件夹,下面就是对话框资源。双击资源,可以看到对话框编辑界面,同时,工具箱工具也出来了。然后选择按钮,拖入对话框中,随便摆放位置,右击-》属性,可以对属性包括显示在按钮上的文字进行编辑。这样,一个静态创建的按钮就可以了。当然,运行程序后,这样的按钮单击没有反应的,因为没有添加单击响应事件。

    添加单击响应事件也很简单,双击资源视图下的按钮,即创建好了事件响应,界面自动切换到响应函数里面,在函数里面可以编写单击按钮时执行的代码。可以显示一个消息对话框,单击后就提示一个消息,如MessageBox(_T("Hello"));单击按钮后就显示hello。这样创建的是一个普通的按钮。还有单选按钮(单选框)、复选按钮(复选框)等等,直接在工具箱拖进对话框窗口就是了。具体的编码在之后讨论。


    动态创建:动态创建则不需要从工具箱里拖控件,而是直接调用创建函数Create来创建,指定参数即可。函数原型如下:
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
创建成功则返回真(非零),否则假(零)。第一个参数是显示在按钮上的文字,第二个参数是按钮的样式,第三个参数是按钮所占的矩形位置。第四个参数是按钮的父窗口指针,最后一个是按钮的ID。下面详细解释各个参数。


LPCTSTR lpszCaption:这个参数的类型是LPCTSTR,意思是指向常量字符串,但是使用中性的字符编码,也就是可能是ANSI编码,也可能是Unicode编码表示的字符串。看到这个T就要知道表示这个意思。所以这个参数接收的字符串应该这么写:_T("按钮上显示的文字")或者TEXT("按钮上显示的文字")建议使用前者,两者表示的意思都是一样的,而前者比较新,向后兼容性好些。两个都是一个宏,如果程序是ANSI编码版本,则这些字符串就是ANSI版本的,反之就是Unicode版本的。这样就不用程序员去管麻烦的字符编码问题了。这是直接传递给参数,也可以先赋值给一个变量,然后将变量传递给参数。变量请这样定义,TCHAR BtnName = _T("按钮上显示的文字"); 变量名随便取,变量的类型使用TCHAR,也是表示成中性的,最后编译时根据程序使用的编码自动变换,不需要程序员处理。


DWORD dwStyle:这是按钮风格参数,指定不同的风格,按钮就是不同的样式。首先按钮作为一个窗口,虽然是特殊窗口,但还是窗口,可以指定一个窗口风格,然后同时指定按钮风格。

    窗口风格以WS_开头,即Window Style的首字母缩写,WS_CHILD、WS_VISIBLE、WS_DISABLED、WS_GROUP、WS_TABSTOP,这些风格依次是:子窗口,可见窗口,不可用窗口,窗口分组,Tab键排序。

  • WS_CHILD:子窗口风格就是由其他窗口创建的窗口,一般都指定;
  • WS_VISIBLE:可见风格如果在创建时指定,则创建完后,按钮控件就可以看得见,如果没有指定,创建后则看不见,要想看得见,则在创建完后,调用ShowWindow(SW_SHOWNORMAL);使其可见,当然慈函数内部的参数还可以是其他的,只要不是WS_HIDE即可,但是效果却是不同的。
  • WS_DISABLED:禁用控件风格创建的控件开始时是无法使用的,要使其可用,需要调用EnableWindow();默认参数是True,是使窗口变为可用,如果要再次使其不可用,调用这个函数传给False即可实现。
  • WS_GROUP:在这里不做讨论,暂时用不着。

    上面是窗口风格,可以使用或操作符将多个风格组合起来,如WS_CHILD | WS_VISIBLE,这个组合是作为子窗口并且使其可见。还有按钮风格,也是可以进行这样的组合起来的。窗口风格还有很多,有兴趣可以查看MSDN。

    下面介绍一下按钮风格。按钮风格以BS_开头,Button Style首字母缩写。按钮风格有复选框、单选框、分组框和普通按钮等。默认就是普通的按钮,如果要创建复选框,则再用或操作符组合上BS_CHECKBOX或者BS_AUTOCHECKBOX样式即可,前者单击后不自动选中,需要调用SetCheck函数设置选中,后者单击后就自动选中。其他的再介绍成员函数使再讨论。


const RECT& rect:这个参数是指定按钮所占的矩形大小,矩形以左侧,顶部、右侧,底部的坐标点来定位形成的一个矩形区域,这个坐标是想对付父窗口的客户区,客户区就是除了边框标题栏状态栏菜单栏以外的区域。比如(0,0,50,20),就是位于父窗口客户区的左上角,左侧和顶部都是贴着父窗口的客户区的,按钮宽50,也就是右侧在客户区左边的50个单位处,高则是20个单位,距客户区顶部20个单位。这个参数是个CRect结构体,使用CRect rect(0,0,50,20);声明一个结构体对象,然后传递给这个参数,前面加上取址符,如&rect。


CWnd* pParentWnd:此参数是父窗口的指针,如果要指定,则可以传递一个this指针,此时this指针就是指向当前窗口对象,当前窗口对象创建按钮,也就是它的父窗口,当然也可以不指定,直接传递NULL即可。


UINT nID:是按钮的ID,可以使非零值。这个ID值必须指定。


    至于动态创建的按钮如何进行事件响应,请查看网站的动态创建控件相关文章。