[MFC]传统控件介绍、CButton按钮类

来源:互联网 发布:声卡mc录音软件 编辑:程序博客网 时间:2024/05/16 17:00

1. 控件的概念:

    1) 控件是一类特殊的窗口,如按钮、文本框之类的,用来将信息传送给用户或获取用户的输入;

    2) 控件都是一些高度封装好的对象,有自己的WM_PAINT处理代码,不必用户自己去重绘控件;

    3) 控件的消息机制:当点击控件等操作发生时,用户不用具体去处理这些鼠标消息,MFC会处理这些最基本的控件上的消息并将其转化为“通知”(Notify),比如点击按钮时不需要用户去处理按钮的ButtonDown消息,而是MFC将这种消息转化为一个BN_CLICKED通知,然后用户只需要响应OnButtonClicked函数即可;

!!通知消息:

        a. 一般普通消息,如WM_LBUTTONDOWN、WM_PAINT等都是基本的消息,这些消息直接反应了触发消息的事件;

        b. 通知消息是一种特殊的Windows消息,它主要来自控件,虽然触发通知的都是一些基本消息,如BUTTONDOWN等,但Windows将它们转换成控件发出的通知,通知消息直接反应了触发控件的事件;

    4) 控件一般都挂载其它窗口上,因此控件都是其它窗口的子窗口,所以控件有时也叫子窗口控件:

         i. 父窗口移动控件就会跟着移动;

         ii. 父窗口被销毁控件也会跟着被销毁;

         iii. 这些动作都由MFC自动完成;


2. 传统控件:

    1) Windows目前用于20多种控件,其中6种为传统控件,这6种传统控件在Windows的第一个版本中就已经出现;

    2) 传统控件和相应的MFC类:从左到右分别是控件类型、WNDCLASS注册时的名称和MFC类

按钮   "BUTTON"   CButton

列表框   "LISTBOX"   CListBox

编辑控件   "EDIT"   CEdit

组合框   "COMBOBOX"   CComboBox

滚动条   "SCROLLBAR"   CScrollBar

静态控件(静态文本等)   "STATIC"   CStatic

    3) 创建控件也很简单,只需要先创建对象,然后调用对象的Create函数即可,如果希望控件中有一些扩展的样式,则使用CreateEx来创建具有扩展样式的控件;


3. CButton类简介:

    1) MFC中的按钮代表一般意义上的按钮,不仅仅包含常见的下压按钮,还包含复选框、单选框以及组框这三种;

    2) 决定按钮类型的标识符:只需要在Create或CreateEx的dwStyle中加入其中一个就能确定按钮的类型了,他们都以BS_作为前缀,即Button Style的缩写

BS_PUSHBUTTON:最常见的标准下压按钮

BS_DEFPUSHBUTTON:默认按钮,在标准下压按钮的基础上可以指定回车键按下也表示按钮被按下

BS_CHECKBOX:普通的复选框

BS_AUTOCHECKBOX:自动复选框,普通复选框被点击时需要在响应函数中显示调用SetCheck来改变复选框的选中状态,而自动复选框不需要,都由MFC自动完成,因此自动复选框使用更多

BS_3STATE:3状态复选框,有选中、未选中和不确定三种状态

BS_AUTO3STATE:自动3状态复选框,可以在三种状态间自动切换,和BS_AUTOCHECKBOX一样无需显示调用SetCheck

BS_RADIOBUTON:普通的单选框

BS_AUTORADIOBUTTON:自动单选框,可以自动选中自己并取消同组中其它单选按钮的选中,而普通的单选框都需要在响应函数中显示调用SetCheck来选中自己并取消别人

BS_GROUPBOX:组框

    3) 决定按钮表面文本对齐方式的标识符:同样也是BS_打头,可以在Create或CreateEx的dwStyle中添加

BS_LEFTTEXT / BS_RIGHTBUTTON:对于复选框和单选框有效,是按钮和右边的文本更加靠拢

BS_LEFT:左对齐

BS_RIGHT:右对齐

BS_CENTER:水平居中

BS_VCENTER:垂直居中

BS_TOP:居顶

BS_BOTTOM:居底

BS_MULTILINE:允许一行放不下分成两行或多行

!!其它样式很少用,所以先不介绍了


4. 按钮的创建:

     1) Create的原型:

BOOL CButton::Create( // 返回值表示是否成功LPCTSTR lpszCaption, // 按钮的文本DWORD dwStyle, // 按钮的样式,如按钮类型、文本对齐方式等const RECT& rect, // 按钮的大小和父窗口中的为位置(以像素为单位)CWnd* pParentWnd, // 父窗口指针UINT nID // 控件的ID,和菜单项ID一样,需要唯一表示,也是消息映射的依据)
    2) 一个典型的按钮创建过程:

