下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC 编程指南

VC 编程指南.doc

VC 编程指南

简单的剪刀鉐头咘
2017-09-28 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC 编程指南doc》,可适用于IT/计算机领域

VC编程指南传统控件在上一课的表已经列出了Windows的传统控件及其对应的控件类。在这些控件中读者应该重点掌握命令按钮、选择框、单选按钮、编辑框、列表框和组合框。传统控件的控件通知消息控件通过向父窗口发送控件通知消息来表明发生了某种事件.例如当用户在按钮上单击鼠标时按钮控件会向父窗口发送BNCLICKED消息.传统控件的通知消息实际上是通过WMCOMMAND消息发给父窗口的(滚动条除外)在该消息的wParam中含有通知消息码(如BNCLICKED)和控件的ID在lParam中则包含了控件的句柄.利用ClassWizard可以很容易地为控件通知消息加入消息映射和消息处理函数这在上一章中已经演示过了.传统控件的消息映射宏是ONXXXX其中XXXX表示通知消息码如BNCLICKED.ONXXXX消息映射如下所示该宏有两个参数一个是控件的ID一个是消息处理函数名.ONXXXX(nID,memberFxn)消息处理函数的声明应该有如下形式:afxmsgvoidmemberFxn()例如某按钮的BNCLICKED消息的消息映射及其处理函数的声明如下所示ONBNCLICKED(IDCADD,OnAdd)afxmsgvoidOnAdd()有时为了处理方便需要把多个ID连续的控件发出的相同消息映射到同一个处理函数上.这就要用到ONCONTROLRANGE宏.ONCONTROLRANGE消息映射宏的第一个参数是控件消息码第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID最后一个参数是消息处理函数名。例如要处理一组单选按钮发出的BNCLICKED消息相应的消息映射如下所示:ONCONTROLRANGE(BNCLICKED,IDCFIRST,IDCLAST,OnRadioClicked)函数OnRadioClicked的声明如下该函数比上面的OnAdd多了一个参数nID以说明发送通知消息的控件ID.afxmsgvoidOnRadioClicked(UINTnID)ClassWizard不支持ONCONTROLRANGE宏所以需要手工建立消息映射和消息处理函数.提示:事实上在使用ClassWizard时只要运用一个小小的技巧就可以把不同控件的通知消息映射到同一个处理函数上也可以把一个控件的不同通知消息映射到同一个处理函数上.这个技巧就是在用ClassWizard创建消息E风格。编辑框支持剪贴板操作。CEdit类提供了一些与剪贴板有关的成员函数如表所示。表与剪切板有关的CEdit成员函数voidClear()清除编辑框中被选择的正文。voidCopy()把在编辑框中选择的正文拷贝到剪贴板中。voidCut()清除编辑框中被选择的正文并把这些正文拷贝到剪贴板中。voidPaste()将剪贴板中的正文插入到编辑框的当前插入符处。撤消上一次键入。对于单行编辑框该函数总返回TRUE对于多BOOLUndo()行编辑框返回TRUE表明操作成功否则返回FALSE。可以用下列CEdit或CWnd类的成员函数来查询编辑框。在学习下面的函数时读者会经常遇到术语字符索引.字符的字符索引是指从编辑框的开头字符开始的字符编号它是从零开始编号的.也就是说字符索引实际上是指当把整个编辑正文看作一个字符串数组时该字符所在的数组元素的下标.intGetWindowText(LPTSTRlpszStringBuf,intnMaxCount)constvoidGetWindowText(CStringrString)const这两个函数均是CWnd类的成员函数可用来获得窗口的标题或控件中的正文。第一个版本的函数用lpszStringBuf参数指向的字符串数组作为拷贝正文的缓冲区参数nMaxCount可以拷贝到缓冲区中的最大字符数该函数返回以字节为单位的实际拷贝字符数(不包括结尾的空字节)。第二个版本的函数用一个CString对象作为缓冲区。intGetWindowTextLength()constCWnd的成员函数可用来获得窗口的标题或控件中的正文的长度。DWORDGetSel()constvoidGetSel(intnStartChar,intnEndChar)const两个函数都是CEdit的成员函数用来获得所选正文的位置。GetSel的第一个版本返回一个DWORD值其中低位字说明了被选择的正文开始处的字符索引高位字说明了选择的正文结束处的后面一个字符的字符索引如果没有正文被选择那么返回的低位和高位字节都是当前插入符所在字符的字符索引。GetSel的第二个版本的两个参数是两个引用其含义与第一个版本函数返回值的低位和高位字相同。intLineFromChar(intnIndex=–)constCEdit的成员函数仅用于多行编辑框用来返回指定字符索引所在行的行索引(从零开始编号)。参数nIndex指定了一个字符索引如果nIndex是那么函数将返回选择正文的第一个字符所在行的行号若没有正文被选择则该函数会返回当前的插入符所在行的行号。intLineIndex(intnLine=–)constCEdit的成员函数仅用于多行编辑框用来获得指定行的开头字符的字符索引如果指定行超过了编辑框中的最大行数该函数将返回。参数nLine是指定了从零开始的行索引如果它的值为则函数返回当前的插入符所在行的字符索引。intGetLineCount()constCEdit的成员函数仅用于多行编辑框用来获得正文的行数。如果编辑框是空的那么该函数的返回值是。intLineLength(intnLine=–)constCEdit的成员函数用于获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内)。参数nLine说明了字符索引.如果nLine的值为则函数返回当前行的长度(假如没有正文被选择)或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框则函数返回整个正文的长度。intGetLine(intnIndex,LPTSTRlpszBuffer)constintGetLine(intnIndex,LPTSTRlpszBuffer,intnMaxLength)constCEdit的成员函数仅用于多行编辑框用来获得指定行的正文(不包括行尾的回车和换行符)。参数nIndex是行号lpszBuffer指向存放正文的缓冲区nMaxLength规定了拷贝的最大字节数若。函数返回实际拷贝的字节数若指定的行号大于编辑框的实际行数则函数返回。需要注意的是GetLine函数不会在缓冲区中字符串的末尾加字符串结束符().下列CWnd或CEdit类的成员函数可用来修改编辑框控件。voidSetWindowText(LPCTSTRlpszString)CWnd的成员函数可用来设置窗口的标题或控件中的正文。参数lpszString可以是一个CString对象或是一个指向字符串的指针。voidSetSel(DWORDdwSelection,BOOLbNoScroll=FALSE)voidSetSel(intnStartChar,intnEndChar,BOOLbNoScroll=FALSE)CEdit的成员函数用来选择编辑框中的正文。参数dwSelection的低位字说明了选择开始处的字符索引高位字说明了选择结束处的字符索引。如果低位字为且高位字节为那么就选择所有的正文如果低位字节为则取消所有的选择.参数bNoScroll的值如果是FALSE则滚动插入符并使之可见否则就不滚动.参数nStartChar和nEndChar的含义与参数dwSelection的低位字和高位字相同.voidReplaceSel(LPCTSTRlpszNewText,BOOLbCanUndo=FALSE)CEdit的成员函数用来将所选正文替换成指定的正文.参数lpszNewText指向用来替换的字符串.参数bCanUndo的值为TRUE说明替换是否可以被撤消的.在调用上述函数时如果涉及的是一个多行编辑框那么除了LineLength和GetLine函数外都要把回车和换行符考虑在内.例如假设在编辑框中有如下几行正文:abcdefgij那么字母"e"的字符索引是而不是因为"abcd"后面还有一对回车换行符.调用LineLength()会返回第二行的长度.调用LineIndex()会得到.调用LineFromChar()会返回.如果没有选择任何正文并且插入符在字母"e"上那么调用GetSel返回值的低位和高位字都是.通过分析上述函数我们可以总结出一些查询和设置编辑框的方法.调用CWnd的成员函数GetWindowText和SetWindowText可以查询和设置编辑框的整个正文在上一章的Register程序中我们就使用过这两个函数.如果想对多行编辑框逐行查询那么应该先调用GetLineCount获得总行数然后再调用GetLine来获取每一行的正文.下面一段代码演示了如何对多行编辑框进行逐行查询.charbufinttotal=MyEditGetLineCount()inti,lengthfor(i=i<totali){length=MyEditGetLine(i,buf,)buflength=加字符串结束符}可以利用LineIndex和LineFromChar来在字符索引和字符的行列坐标之间相互转换.下列代码演示了在已知字符索引的情况下如何获得对应的行列坐标:introw,columnrow=MyEditLineFromChar(charIndex)column=charIndexMyEditLineIndex(row)下列代码演示了在已知字符的行列坐标的情况下如何获得对应的字符索引:intcharIndexcharIndex=MyEditLineIndex(row)column不难看出字符索引与对应的行列坐标的关系是:字符索引=LineIndex(行坐标)列坐标.对于选择正文的查询和设置应该利用函数GetSel、SetSel和ReplaceSel.可以利用GetSel和SetSel来查询和设置插入符的位置.SetSel可以使编辑框滚动到插入符的新位置.要获取插入符的行列坐标可用下面的代码实现:MyEditSetSel(,)取消正文的选择intstart,end,row,columnMyEditGetSel(start,end)start或end的值就是插入符的字符索引row=MyEditLineFromChar(start)获取插入符的行坐标column=startMyEditLineIndex(row)获取插入符的列坐标下面的代码演示了如何把插入符移到指定的行和列:MyEditSetSel(,)取消正文的选择intcharIndex=MyEditLineIndex(row)columnMyEditSetSel(charIndex,charIndex)可以利用ReplaceSel函数在插入符处插入正文典型的代码如下所示:MyEditSetSel(,)取消正文的选择MyEditReplaceSel(“”)可以利用ReplaceSel清除编辑框中的正文典型的代码如下所示:MyEditSetSel(,)选择全部正文MyEditReplaceSel(“”)在后面的小节中读者将会看到使用编辑框的例子.滚动条控件滚动条(ScrollBar)主要用来从某一预定义值范围内快速有效地进行选择.滚动条分垂直滚动条和水平滚动条两种.在滚动条内有一个滚动框用来表示当前的值.用鼠标单击滚动条可以使滚动框移动一页或一行也可以直接拖动滚动框.滚动条既可以作为一个独立控件存在也可以作为窗口、列表框和组合框的一部分.Windows的滚动条支持比例滚动框即用滚动框的大小来反映页相对于整个范围的大小.Windowsx使用单独的滚动条控件来调整调色板、键盘速度以及鼠标灵敏度在Windows中滚动条控件被轨道条取代(参见)不提倡使用单独的滚动条控件.需要指出的是从性质上划分滚动条可分为标准滚动条和滚动条控件两种.标准滚动条是由WSHSCROLL或WSVSCROLL风格指定的它不是一个实际的窗口而是窗口的一个组成部分(例如列表框中的滚动条)只能位于窗口的右侧(垂直滚动条)或底端(水平滚动条).标准滚动条是在窗口的非客户区中创建的.与之相反滚动条控件并不是窗口的一个零件而是一个实际的窗口可以放置在窗口客户区的任意地方它既可以独立存在也可以与某一个窗口组合行使滚动窗口的职能.由于滚动条控件是一个独立窗口因此可以拥有输入焦点可以响应光标控制键如PgUp、PgDown、Home和End.MFC的CScrollBar类封装了滚动条控件.CScrollBar类的Create成员函数负责创建控件该函数的声明为BOOLCreate(DWORDdwStyle,constRECTrect,CWnd*pParentWnd,UINTnID)参数dwStyle指定了控件的风格.rect说明了控件的位置和尺寸.pParentWnd指向父窗口该参数不能为。nID则说明了控件的ID。如果创建成功该函数返回TRUE否则返回FALSE.要创建一个普通的水平滚动条控件应指定风格WSCHILD|WSVISIBLE|BSHORZ.要创建一个普通的垂直滚动条控件应指定风格WSCHILD|WSVISIBLE|BSVERT.主要的CScrollBar类成员函数如下所示:intGetScrollPos()const该函数返回滚动框的当前位置.若操作失败则返回.intSetScrollPos(intnPos,BOOLbRedraw=TRUE)该函数将滚动框移动到指定位置.参数nPos指定了新的位置.参数bRedraw表示是否需要重绘滚动条如果为TRUE则重绘之.函数返回滚动框原来的位置.若操作失败则返回.voidGetScrollRange(LPINTlpMinPos,LPINTlpMaxPos)const该函数对滚动条的滚动范围进行查询.参数lpMinPos和lpMaxPos分别指向滚动范围的最小最大值.voidSetScrollRange(intnMinPos,intnMaxPos,BOOLbRedraw=TRUE)该函数用于指定滚动条的滚动范围.参数nMinPos和nMaxPos分别指定了滚动范围的最小最大值.由这两者指定的滚动范围不得超过.当两者都为时滚动条将被隐藏.参数bRedraw表示是否需要重绘滚动条如果为TRUE则重绘之.BOOLGetScrollInfo(LPSCROLLINFOlpScrollInfo,UINTnMask)该函数用来获取滚动条的各种状态包括滚动范围、滚动框的位置和页尺寸.参数lpScrollInfo指向一个SCROLLINFO结构该结构如下所示:typedefstructtagSCROLLINFO{UINTcbSize结构的尺寸(字节为单位)UINTfMask*说明结构中的哪些参数是有效的可以是屏蔽值的组合如SIFPOS|SIFPAGE若为SIFALL则整个结构都有效*intnMin滚动范围最大值当fMask中包含SIFRANGE时有效intnMax滚动范围最小值当fMask中包含SIFRANGE时有效UINTnPage*页尺寸用来确定比例滚动框的大小当fMask中包含SIFPAGE时有效*intnPos滚动框的位置当fMask中包含SIFPOS有效intnTrackPos*拖动时滚动框的位置当fMask中包含SIFTRACKPOS时有效该参数只能查询不能设置最好不要用该参数来查询拖动时滚动框的位置*}SCROLLINFOtypedefSCROLLINFOFAR*LPSCROLLINFO参数nMask的意义与SCROLLINFO结构中的fMask相同.函数在获得有效值后返回TRUE否则返回FALSE.BOOLSetScrollInfo(LPSCROLLINFOlpScrollInfo,BOOLbRedraw=TRUE)该函数用于设置滚动条的各种状态一个重要用途是设定页尺寸从而实现比例滚动框.参数lpScrollInfo指向一个SCROLLINFO结构参数bRedraw表示是否需要重绘滚动条如果为TRUE则重绘之.若操作成功该函数返回TRUE否则返回FALSE.CWnd类也提供了一些函数来查询和设置所属的标准滚动条.这些函数与CScrollBar类的函数同名且功能相同但每个函数都多了一个参数用来选择滚动条.例如CWnd::GetScrollPos的声明为intGetScrollPos(intnBar)const参数nBar用来选择滚动条可以为下列值:SBHORZ指定水平滚动条SBVERT指定垂直滚动条无论是标准滚动条还是滚动条控件滚动条的通知消息都是用WMHSCROLL和WMVSCROLL消息发送出去的.对这两个消息的确省处理函数是CWnd::OnHScroll和CWnd::OnVScroll它们几乎什么也不做.一般需要在派生类中对这两个函数从新设计以实现滚动功能.这两个函数的声明为afxmsgvoidOnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)afxmsgvoidOnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)参数nSBCode是通知消息码如表所示.nPos是滚动框的位置只有在nSBCode为SBTHUMBPOSITION或SBTHUMBTRACK时该参数才有意义.如果通知消息是滚动条控件发来的那么pScrollBar是指向该控件的指针如果是标准滚动条发来的则pScrollBar为.SBBOTTOMSBRIGHT(二者的消息码滚动到底端(右端).是一样的因此可以混用下同)SBTOPSBLEFT滚动到顶端(左端).SBLINEDOWNSBLINERIGHT向下(向右)滚动一行(列).SBLINEUPSBLINELEFT向上(向左)滚动一行(列).SBPAGEDOWNSBPAGERIGHT向下(向右)滚动一页.SBPAGEUPSBPAGELEFT向上(向左)滚动一页.SBTHUMBPOSITION滚动到指定位置.SBTHUMBTRACK滚动框被拖动.可利用该消息来跟踪对滚动框的拖动.SBENDSCROLL滚动结束.小节的例子中读者将学会如何使用滚动条以及如何编写自己的OnHScroll函数.列表框控件列表框主要用于输入它允许用户从所列出的表项中进行单项或多项选择被选择的项呈高亮度显示.列表框具有边框并且一般带有一个垂直滚动条.列表框分单选列表框和多重选择列表框两种.单选列表框一次只能选择一个列表项而多重选择列表框可以进行多重选择.对于列表项的选择微软公司有如下建议:单击鼠标选择一个列表项单击一个按钮来处理选择的项.双击鼠标选择一个列表项是处理选择项的快捷方法.列表框会向父窗口发送如表所示的通知消息.用户用鼠标双击了一列表项.只有具有LBSNOTIFY的列表框才能发送该LBNDBLCLK消息.LBNERRSPACE列表框不能申请足够的动态内存来满足需要.LBNKILLFOCUS列表框失去输入焦点.LBNSELCANCEL当前的选择被取消.只有具有LBSNOTIFY的列表框才能发送该消息.单击鼠标选择了一列表项.只有具有LBSNOTIFY的列表框才能发送该消LBNSELCHANGE息.LBNSETFOCUS列表框获得输入焦点.当列表框收到WMCHAR消息后向父窗口发送该消息.只有具有WMCHARTOITEMLBSWANTKEYBOARDINPUT风格的列表框才会发送该消息.当列表框收到WMKEYDOWN消息后向父窗口发送该消息.只有具有WMVKEYTOITEMLBSWANTKEYBOARDINPUT风格的列表框才会发送该消息.MFC的CListBox类封装了列表框.CListBox类的Create成员函数负责列表框的创建该函数的声明是BOOLCreate(DWORDdwStyle,constRECTrect,CWnd*pParentWnd,UINTnID)参数dwStyle指定了列表框控件的风格如表所示dwStyle可以是这些风格的组合.rect说明了控件的位置和尺寸.pParentWnd指向父窗口该参数不能为。nID则说明了控件的ID。如果创建成功该函数返回TRUE否则返回FALSE.支持多重选择.在点击列表项时按住Shift键或Ctrl键即LBSEXTENDEDSEL可选择多个项.LBSHASSTRINGS指定一个含有字符串的自绘式列表框.指定一个水平滚动的多列列表框通过调用LBSMULTICOLUMNCListBox::SetColumnWidth来设置每列的宽度.支持多重选择.列表项的选择状态随着用户对该项单击或双LBSMULTIPLESEL击鼠标而翻转.列表框的尺寸由应用程序而不是Windows指定.通常LBSNOINTEGRALHEIGHTWindows指定尺寸会使列表项的某些部分隐藏起来.当选择发生变化时防止列表框被更新可发送WMSETREDRAWLBSNOREDRAW来改变该风格.LBSNOTIFY当用户单击或双击鼠标时通知父窗口.指定自绘式列表框即由父窗口负责绘制列表框的内容并LBSOWNERDRAWFIXED且列表项有相同的高度.LBSOWNERDRAWVARIABLE指定自绘式列表框并且列表项有不同的高度.LBSSORT使插入列表框中的项按升序排列.相当于指定了WSBORDER|WSVSCROLL|LBSSORTLBSSTANDARD|LBSNOTIFY.使列表框在显示列表项时识别并扩展制表符(‘t’)缺省LBSUSETABSTOPS的制表宽度是个对话框单位.允许列表框的父窗口接收WMVKEYTOITEM和WMCHARTOITEMLBSWANTKEYBOARDINPUT消息以响应键盘输入.LBSDISABLENOSCROLL使列表框在不需要滚动时显示一个禁止的垂直滚动条.除了上表中的风格外一般还要为列表框控件指定WSCHILD、WSVISIBLE、WSTABSTOP、WSBORDER和WSVSCROLL风格.要创建一个普通的单选择列表框应指定的风格为WSCHILD|WSVISIBLE|WSTABSTOP|LBSSTANDARD.要创建一个多重选择列表框应该在单选择列表框风格的基础上再加上LBSMULTIPLESEL或LBSEXTENDEDSEL.如果不希望列表框排序就不能使用LBSSTANDARD风格.对于用对话框模板编辑器创建的列表框控件可以在控件的属性对话框中指定表中列出的控件风格。例如在属性对话框中选择Sort项相当与指定了LBSSORT风格。CListBox类的成员函数有数十个之多.我们可以把一些常用的函数分为三类在下面列出.需要说明的是可以用索引来指定列表项索引是从零开始的.首先CListBox成员函数提供了下列函数用于插入和删除列表项.intAddString(LPCTSTRlpszItem)该函数用来往列表框中加入字符串其中参数lpszItem指定了要添加的字符串.函数的返回值是加入的字符串在列表框中的位置如果发生错误会返回LBERR或LBERRSPACE(内存不够).如果列表框未设置LBSSORT风格那么字符串将被添加到列表的末尾如果设置了LBSSORT风格字符串会按排序规律插入到列表中.intInsertString(intnIndex,LPCTSTRlpszItem)该函数用来在列表框中的指定位置插入字符串.参数nIndex给出了插入位置(索引)如果值为则字符串将被添加到列表的末尾.参数lpszItem指定了要插入的字符串.函数返回实际的插入位置若发生错误会返回LBERR或LBERRSPACE.与AddString函数不同InsertString函数不会导致LBSSORT风格的列表框重新排序.不要在具有LBSSORT风格的列表框中使用InsertString函数以免破坏列表项的次序.intDeleteString(UINTnIndex)该函数用于删除指定的列表项其中参数nIndex指定了要删除项的索引.函数的返回值为剩下的表项数目如果nIndex超过了实际的表项总数则返回LBERR.voidResetContent()该函数用于清除所有列表项.intDir(UINTattr,LPCTSTRlpszWildCard)该函数用来向列表项中加入所有与指定通配符相匹配的文件名或驱动器名.参数attr为文件类型的组合如表所示.参数lpszWildCard指定了通配符(如*cpp**等).x普通文件(可读写的文件).x只读文件.x隐藏文件.x系统文件.x目录.x文件的归档位已被设置.x包括了所有与通配符相匹配的驱动器.排除标志.若指定该标志则只列出指定类型的文件名否则x先要列出普通文件然后再列出指定的文件.下列的CListBox成员函数用于搜索、查询和设置列表框.intGetCount()const该函数返回列表项的总数若出错则返回LBERR.intFindString(intnStartAfter,LPCTSTRlpszItem)const该函数用于对列表项进行与大小写无关的搜索.参数nStartAfter指定了开始搜索的位置,合理指定nStartAfter可以加快搜索速度若nStartAfter为则从头开始搜索整个列表.参数lpszItem指定了要搜索的字符串.函数返回与lpszItem指定的字符串相匹配的列表项的索引若没有找到匹配项或发生了错误函数会返回LBERR.FindString函数先从nStartAfter指定的位置开始搜索若没有找到匹配项则会从头开始搜索列表.只有找到匹配项或对整个列表搜索完一遍后搜索过程才会停止所以不必担心会漏掉要搜索的列表项.intGetText(intnIndex,LPTSTRlpszBuffer)constvoidGetText(intnIndex,CStringrString)const用于获取指定列表项的字符串.参数nIndex指定了列表项的索引.参数lpszBuffer指向一个接收字符串的缓冲区.引用参数rString则指定了接收字符串的CString对象.第一个版本的函数会返回获得的字符串的长度若出错则返回LBERR.intGetTextLen(intnIndex)const该函数返回指定列表项的字符串的字节长度.参数nIndex指定了列表项的索引.若出错则返回LBERR.DWORDGetItemData(intnIndex)const每个列表项都有一个位的附加数据.该函数返回指定列表项的附加数据参数nIndex指定了列表项的索引.若出错则函数返回LBERR.intSetItemData(intnIndex,DWORDdwItemData)该函数用来指定某一列表项的位附加数据.参数nIndex指定了列表项的索引.dwItemData是要设置的附加数据值.提示:列表项的位附加数据可用来存储与列表项相关的数据也可以放置指向相关数据的指针.这样当用户选择了一个列表项时程序可以从附加数据中快速方便地获得与列表项相关的数据.intGetTopIndex()const该函数返回列表框中第一个可见项的索引若出错则返回LBERR.intSetTopIndex(intnIndex)用来将指定的列表项设置为列表框的第一个可见项该函数会将列表框滚动到合适的位置.参数nIndex指定了列表项的索引.若操作成功函数返回值否则返回LBERR.提示:由于列表项的内容一般是不变的故CListBox未提供更新列表项字符串的函数.如果要改变某列表项的内容可以先调用DeleteString删除该项然后再用InsertString或AddString将更新后的内容插入到原来的位置.下列CListBox的成员函数与列表项的选择有关.intGetSel(intnIndex)const该函数返回指定列表项的状态.参数nIndex指定了列表项的索引.如果查询的列表项被选择了函数返回一个正值否则返回若出错则返回LBERR.intGetCurSel()const该函数仅适用于单选择列表框用来返回当前被选择项的索引如果没有列表项被选择或有错误发生则函数返回LBERR.intSetCurSel(intnSelect)该函数仅适用于单选择列表框用来选择指定的列表项.该函数会滚动列表框以使选择项可见.参数nIndex指定了列表项的索引若为那么将清除列表框中的选择.若出错函数返回LBERR.intSelectString(intnStartAfter,LPCTSTRlpszItem)该函数仅适用于单选择列表框用来选择与指定字符串相匹配的列表项.该函数会滚动列表框以使选择项可见.参数的意义及搜索的方法与函数FindString类似.如果找到了匹配的项函数返回该项的索引如果没有匹配的项函数返回LBERR并且当前的选择不被改变.intGetSelCount()const该函数仅用于多重选择列表框它返回选择项的数目若出错函数返回LBERR.intSetSel(intnIndex,BOOLbSelect=TRUE)该函数仅适用于多重选择列表框它使指定的列表项选中或落选.参数nIndex指定了列表项的索引若为则相当于指定了所有的项.参数bSelect为TRUE时选中列表项否则使之落选.若出错则返回LBERR.intGetSelItems(intnMaxItems,LPINTrgIndex)const该函数仅用于多重选择列表框用来获得选中的项的数目及位置.参数nMaxItems说明了参数rgIndex指向的数组的大小.参数rgIndex指向一个缓冲区该数组是一个整型数组用来存放选中的列表项的索引.函数返回放在缓冲区中的选择项的实际数目若出错函数返回LBERR.intSelItemRange(BOOLbSelect,intnFirstItem,intnLastItem)该函数仅用于多重选择列表框用来使指定范围内的列表项选中或落选.参数nFirstItem和nLastItem指定了列表项索引的范围.如果参数bSelect为TRUE那么就选择这些列表项否则就使它们落选.若出错函数返回LBERR.在小节的例子中读者将会看到对列表框的测试.组合框控件组合框把一个编辑框和一个单选择列表框结合在了一起.用户既可以在编辑框中输入也可以从列表框中选择一个列表项来完成输入.如上一章所提到的组合框分为简易式(Simple)、下拉式(Dropdown)和下拉列表式(DropList)三种.简易式组合框包含一个编辑框和一个总是显示的列表框。下拉式组合框同简易式组合框类似二者的区别在于仅当单击下滚箭头后列表框才会弹出。下拉列表式组合框也有一个下拉的列表框但它的编辑框是只读的不能输入字符。Windows中比较常用的是下拉式和下拉列表式组合框在DeveloperStudio中就大量使用了这两种组合框.二者都具有占地小的特点这在界面日益复杂的今天是十分重要的.下拉列表式组合框的功能与列表框类似.下拉式组合框的典型应用是作为记事列表框使用既把用户在编辑框中敲入的东西存储到列表框组件中这样当用户要重复同样的输入时可以从列表框组件中选取而不必在编辑框组件中从新输入.在DeveloperStudio中的Find对话框中就可以找到一个典型的下拉式组合框.要设计一个记事列表框应采取下列原则:在创建组合框时指定CBSDROPDOWNLIST风格.要限制列表项的数目以防止内存不够.如果在编辑框中输入的字符串不能与列表框组件中的列表项匹配那么应该把该字符串插入到列表框中的位置处.最老的项处于列表的末尾.如果列表项的数目超出了限制则应把最老的项删除.如果在编辑框中输入的字符串可以与列表框组件中的某一项完全匹配则应该先把该项从列表的当前位置删除然后在将其插入道列表的位置处.组合框控件会向父窗口发送表所示的通知消息.组合框的列表框组件被关闭.简易式组合框不会发出该消CBNCLOSEUP息.用户在某列表项上双击鼠标.只有简易式组合框才会发出CBNDBLCLK该消息.CBNDROPDOWN组合框的列表框组件下拉.简易式组合框不会发出该消息.编辑框的内容被用户改变了。与CBNEDITUPDATE不同该CBNEDITCHANGE消息是在编辑框显示的正文被刷新后才发出的。下拉列表式组合框不会发出该消息.在编辑框准备显示改变了的正文时发送该消息。下拉列表CBNEDITUPDATE式组合框不会发出该消息.CBNERRSPACE组合框无法申请足够的内存来容纳列表项.表明用户的选择应该取消.当用户在列表框中选择了一项CBNSELENDCANCEL然后又在组合框控件外单击鼠标时就会导致该消息的发送.用户选择了一项然后按了回车键或单击了下滚箭头.该CBNSELENDOK消息表明用户确认了自己所作的选择.CBNKILLFOCUS组合框失去了输入焦点.CBNSELCHANGE用户通过点击或移动箭头键改变了列表的选择.CBNSETFOCUS组合框获得了输入焦点.MFC的CComboBox类封装了组合框.需要指出的是虽然组合框是编辑框和列表框的选择但是CComboBox类并不是CEdit类和CListBox类的派生类而是CWnd类的派生类.CComboBox的成员函数Create负责创建组合框该函数的说明如下:BOOLCreate(DWORDdwStyle,constRECTrect,CWnd*pParentWnd,UINTnID)参数dwStyle指定了组合框控件的风格如表所示dwStyle可以是这些风格的组合.rect说明的是列表框组件下拉后组合框的位置和尺寸.pParentWnd指向父窗口该参数不能为。nID则说明了控件的ID。如果创建成功该函数返回TRUE否则返回FALSE.提示:在用Create函数创建组合框时参数rect说明的是包括列表框组件在内的组合框的位置和尺寸而不是列表框组件隐藏时的编辑框组件尺寸.要设置编辑框组件的高度可以调用成员函数SetItemHeight(,cyItemHeight)其中参数cyItemHeight指定了编辑框的高度(以像素为单位).表组合框的风格CBSAUTOHSCROLL使编辑框组件具有水平滚动的风格.CBSDROPDOWN指定一个下拉式组合框.CBSDROPDOWNLIST指定一个下拉列表式组合框.CBSHASSTRINGS指定一个含有字符串的自绘式组合框.使编辑框组件中的正文可以在ANSI字符集和OEM字符集之间相CBSOEMCONVERT互转换。这在编辑框中包含文件名时是很有用的。指定自绘式组合框即由父窗口负责绘制列表框的内容并且列CBSOWNERDRAWFIXED表项有相同的高度.CBSOWNERDRAWVARIABLE指定自绘式组合框并且列表项有不同的高度.CBSSIIMPLE指定一个简易式组合框.CBSSORT自动对列表框组件中的项进行排序.CBSDISABLENOSCROLL使列表框在不需要滚动时显示一个禁止的垂直滚动条.组合框的尺寸由应用程序而不是Windows指定.通常由WindowsCBSNOINTEGRALHEIGHT指定尺寸会使列表项的某些部分隐藏起来.CBSSIMPLE、CBSDROPDOWN和CBSDROPDOWNLIST分别用来将组合框指定为简易式、下拉式和下拉列表式.一般还要为组合框指定WSCHILD、WSVISIBLE、WSTABSTOP、WSVSCROLL和CBSAUTOHSCROLL风格.如果要求自动排序还应指定CBSSORT风格.对于用对话框模板编辑器创建的组合框控件可以在控件的属性对话框中指定上表中列出的控件风格。例如在属性对话框中选择Dropdown相当于指定了CBSDROPDOWN.CComboBox类的成员函数较多.其中常用的函数可粗分为两类分别针对编辑框组件和列表框组件.可以想象这些函数与CEdit类和CListBox类的成员函数肯定有很多类似之处但它们也会有一些不同的特点.如果读者能从"组合框是由编辑框和列表框组成"这一概念出发就能够很快的掌握CComboBox的主要成员函数.事实上绝大部分CComboBox的成员函数都可以看成是CEdit或CListBox成员函数的翻版.函数的功能函数名甚至函数的参数都是类似的.为了方便学习在下面列出CComboBox类的成员函数时采用了与对应的CEdit或CListBox成员函数相比较的做法.在成员函数的列表中分别列出了成员函数名对应的CEdit或CListBox成员函数以及二者之间的不同之处.不同之处是指函数的功能、参数以及返回值有什么差别.针对编辑框组件的主要成员函数如表所示.该表的前三个函数实际上是CWnd类的成员函数可用来查询和设置编辑框组件.CWnd::GetWindowTextCWnd::GetWindowText无.CWnd::SetWindowTextCWnd::SetWindowText无.CWnd::GetWindowTextLengthCWnd::GetWindowTextLengthGetEditSelGetSel的第一个版本仅函数名不同.函数名不同且无SetEditSelSetSel的第二个版本bNoScroll参数.ClearClear无.CopyCopy无.CutCut无.PastePaste无.与CListBox的成员函数类似针对列表框组件的CComboBox成员函数也可以分为三类.表列出了用于插入和删除列表项的成员函数表列出了用于搜索、查询和设置列表框的成员函数与列表项的选择有关的成员函数在表中列出.需要指出的是如果这些函数出错则反回CBERR而不是LBERR.另外排序的组合框具有的是CBSSORT风格而不是LBSSORT.AddStringAddString无.InsertStringInsertString无.DeleteStringDeleteString无.ResetContentResetContent无.DirDir无.GetCountGetCount无.FindStringFindString无.GetLBTextGetText仅函数名不同.GetLBTextLenGetTextLen仅函数名不同.GetItemDataGetItemData无.SetItemDataSetItemData无.GetTopIndexGetTopIndex无.SetTopIndexSetTopIndex无.GetCurSelGetCurSel无.新选的列表项的内容会被拷贝SetCurSelSetCurSel到编辑框组件中.新选的列表项的内容会被拷贝SelectStringSelectString到编辑框组件中.另外CComboBox的ShowDropDown成员函数专门负责显示或隐藏列表框组件该函数的声明为voidShowDropDown(BOOLbShowIt=TRUE)如果参数bShowIt的值为TRUE那么将显示列表框组件否则就隐藏之.该函数对简易式组合框没有作用.测试传统控件的一个例子现在让我们编写一个程序来测试一下上面介绍的一些传统控件.该程序名为CtrlTest其界面如图所示.前面介绍的程序都是基于框架窗口的而CtrlTest程序是一个基于对话框的应用程序即以对话框作为程序的主窗口.该程序主要对组合框、列表框、多行编辑框和滚动条控件进行了测试其中:Input组合框是一个记事列表框.在编辑框组件中输入字符串或从列表框组件中选择以前输入过的字符串然后按Add按钮该字符串就会被加入到List列表框中.List列表框是一个多重选择列表框.该列表框具有LBSEXTENDEDSEL风格用户可以单击鼠标进行单项选择也可以按住Shift或Ctrl键后单击鼠标来进行多重选择.用户可以按Delete键删除列表框中选择的项.HistoryofSELCHANGE多行编辑框.该编辑框用于跟踪Input组合框的列表框组件发出的CBNSELCHANGE通知消息编辑框对该消息的响应是显示XXXXselected以表明用户新选择了一个列表项.读者通过该编辑框可以了解组合框是在什么情况下发送CBNSELCHANGE通知消息的.按Clear按钮将清除编辑框.水平滚动条控件的滚动范围是.在滚动条的左边有一个静态正文控件用来动态反映当前滚动框的位置.图CtrlTest程序首先让我们用AppWizard建立一个基于对话框的MFC应用程序.这一过程很简单先将新建的工程命名为CtrlTest然后在MFCAppWizard对话框的第一步中选择Dialogbased就行了.AppWizard会自动建立一个用于应用程序主窗口的对话框模板IDDCTRLTESTDIALOG及其对应的对话框类CCtrlTestDlg.对该对话框的使用与普通对话框并没有什么不同只不过在程序启动后对话框会自动显示出来而当用户关闭对话框后应用程序也就终止了.如果读者观察CCtrlTestApp::InitInstance函数就会发现该函数调用DoModal来显示一个CCtrlTestDlg对话框并使mpMainWnd指针指向CCtrlTestDlg对象从而使该对话框成为程序的主窗口.接下来需要设计IDDCTRLTESTDIALOG对话框模板.请读者将该模板上除OK按钮以外的控件都删除掉将OK按钮的标题改为Close并去掉该按钮的Defaultbutton(缺省按钮)属性.当用户在对话框内按回车键时会激活缺省按钮一般应该把用来确认用户输入操作的按钮设计成缺省按钮.在本例中显然应该把Add按钮设计成缺省按钮而不是Close按钮.这样用户在Input组合框中输入字符串后按回车键就可以将该串加入到List列表框中.请读者根据图和表向IDDCTRLTESTDIALOG对话框模板中加入测试用的控件.静态正文缺省Input:缺省.组合框IDCOMBOBOX去掉Sort属性.命令按钮IDCADDAdd选择Defaultbutton属性.静态正文缺省List:缺省.在Selection栏中选择Extended列表框IDCLISTBOX并去掉Sort属性.命令按钮IDCDELETEDelete缺省.静态正文缺省HistoryofSELCHANGE缺省.选择MultilineVertical编辑框IDCMULTIEDITscrollAutoVScroll和Wantreturn属性.命令按钮IDCCLEARClear缺省.静态正文IDCINDICATOR缺省缺省.滚动条IDCSCROLLBAR缺省.接着利用ClassWizard为CCtrlTestDlg类加入成员变量如表所示这些成员变量都是控件对象.IDCCOMBOBOXCComboBoxmComboBoxIDCLISTBOXCListBoxmListBoxIDCMULTIEDITCEditmMultiEditIDCINDICATORCStaticmIndicatorIDCSCROLLBARCScrollBarmScrollBar接下来用ClassWizard为CCtrlTestDlg类加入控件通知消息处理函数如表所示.表CCtrlTestDlg的控件通知消息处理函数IDCADDBNCLICKEDOnAdd(缺省名)IDCDELETEBNCLICKEDOnDelete(缺省名)IDCCLEARBNCLICKEDOnClear(缺省名)IDCCOMBOBOXCBNSELCHANGEOnSelchangeCombobox(缺省名)CCtrlTestDlgWMHSCROLLOnHScroll(缺省名)最后请读者按清单修改源代码限于篇幅这里仅列出需要手工修改的那一部分.清单CCtrlTestDlg类的部分源代码CtrlTestDlgcpp:implementationfileBOOLCCtrlTestDlg::OnInitDialog(){TODO:Addextrainitializationherereturn}voidCCtrlTestDlg::OnAdd(){TODO:Addyourcontrolnotificationhandlercodehere}voidCCtrlTestDlg::OnClear(){TODO:Addyourcontrolnotificationhandlercodehere}voidCCtrlTestDlg::OnDelete(){TODO:Addyourcontrolnotificationhandlercodehere}voidCCtrlTestDlg::OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar){TODO:AddyourmessagehandlercodehereandorcalldefaultCDialog::OnHScroll(nSBCode,nPos,pScrollBar)}voidCCtrlTestDlg::OnSelchangeCombobox(){TODO:Addyourcontrolnotificationhandlercodehere}在OnInitDialog成员函数中对一些控件进行了初始化包括设置滚动条的范围将静态正文的显示置为“”以及使组合框获得输入焦点.注意缺省时OnInitDialog返回TRUE而新版的函数返回了FALSE.如果OnInitDialog返回TRUE那么Windows将使tab顺序最靠前的可输入控件获得输入焦点如果返回FALSE则表明在OnInitDialog函数中人为地使某个控件获得输入焦点函数返回后系统就不会再设置输入焦点了.有时只要合理的安排了控件的tab顺序就不必在OnInitDialog中人为设置输入焦点.当用户点击Add按钮或按回车键后成员函数OnAdd被调用.该函数将组合框的编辑框中的字符串加入到List列表框的末尾并将该字符串存入到记事列表框中.这时函数会判断如果在记事列表中没有匹配的项则把字符串插入位置并在必要时删除最老的列表项在本例中记事列表框最多可以容纳项如果在记事列表中有匹配的项那么就把该项移到位置.当用户点击Delete按钮时成员函数OnDelete被调用该函数根据CComboBox::GetSelCount获得选择项的数目并根据这个数目动态创建一个整型数组以存放选择项的索引.然后调用CComboBox::GetSelItems来获取选择项的索引.最后把这些选择项删除.注意这里是倒序删除的如果按顺序删除则会使选择项的索引产生错位.成员函数OnSelchangeCombobox是Input组合框的CBNSELCHANGE消息的处理函数.该函数先把多行编辑框的插入符移到编辑正文的末尾然后从插入符处加入一行形如"XXXXselected"的字符串以表明用户从记事列表框中新选择了哪个列表项.值得一提的是上一章的Register程序是用SetWindowText来在编辑正文中插入新的正文的此方法有一个缺点就是不能把插入符滚动到新修改过的地方.在本例中插入编辑正文的方法是先调用CEdit::SetSel移动插入符到指定位置(必要时要滚动以使该位置可见)然后再调用CEdit::ReplaceSel插入新的正文这样做的好处是编辑框总是滚动到新修改过的地方从而使得新修改过的地方总是可见的.对滚动条控件的测试是在OnHScroll成员函数中完成的.该函数是对话框也即父窗口对水平滚动条控件产生的WMHSCROLL消息的处理函数.该函数负责移动滚动框并及时更新静态正文的显示以反映滚动框的当前位置.在函数的开头首先判断是不是mScrollBar滚动条发来的消息这是因为可能会有几个滚动条控件.在该函数中有一个大的switch分枝语句用来获取滚动框的新位置.需要指出的是对于SBTHUMBPOSITION和SBTHUMBTRACK这两种情况应该从OnHScroll函数的nPos参数中获取滚动框的新位置.对于SBTHUMBTRACK不要企图用CScrollBar::GetScrollPos来获取滚动框的新位置因为该函数不能正确返回拖动时的滚动框位置.另一个要注意的问题是Windows本身不会自动地使滚动框移动到新位置上所以需要在OnHScroll中调用CScrollBar::SetScrollPos来移动滚动框

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/45

VC 编程指南

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利