MFC Windows 程序设计 第七章 控件

第七章 控件
1、控件是预先包装好了的对象,带有它自己完整的窗口处理过程,使用按钮控件的应用程序不用在屏幕上画一个按钮,也不必在按钮被单击时去处理鼠标任务,相反,他通过一个简单的函数调用来生成按钮,
   并在按钮被按下时接收通知,控件的WM_PAINT处理程序在屏幕上绘制按钮,控件中的其他消息处理程序将用户输入转换为通知消息,控件与其他窗口具有父子关系,有时也被称为子窗口控件,当控件
   传送一个表明有输入事件发生的通知消息时,他的父亲就是消息的接受者,控件基本都继承于CWnd类,是一个窗口类,可以使用CWnd类的属性和方法。
2、传统控件指的是在Windows第一个版本中已经出现的控件,他被封装在user.exe中。其他控件一般封装在comctl32.dll中,被称为通用控件。传统控件一种有六种,windwos注册了6个预定义的
   WNDCLASS使控件所属的应用程序可以使用他们
   控件类型                            WNDCLASS                             MFC类
   按钮                                "BUTTON"                             CButton
   例表框                              "LISTBOX"                            CListBox
   编辑控件                            "EDIT"                               CEdit
   组合框                              "COMBOBOX"                           CComboBox
   滚动条                              "SCROLLBAR"                          CScrollBar
   静态控件                            "STATIC"                             CStatic
   