CButton m_wndPushButton;m_wndPushButton.Create(_T("Start"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,rect, this, IDC_BUTTON);
!dwStyle既可以包含按钮自己的样式(BS_打头的样式),但由于控件也是一种窗口,所以也可以添加普通窗口的样式(以WS_打头)

!WS_CHILD:表示该控件是一个子窗口,用于指定第四个参数

!WS_VISIBLE:表示控件一创建出来就可见,如果不加该样式的话要等到调用ShowWindow后才可见

!由于控件是一种子窗口,所以给控件命名的时候一般都以m_wnd作为前缀!!!!


5. 消息机制:

    1) 前面已经讲过了,MFC将控件上的消息包装成通知发送给子窗口;

    2) 以BS_PUSHBUTTON为例,按钮给其父窗口发送一个封装在WM_COMMAND消息中的BN_CLICKED通知,其实质还是发送了WM_COMMAND消息;

    3) 其中通知BN_CLICKED保存在wParam的高16位,触发消息的控件ID保存在wParam的低16位,lParam保存着子窗口控件的窗口句柄;

    4) 但通常应用程序无需直接处理控件的WM_COMMAND消息,因为MFC提供了“通知到处理函数“的映射,比如下压按钮的ON_BN_CLICKED(CtrlID, Handle),其中CtrlID为控件ID,是自己命名的,而Handle是消息处理程序,对于所有类型的控件,不管是按钮还是列表框等,消息处理函数的名称都是自己命名的,因为一个窗口中可以包含多个相同类型的控件,如果想为各个相同类型的控件准备不同的消息处理函数也是一个再正常不过的需求,因此Handle的名称可以是任意的!!

    5) 例如:

ON_BN_CLICKED(IDC_BUTTON, OnButtonClicked)void CMainWindow::OnButtonClicked(){MessageBox(_T("I've been clicked!"));}


6. 复选框的选中状态:

    1) 不管是何种类型的复选框都是用SetCheck来设置选中状态;

    2) SetCheck:

         i. 原型:void CButton::SetCheck(int nCheck);

         ii. 可以设置的选中状态有三种,都以BST_打头,即Button State的缩写

BST_CHECKED:选中

BST_CHECKED:未选中

BST_INDETERMINATE:不确定状态,只有在3STATE的样式中才有

!!在3状态复选框中,当用户点击了当前被选中的复选框时就会变成不确定状态(包含一个灰化了的复选框),或者直接调用SetCheck设置不确定状态;

!!不确定状态既不完全肯定也不完全否定,比如在一个字处理程序中,混合使用常规和粗体则标有粗体的复选框就会处于不确定状态;

    3) 使用GetCheck获取复选框当前的选中状态:

         i. 原型:int CButton::GetCheck() const;

         ii. 返回值还是那三种选中状态,即BST_打头的三种状态;

    4) 自动切换状态:

         i. 具有AUTO样式的复选框可以在鼠标单击它时自动切换选中状态,不需要自己实现OnCheckBoxClicked响应函数,MFC隐式自动实现了;

         ii. 如果是非AUTO样式的复选框,则需要手动完成该状态切换的过程:

void CMainWindow::OnCheckBoxClicked(){m_wndCheckBox.SetCheck(m_wndCheckBox.GetCheckedRadioButton() == BST_CHECKED ? BST_UNCHECKED : BST_CHECKED);}


7. 单选按钮的排他性:

    1) 单选按钮是RADIOBUTTON样式,当一组中的一个单选按钮被选中时必须取消同组的其它按钮的选中;

    2) 对于非AUTO样式的单选按钮,排他性需要手动维护:

void CMainWindow::OnRadioButton1Clicked(){m_wndRadioButton1.SetCheck(BST_CHECKED);m_wndRadioButton2.SetCheck(BST_UNCHECKED);m_wndRadioButton3.SetCheck(BST_UNCHECKED);m_wndRadioButton4.SetCheck(BST_UNCHECKED);}
!这里按下了第一个按钮,因此其它三个按钮都要强行置为未选中;

    3) 如果使用AUTORADIOBUTTON,则排他性的维护将由MFC自动完成,不必显示实现消息响应函数,但是让MFC自动维护是有一定条件的:

         i. 首先需要对单选按钮进行分组,必须让MFC知道这些单选按钮是同一组的,这样才能在同一组内排他;

         ii. 首先将一组单选按钮一个接一个的顺序创建,中间不能插入其它控件;

         iii. 其次必须在改组的第一个创建的按钮的Create中用WS_GROUP来标记改组的开始(OR到dwStyle中去);

         iv. 如果一组单选按钮定义完了,但是接下来还要定义其它控件或另一组不同的单选按钮,则必须后面定义的第一个控件的Create中OR上一个WS_GROUP标记,以示前一组结束后一组开始;

    4) 必须为单选按钮初始化:当一组单选按钮创建好后,默认不会有任何按钮被选中,但是出于逻辑考虑,但须按钮必须有一个被选中,因此Create完后并在下一组控件定义之前最好使用SetCheck初始化选中其中一个按钮为好!!养成良好的习惯!!


8. 组框:

    1) 就是BS_GROUPBOX样式的按钮控件;

    2) 它仅仅就是在图形上将一组控件用可见的轮廓围起来,其余没有任何作用,仅仅就是一种视觉上的效果;

    3) 它可以在视觉上让用户明确哪些控件是一组的,仅仅就是一种视觉上的辅助;

    4) 它不产生任何通知,也不能决定控件的分组!!

0 0
原创粉丝点击