3、控件的创建:m_wndPushButton.Create(_T("Start"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,rect,this,IDC_BUTTON),第一个参数为控件的显示文本,第一个为常规窗口样式与控件特有样式的组合,
   第三个参数为控件所在的矩形,以像素为单位,相对于父亲客户区左上角的尺寸和位置,第四个参数标识父窗口,第五个参数为控件或窗口唯一ID,此ID用来关联消息映射,若创建3D样式的控件,
   则使用CreateEx,并在第一个参数指定WS_EX_CLIENTEDGE,也可自己创建派生类,在派生类的PreCreateWindow中,添加此样式。控件以WM_COMMAND消息的形式给他的父亲发送消息,一般情况下,
   信息都存入消息的wParam和lParam中,wParam包含通知代码(高16位)和控件ID(低16位),lParam包含控件窗口句柄,在MFC中,一般使用消息映射处理控件消息,如
   ON_BN_CLICKED(IDC_BUTTON,OnButtonClicked),常用控件消息映射宏:ON_BN_CLICKED(BUTTON)、ON_EN(EDIT)、ON_LBN(LISTBOX)、ON_CONTROL(通用)、ON_CONTROL_RANGE(通用),父窗口通常也给
   控件发送消息,如m_wndCheckBox.SetCheck(BST_CHECKED),由于控件是窗口,控件从CWnd继承来的许多函数可以通用,如SetWindowText、GetWindowText、EnableWindow、SetFont等。
4、CButton类:按钮、复选框、单选框以及组框。
   按钮窗口样式:BS_PUSHBUTTON、BS_DEFPUSHBUTTON(回车相当于单击)、BS_CHECKBOX、BS_AUTOCHECKBOX(单击时可以选中和不选中自己)、BS_3STATE(3种状态复选按钮)、
                 BS_AUTO3STATE(3种复选按钮,单击时循环,选中、未选中、不确定)、BS_RADIOBUTTON(单选按钮)、BS_AUTORADIOBUTTON(单击时选中自己,取消同组其他单选按钮)、BS_GROUPBOX(组框控件)
   对齐方式:BS_LEFTTEXT(伴随单选按钮文本从按钮右边往左边移动)、BS_RIGHTBUTON(同BS_LEFTTEXT)、BS_LEFT、BS_CENTER、BS_RIGHT、BS_TOP、BS_VCENTER、BS_BOTTOM、BS_MULTILINE(一行放不下,允许分为多行)
             BS_NOTIFY(将发送BN_DOUBLECLICKED、BN_KILLFOCUS、BN_SETFOCUS通知)、BS_OWNERDRAW(由所有者绘制)
   按钮:样式为BS_PUSHBUTTON和BS_DEFPUSHBUTTON
   复选框:使用BS_CHECKBOX和BS_3STATE类似样式,BS_3STATE包含不确定选项(BST_INDETERMINATE),是一个灰化了的复选标记,SetCheck(BST_CHECKED/BST_UNCHECKED),GetCheck获取选中状态
   单选:BS_AUTORADIOBUTTON类似样式,一般成组使用,创建方法:在应用程序中一个接一个的连续创建,使用WS_GROUP样式赋给创建的第一个单选按钮,表示一组的开始,如果最后一个单选控件后
        还要创建其他控件,则需把WS_GROUP样式赋给创建的第一个其他控件,表示上一个控件是一组中的最后一个。
   组框:使用BS_GROUPBOX样式,组框的唯一目的是给其他控件组绘制可见的轮廓,从不接收输入也不给父窗口发送通知。
5、CListBox:在大批量添加项目时,给例表框增加LBS_NOREDRAW样式,或者给例表框发送禁止重画和恢复重画的消息。
             m_wndListBox.SendMessage(WM_SETREDRAW,FALSE,0);m_wndListBox.SendMessage(WM_SETREDRAW,TRUE,0)
   样式:LBS_STANDARD(WS_BORDER(边框)、WS_VSCROLL(竖直滚动条)、LBS_NOTIFY、LBS_SORT)、
         LBS_SORT(字母顺序排序)、
         LBS_NOSEL(只能查看,不能选择)、
         LBS_NOTIFY(项目被更改或双击时通知父窗口)、
         LBS_DISABLENOSCROLL(在不需要时取掉滚动条,没有此样式时,不需要时,滚动条隐藏而不是被拿掉)、
         LBS_MULTIPLESEL(多选)、
         LBS_EXTENDEDSEL(多选框添加扩展选项支持,按Ctrl和Shif来灵活选择)、
         LBS_MULTICOLUMN(多列列表框,伴随使用WS_HSCROLL样式)、
         LBS_OWNERDRAWVARIABLE(创建自制列表框,其中项的高度不同)、
         LBS_OWNERDRAWFIXED(创建自制列表框,项的高度相同)、
         LBS_USETABSTOPS(配置列表框展开项文本中的制表符,默认制表位为8个字符宽,使用SetTabStops修改制表位位置,SetTabStops
         以对话框单位测量距离,一个对话框单位大约等于系统字体一个字符宽度的4分之一)、LBS_NOREDRAW(项目被创建或者删除后不进行重画,只有在客户区无效时才重画(Invalidate))、
         LBS_HASSTRINGS(创建记得所添加字符串的列表框,常规列表框有此功能,自制列表框没有)、
         LBS_WANTKEYBOARDINPUT(当键按下时给父窗口发送WM_VKEYTOITEM、WM_CHARTOITEM消息,MFC使用ON_WM_VKEYTOITEM、ON_WM_CHARTOITEM宏将消息映射给OnVKeyToItem和OnCharItem处理程序,
         派生的列表框可以通过覆盖虚拟CListBox::VKeyToItem和CListBox::CharToItem来处理这些消息,通常用来创建包含自身的列表框,它通过删除当前选中的项来响应按下Ctrl-D事件)、
         LBS_NOINTEGRALHEIGHT(允许列表框具有任意高度,默认列表框的高度为项目高度的倍数)
   列表框带有键盘接口:
   单选列表框:可以使用上箭头、下箭头、Page UP、Page Down、Home、End来移动加亮条来显示当前选项,按下字符键可以选中下一个以该字符开头的选项
   多选列表框:按下以上各键只是有焦点的矩形位置变化而不是选项被更改,按下空格键可以来切换焦点项的选中状态。
   多列列表框:SetColumnWidth设置列的宽度,列的宽度应该基于使用列表框字符字体的平均宽度,一般默认可输入16个字符或者更多。
   AddString、InsertString(LBS_SORT不起作用),返回插入项的索引号,失败时返回LB_ERR,GetCount、DeleteString、ResetContent(清空)、
   SetItemDataPtr和SetItemData、GetItemDataPtr、GetItemData,将项与32位指针或者DWORD数据结构关联在一起,可以将附加数据与项关联起来,另外一个方法是创建LBS_USETABSTOPS样式的列表框,
   将制表位放置在超出列表框右边框的位置并将包含制表符以及附加数据的字符串附加在列表框项目上。
   GetCurSel(获取选中项的索引,基于0开始)、SetCurSel(传-1表示取消选中)、GetSel(判断当前项是否选中)、
   SelectString(选中以指定字符串开头的字符串,不区分大小写,第一个参数是查找开始处前一个项目的索引号,-1表示从0号开始查起)、
   FindString(以指定字符串开头的字符串)、FindStringExact(精确匹配)、GetText获取当前项的文本
   
   多选列表框,GetCurSel、SetCurSel、SelectString函数不适应,使用SetSel和SetItemRange来选中和取消、GetSelCount获取选中的项目、GetSelItems(检索所选项目索引)
   SetCareIndex、GetCaretIndex获取焦点矩形,GetText、GetTextLe、FindString、FindStringExact也适用于多选列表框
   列表框通知:例表框通过WM_COMMAND消息给父窗口发送通知,MFC中通过消息映射宏处理,程序员经常使用LBN_DBLCLK和LBN_SELCHANGE
   通知                            发送条件                           消息映射宏                 要求 LBS_NOTIFY
   LBN_SETFOCUS                    获得焦点                           ON_LBN_SETFOCUS               否
   LBN_KILLFOCUS                   失去焦点                           ON_LBN_KILLFOCUS              否
   LBN_ERRSPACE                   内存不足操作失败                    ON_LBN_ERRSPACE               否
   LBN_DBLCLK                    项目被双击                          ON_LBN_DBLCLK                 是
   LBN_SELCHANGE                  项目被修改                          ON_LBN_SELCHANGE              是
   LBN_SELCANCEL                  选项取消                            ON_LBN_SELCANCEL              是
   
   双击时,单选列表框使用GetCurSel获得当前索引,多选框使用GetCaretIndex,用户修改选项而不是程序修改选项时,列表框发送LBN_SELCHANGE通知,单选列表框在鼠标单击或者击键造成选项
   移动时发送此通知,多选列表框在项目被单击、用空格键切换项目的所选状态以及焦点矩形移动时发送此通知
6、CStatic类:显示文本、矩形、图像
   对齐样式:SS_LEFT(太长则换行)、SS_LEFTNOWORDWRAP(禁止换行)、SS_CENTER、SS_RIGHT、SS_SIMPLE(禁止使用SetWindowText修改)、SS_CENTERIMAGE(竖直方向居中,默认是沿上边对齐)
   SS_SUNKEN(围绕静态控件画一个下陷边缘)。
   矩形样式:SS_BLACKFRAME(使用黑色画空心矩形)、SS_BLACKRECT(画实体矩形)、SS_ETCHEDFRAME(带有蚀刻框的空心矩形)、SS_ETCHEDHORZ(顶边、底边蚀刻)、SS_ETCHEDVERT(左右蚀刻)
             SS_GRAYFRAME、SS_GRAYRECT、SS_WHITEFRAME、SS_WHITERECT
   为取得最佳效果,应在与默认对话框颜色(系统颜色为COLOR_3DFACE)相同的表面绘制蚀刻矩形。
   静态图像样式:SS_BITMAP、SS_ENHMETAFILE(GDI元文件)、SS_ICON(图标或光标)
   图像控件创建后,SetBitMap、SetEnhMetaFile、SetIcon、SetCursor来设置句柄,默认图像位于控件左上角,矩形随图像的变大而变大,使用SS_CENTERIMAGE后,图像显示在中间,但矩形不会随
   图像的大小而变化,对于SS_ENHMETAFILE样式的控件缩放不是问题,元文件可以缩放来与控件尺寸匹配。
   默认静态控件不会给父窗口发送通知,但用SS_NOTIFY样式创建的控件会发送以下通知:STN_CLICKED、STN_DBLCLK、STN_DISABLE(失效)、STN_ENABLE(有效),消息映射宏在通知字符前加ON_即可

7、CEdit类:
   控件样式:ES_LEFT、ES_CENTER、ES_RIGHT、ES_AUTOHSCROLL、ES_AUTOVSCROLL(竖直滚动没有滚动条,滚动条由WS_VSCROLL添加)、ES_MULTILINE(多行)、
             ES_LOWERCASE(小写)、ES_UPPERCASE、ES_PASSWORD、ES_READONLY、ES_NOHIDESEL(控件失去焦点时防止编辑控件隐藏所选内容)、
             ES_OEMCONVERT、ES_WANTRETURN(多行编辑控件,使用回车键而不是按钮来插入换行符)
   常用函数:SetRect(定义控件的可编辑范围,独立控件边界)、SetRectNP(定义控件的可编辑范围,独立控件边界)、SetMargins(以像素为单位指定左右边宽度,默认为0)、
             LimitText、SetLimitText、SetTabStops(设置制表位之间的距离)、SetWindowText、GetWindowText、ReplaceSel(覆盖插入)、FmtLines(多行编辑,会自动插入换行符,此
             函数使该换行符有效,只影响控件内部保存文本的方式以及用GetWindowText得到的文本格式,不影响文本的外观)、GetLine(复制某行)、LineLength(获取某行的长度)、GetLineCount(从不返回0)、
             Clear(将所选文本清除)、Cut、Copy、GetSel(获取选中文本的开始索引和结束索引)、SetSel、LineIndex(某行第一个字符的索引)、Paste、CanUndo
   控件通知:
           通知                                                                         消息映射宏
           EN_UPDATE                           文本将被修改                            ON_EN_UPDATE
           EN_CHANGE                           文本已被修改
           EN_KILLFOCUS
           EN_SETFOUCS
           EN_HSCROLL
           EN_VSCROLL
           EN_MAXTEXT                         超出限制字符
           EN_ERRSPACE                        由于内存不足而操作失败
8、CComboBox组合框类 是由编辑控件CEdit和CListBox控件组合而成,许多样式属性和通知事件相同。
   控件类型:简单型(组合框始终显示,允许编辑,CBS_SIMPLE)、下拉型(组合框需要时显示,允许编辑,CBS_DROPDOWN)、下拉列表型(组合框需要时显示,不允许编辑,CBS_DROPDOWNLIST)
   样式,样式与CEdit和ListBox大部分一样:CBS_AUTOHSCROLL、CBS_DISABLENOSCROLL、CBS_DROPDOWN、CBS_DROPDOWNLIST、CBS_HASSTRING、CBS_LOWERCASE、CBS_UPPERCASE、CBS_NOINTEGRALHEIGHT
         CBS_OWNERDRAWFIXED、CBS_OWNERDRAWVARIABLE、CBS_SIMPLE、CBS_SORT
   常用函数:AddString、InsertString、LimitText(编辑框)、GetWindowText、SetWindowText、GetLBText(根据索引(从0开始)获取文本)、GetLBTextLen、ShowDropDown(显示隐藏下拉框)、GetDropState(获取下拉框是否已显示)。
   控件通知:
          通知                          消息映射宏                   简单型         下拉型          下拉列表项
          CBN_DROPDOWN 在下拉列表时触发             在通知前加ON_                 无                         有             有
          CBN_CLOSEUP 下拉列表关闭时触发                            无            有             有
          CBN_DBLCLK                                      有             无            无 
          CBN_SELCHANGE 选项修改时                               有           有             有  
          CBN_SELENDOK 选中时                                  有           有             有
          CBN_SELENDCANCEL 取消选择时                             无            有             有
          CBN_EDITUPDATE 编辑控件将更改时                            有           有             无
          CBN_EDITCHANGE 编辑控件已更改时                            有           有             无
          CBN_KILLFOCUS                                     有              有          有
          CBN_SETFOCUS                                      有           有              有
          CBN_ERRSPACE                                      有           有              有
          
    CBN_SELCHANGE通知到来时,编辑控件可能还没来得及更新以实现与列表框中所选项目的匹配,所以使用GetLBText而不是GetWindowText来检索最近选中的文本,用GetCurSel获取选中项目   

9、CScrollBar类
    样式:SBS_VERT(创建垂直滚动条)、SBS_HORZ(水平滚动条)、SBS_TOPALIGN(水平滚动条上对齐,具有标准高度)、SBS_BOTTOMALIGN SBS_LEFTALIGN SBS_RIGHTALIGN
    获取系统滚动条宽度:::GetSystemMetrics(SM_CXVSCROLL)
    获取系统滚动条高度:::GetSystemMetrics(SM_CYHSCROLL)
    事件代码:SB_TOP(按下Home键)、SB_BOTTOM(End)、SB_LINEUP(箭头单击)、SB_LINEDOWN、SB_PAGEUP(顶部箭头与滚动条滑块键的滚动条体被单击)
              SB_PAGEDOWN、SB_ENDSCROLL、SB_THUMBTRACK(拖动滑块)、SB_THUMBPOSITION(拖动后滑块释放)
    滚动条发送:WM_VSCROLL和WM_HSCROLL消息,对应的消息映射宏为ON_WM_VSCROLL和ON_WM_HSCROLL,处理上面提到的的事件代码。
    常用函数:GetScrollPos、SetScrollPos、GetSCrollRange、SetScrollRange、SetScrollInfo

10、图形控件
    CcheckListBox 列表框增加了复选框按钮,可以通过GeCheck和SetCheck来设置状态
    CdragListBox 支持拖放
    CbitmapButton 显示图像,根据4个位图来表示不同的状态
    图形按钮:图标按钮和位图按钮,在创建按钮时,提供BS_BITMAP和BS_ICON样式可以创建位图按钮和图标按钮,使用SetIcon和SetBitMap来设置图标和位图。
    图形按钮对齐:BS_LEFT、BS_RIGHT、BS_TOP、BS_BOTTOM、BS_CENTER、BS_VCENTER。

11、自定义控件颜色   
    有两种机制可以修改控件的颜色,两种机制都要求控件绘制自身前给其父窗口发送一个包含设备描述表句柄的消息,正是用该设备描述表来完成绘制工作,父窗口使用CDC::SetTextColor
    和SetBkColor(文本空格间隙)来修改所绘文本的属性,通过返回画刷句柄(HBRUSH)还可以修改控件的背景颜色(控件没有文本的其他地方),不同的控件发送不同消息来通知父窗口,
    MFC使用ON_WM_CTLCOLOR消息映射宏将所有类型控件
    的WM_CTLCOLOR消息映射给了名为OnCtlColor的处理程序,原型是afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd* pWnd, UINT nCtlColor),pDC指向设备描述表,PWnd表示控件本身,nCtlColor标识
    引发调用的WM_CTLCOLOR的消息类型(不同控件给父窗口发送的WM_CTLCOLOR的消息类型不同)
    WM_CTLCOLOR消息类型           控件类型01
    CTLCOLOR_BTN                  按钮 处理此消息对按钮外观无影响,Window只使用系统颜色来绘制按钮.                    
    CTLCOLOR_DLG                  对话框
    CTLCOLOR_EDIT                 编辑控件以及组合框的编辑控件部分
    CTLCOLOR_LISTBOX              列表框以及组合框的列表框部分
    CTLCOLOR_MSGBOX               消息框
    CTLCOLOR_SCROLLBAR            滚动条
    CTLCOLOR_STATIC               静态控件、复选框、单选框、组框、只读或无效编辑控件以及无效组合框中的编辑控件
    
    第一种方法:在父窗口添加OnCtlColor函数
    第二章方法:使用派生类,并使用MFC的ON_WM_CTLCOLOR_REFLECT宏将不会被控件父窗口处理的WM_CTLCOLOR消息传递给控件自己这里,对应的消息处理函数为CtlColor,他不包含PWnd参数
    。
    静态控件:通过CDC::SetTextColor和SetBackColor设置文本的颜色以及文本的背景和控件其他地方的背景
    滚动条控件:这两个函数什么都不做,只通过WM_CTLCOLORSCROLLBAR消息处理程序给滚动条主体添加颜色
    列表框:只影响非加亮的列表框项目,画笔控制列表框的背景(文本的空行和非加亮的显示行不进行绘制)
    按钮:Windows使用系统颜色绘制,这两个函数不起作用。

12、消息反射
    允许通知消息被反射回发送他们的控件,消息反射对于创建可以重用控件类是一个功能强大的工具,因为它使得派生类控件类具有了独立于父窗口执行自身操作的能力,
    如派生列表框类CMyListBox中增加 ON_CONTROL_REFLECT(LBN_DBLCLK,OnDoubleClick)),则每当列表框给父窗口发送LBN_DBLCLK时就调用CMyListBox::OnDoubleClick,
    不过只有父窗口不处理通知时才将通知反射回来,
    也就是父窗口的消息映射表中没有包含ON_LBN_DBLCLK输入项时。父窗口优先接收,这与Windows希望父窗口处理感兴趣的通知是一致的。
    
    MFC消息反射宏:                                             说明
    ON_CONTROL_REFLECT                                         反射由WM_COMMAND消息接替的通知
    ON_NOTIFY_REFLECT                                          反射由WM_NOTIFY消息接替的通知
    ON_UPDATE_COMMAND_UI_REFLECT                               反射传递给工具栏、状态栏以及其他用户接口对象的更新通知
    ON_WM_CTLCOLOR_REFLECT                                     反射由WM_CTLCOLOR消息
    ON_WM_DRAWITEM_REFLECT                                     反射由自制控件发送的WM_DRAWITEM消息
    ON_WM_MEASUREITEM_REFLECT                                  反射由自制控件发送的WM_MEASUREITEM消息
    ON_WM_COMPAREITEM_REFLECT                                  反射由自制控件发送的WM_COMPAREITEM消息
    ON_WM_DELETEITEM_REFLECT                                   反射由自制控件发送的WM_DELETEITEM消息
    ON_WM_CHARTOITEM_REFLECT                                   反射由自制控件发送的WM_CHARTOITEM消息
    ON_WM_VKEYTOITEM_REFLECT                                   反射由自制控件发送的WM_VKEYTOITEM消息
    ON_WM_HSCROLL_REFLECT                                      反射由自制控件发送的WM_HSCROLL消息
    ON_WM_VSCROLL_REFLECT                                      反射由自制控件发送的WM_VSCROLL消息
    ON_WM_PARENTNOTIFY_REFLECT                                 反射由自制控件发送的WM_PARENTNOTIFY消息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值