MFC组件消息及函数

上传人:ca****in 文档编号:74537779 上传时间:2022-04-14 格式:DOCX 页数:34 大小:61.58KB
收藏 版权申诉 举报 下载
MFC组件消息及函数_第1页
第1页 / 共34页
MFC组件消息及函数_第2页
第2页 / 共34页
MFC组件消息及函数_第3页
第3页 / 共34页
资源描述:

《MFC组件消息及函数》由会员分享,可在线阅读,更多相关《MFC组件消息及函数(34页珍藏版)》请在装配图网上搜索。

1、6.1传统控件在上一课的表5.1已经列出了Windows的传统控件及其对应的控件类。在这些控件中,读者应该重点掌握命令按钮、选择框、单选按钮、编辑框、列表框和组合框。.1.1 传统控件的控件通知消息控件通过向父窗口发送控件通知消息来表明发生了某种事件例如,当用户在按钮上单击鼠标时,按钮控件会向父窗口发送BN_CLICKED消息传统控件的通知消息实际上是通过WM_COMMAND消息发给父窗口的(滚动条除外),在该消息的wParam中含有通知消息码(如BN_CLICKED)和控件的ID,在lParam中则包含了控件的句柄利用ClassWizard可以很容易地为控件通知消息加入消息映射和消息处理函数

2、,这在上一章中已经演示过了传统控件的消息映射宏是ON_XXXX,其中XXXX表示通知消息码,如BN_CLICKEDON_XXXX消息映射如下所示,该宏有两个参数,一个是控件的ID,一个是消息处理函数名ON_XXXX(nID, memberFxn)消息处理函数的声明应该有如下形式:afx_msg void memberFxn( );例如,某按钮的BN_CLICKED消息的消息映射及其处理函数的声明如下所示ON_BN_CLICKED(IDC_ADD,OnAdd)afx_msg void OnAdd( );有时,为了处理方便,需要把多个ID连续的控件发出的相同消息映射到同一个处理函数上这就要用到ON

3、_CONTROL_RANGE宏ON_CONTROL_RANGE消息映射宏的第一个参数是控件消息码,第二和第三个参数分别指明了一组连续的控件ID中的头一个和最后一个ID,最后一个参数是消息处理函数名。例如,要处理一组单选按钮发出的BN_CLICKED消息,相应的消息映射如下所示:ON_CONTROL_RANGE(BN_CLICKED, IDC_FIRST, IDC_LAST, OnRadioClicked)函数OnRadioClicked的声明如下,该函数比上面的OnAdd多了一个参数nID以说明发送通知消息的控件IDafx_msg void OnRadioClicked(UINT nID);C

4、lassWizard不支持ON_CONTROL_RANGE宏,所以需要手工建立消息映射和消息处理函数提示:事实上,在使用ClassWizard时只要运用一个小小的技巧,就可以把不同控件的通知消息映射到同一个处理函数上,也可以把一个控件的不同通知消息映射到同一个处理函数上这个技巧就是在用ClassWizard创建消息处理函数时,指定相同的函数名即可此方法的优点在于控件的ID不必是连续的,缺点是处理函数没有nID参数,因而不能确定是哪一个控件发送的消息6.1.2 静态控件静态控件包括静态正文(Static Text)和图片控件(Picture)。静态正文控件用来显示正文。图片控件可以显示位图、图标

5、、方框和图元文件,在图片控件中显示图片的好处是不必操心图片的重绘问题。静态控件不能接收用户的输入。在上一章中,读者已经用过静态正文和组框控件。图片控件的例子可以在AppWizard创建的IDD_ABOUTBOX对话框模板中找到,在该模板中有一个图片控件用来显示图标。静态控件的主要起说明和装饰作用。MFC的CStatic类封装了静态控件。CStatic类的成员函数Create负责创建静态控件,该函数的声明为BOOL Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xf

6、fff );参数lpszText指定了控件显示的正文。dwStyle指定了静态控件的风格,表6.1显示了静态控件的各种风格,dwStyle可将这些风格组合起来。rect是一个对RECT或CRect结构的引用,用来说明控件的位置和尺寸。pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE表6.1 静态控件的风格控件风格含义SS_BLACKFRAME指定一个具有与窗口边界同色的框(缺省为黑色)。SS_BLACKRECT指定一个具有与窗口边界同色的实矩形(缺省为黑色)。SS_CENTER使显示的正文居中对齐,正文可以回绕

7、。SS_GRAYFRAME指定一个具有与屏幕背景同色的边框。SS_GRAYRECT指定一个具有与屏幕背景同色的实矩形。SS_ICON使控件显示一个在资源中定义的图标,图标的名字有Create函数的lpszText参数指定。SS_LEFT左对齐正文,正文能回绕。SS_LEFTNOWORDWRAP左对齐正文,正文不能回绕。SS_NOPREFIX使静态正文串中的&不是一个热键提示符。SS_NOTIFY使控件能向父窗口发送鼠标事件消息。SS_RIGHT右对齐正文,可以回绕。SS_SIMPLE使静态正文在运行时不能被改变并使正文显示在单行中。SS_USERITEM指定一个用户定义项。SS_WHITEFR

8、AME指定一个具有与窗口背景同色的框(缺省为白色)。SS_WHITERECT指定一个具有与窗口背景同色的实心矩形(缺省为白色)。除了上表中的风格外,一般还要为控件指定WS_CHILD和WS_VISIBLE窗口风格。一个典型的静态正文控件的风格为WS_CHILD|WS_VISIBLE|SS_LEFT。对于用对话框模板编辑器创建的静态控件,可以在控件的属性对话框中指定表6.1中列出的控件风格。例如,可以在静态正文控件的属性对话框中选择Simple,这相当于指定了SS_SIMPLE风格。Cstatic类主要的成员函数在表6.2中列出。可以利用CWnd类的成员函数GetWindowText,SetWi

9、ndowText和GetWindowTextLength等函数来查询和设置静态控件中显示的正文表6.2 CStatic类的主要成员函数函数声明用途HBITMAP SetBitmap( HBITMAP hBitmap );指定要显示的位图。HBITMAP GetBitmap( ) const;获取由SetBitmap指定的位图。HICON SetIcon( HICON hIcon );指定要显示的图标。HICON GetIcon( ) const;获取由SetIcon指定的图标。HCURSOR SetCursor( HCURSOR hCursor );指定要显示的光标图片。HCURSOR Get

10、Cursor( );获取由SetCursor指定的光标。HENHMETAFILE SetEnhMetaFile( HENHMETAFILE hMetaFile );指定要显示的增强图元文件。HENHMETAFILE GetEnhMetaFile( ) const;获取由SetEnhMetaFile指定的图元文件。静态控件较简单,故这里就不举例说明了。6.1.3 按钮控件按钮是指可以响应鼠标点击的小矩形子窗口。按钮控件包括命令按钮(Pushbutton)、检查框(Check Box)、单选按钮(Radio Button)、组框(Group Box)和自绘式按钮(Owner-draw Button

11、)。命令按钮的作用是对用户的鼠标单击作出反应并触发相应的事件,在按钮中既可以显示正文,也可以显示位图。选择框控件可作为一种选择标记,可以有选中、不选中和不确定三种状态。单选按钮控件一般都是成组出现的,具有互斥的性质,即同组单选按钮中只能有一个是被选中的。组框用来将相关的一些控件聚成一组自绘式按钮是指由程序而不是系统负责重绘的按钮。按钮主要是指命令按钮、选择框和单选按钮。后二者实际上是一种特殊的按钮,它们有选择和未选择状态。当一个选择框处于选择状态时,在小方框内会出现一个“”,当单选按钮处于选择状态时,会在圆圈中显示一个黑色实心圆。此外,检查框还有一种不确定状态,这时检查框呈灰色显示,不能接受用

12、户的输入,以表明控件是无效的或无意义的。按钮控件会向父窗口发出如表6.3所示的控件通知消息。表6.3 按钮控件的通知消息消息含义BN_CLICKED用户在按钮上单击了鼠标。BN_DOUBLECLICKED用户在按钮上双击了鼠标。FC的CButton类封装了按钮控件。CButton类的成员函数Create负责创建按钮控件,该函数的声明为BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );参数lpszCaption指定了按钮显示的正文。dwStyle指定了按钮

13、的风格,如表6.4所示,dwStyle可以是这些风格的组合。rect说明了按钮的位置和尺寸。pParentWnd指向父窗口,该参数不能为NULL。nID是按钮的ID。如果创建成功,该函数返回TRUE,否则返回FALSE表6.4 按钮的风格控件风格含义BS_AUTOCHECKBOX同BS_CHECKBOX,不过单击鼠标时按钮会自动反转。BS_AUTORADIOBUTTON同BS_RADIOBUTTON,不过单击鼠标时按钮会自动反转。BS_AUTO3STATE同BS_3STATE,不过单击按钮时会改变状态。BS_CHECKBOX指定在矩形按钮右侧带有标题的选择框。BS_DEFPUSHBUTTON指

14、定缺省的命令按钮,这种按钮的周围有一个黑框,用户可以按回车键来快速选择该按钮。BS_GROUPBOX指定一个组框。BS_LEFTTEXT使控件的标题显示在按钮的左边。BS_OWNERDRAW指定一个自绘式按钮。BS_PUSHBUTTON指定一个命令按钮。BS_RADIOBUTTON指定一个单选按钮,在圆按钮的右边显示正文。BS_3STATE同BS_CHECKBOX,不过控件有三种状态:选择、未选择和变灰。除了上表中的风格外,一般还要为控件指定WS_CHILD、WS_VISIBLE和WS_TABSTOP窗口风格,WS_TABSTOP使控件具有Tabstop属性。创建一个普通按钮应指定的风格为WS

15、_CHILD|WS_VISIBLE|WS_TABSTOP。创建一个普通检查框应指定风格WS_CHILD|WS_VISIBLE|WS_TABSTOP| BS_AUTOCHECKBOX。创建组中第一个单选按钮应指定风格WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_GROUP| BS_AUTORADIOBUTTON,组中其它单选按钮应指定风格则不应该包括WS_TABSTOP和WS_GROUP。对于用对话框模板编辑器创建的按钮控件,可以在控件的属性对话框中指定表6.4中列出的控件风格。例如,在命令按钮的属性对话框中选择Default button,相当于指定了BS_D

16、EFPUSHBUTTON。CButton类的主要的成员函数有:UINT GetState( ) const;该函数返回按钮控件的各种状态。可以用下列屏蔽值与函数的返回值相与,以获得各种信息。0x0003。用来获取检查框或单选按钮的状态。0表示未选中,1表示被选中,2表示不确定状态(仅用于检查框)。0x0004。用来判断按钮是否是高亮度显示的。非零值意味着按钮是高亮度显示的。当用户点击了按钮并按主鼠标左键时,按钮会呈高亮度显示。0x0008。非零值表示按钮拥有输入焦点。void SetState( BOOL bHighlight );当参数bHeightlight值为TRUE时,该函数将按钮设置

17、为高亮度状态,否则,去除按钮的高亮度状态。int GetCheck( ) const;返回检查框或单选按钮的选择状态。返回值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态(仅用于检查框)。void SetCheck( int nCheck );设置检查框或单选按钮的选择状态。参数nCheck值的含义与GetCheck返回值相同。UINT GetButtonStyle( ) const;获得按钮控件的BS_XXXX风格。void SetButtonStyle( UINT nStyle, BOOL bRedraw = TRUE );设置按钮的风格。参数nStyle指定了按钮的风格。

18、bRedraw为TRUE则重绘按钮,否则就不重绘。HBITMAP SetBitmap( HBITMAP hBitmap );设置按钮显示的位图。参数hBitmap指定了位图的句柄。该函数还会返回按钮原来的位图。HBITMAP GetBitmap( ) const;返回以前用SetBitmap设置的按钮位图。HICON SetIcon( HICON hIcon );设置按钮显示的图标。参数hIcon指定了图标的句柄。该函数还会返回按钮原来的图标。HICON GetIcon( ) const;返回以前用SetIcon设置的按钮图标。HCURSOR SetCursor( HCURSOR hCurso

19、r );设置按钮显示的光标图。参数hCursor指定了光标的句柄。该函数还会返回按钮原来的光标。HCURSOR GetCursor( );返回以前用GetCursor设置的光标。另外,可以使用下列的一些与按钮控件有关的CWnd成员函数来设置或查询按钮的状态。用这些函数的好处在于不必构建按钮控件对象,只要知道按钮的ID,就可以直接设置或查询按钮。void CheckDlgButton( int nIDButton, UINT nCheck );用来设置按钮的选择状态。参数nIDButton指定了按钮的ID。nCheck的值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态。void

20、CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );用来选择组中的一个单选按钮。参数nIDFirstButton指定了组中第一个按钮的ID,nIDLastButton指定了组中最后一个按钮的ID,nIDCheckButton指定了要选择的按钮的ID。int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );该函数用来获得一组单选按钮中被选中按钮的ID。参数nIDFirstButton说明了组中第一个按钮的ID,nID

21、LastButton说明了组中最后一个按钮的ID。UINT IsDlgButtonChecked( int nIDButton ) const;返回检查框或单选按钮的选择状态。返回值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态(仅用于检查框)。可以调用CWnd成员函数GetWindowText,GetWindowTextLength和SetWindowText来查询或设置按钮中显示的正文MFC还提供了CButton的派生类CBitmapButton。利用该类可以创建一个拥有四幅位图的命令按钮,按钮在不同状态时会显示不同的位图,这样可以使界面显得生动活泼。如果读者对CBitma

22、pButton感兴趣,可以参看VC5.0随盘提供的MFC例子CTRLTEST。在上一章的Register例子中已演示了各种按钮控件的使用,故这里就不再举例了。6.1.4 编辑框控件编辑框(Edit Box)控件实际上是一个简易的正文编辑器,用户可以在编辑框中输入并编辑正文。编辑框既可以是单行的,也可以是多行的,多行编辑框是从零开始编行号的在一个多行编辑框中,除了最后一行外,每一行的结尾处都有一对回车换行符(用rn表示)这对回车换行符是正文换行的标志,在屏幕上是不可见的编辑框控件会向父窗口发出如表6.5所示的控件通知消息。表6.5消息含义EN_CHANGE编辑框的内容被用户改变了。与EN_UPD

23、ATE不同,该消息是在编辑框显示的正文被刷新后才发出的。EN_ERRSPACE编辑框控件无法申请足够的动态内存来满足需要。EN_HSCROLL用户在水平滚动条上单击鼠标。EN_KILLFOCUS编辑框失去输入焦点。EN_MAXTEXT输入的字符超过了规定的最大字符数。在没有ES_AUTOHSCROLL或ES_AUTOVSCROLL的编辑框中,当正文超出了编辑框的边框时也会发出该消息。EN_SETFOCUS编辑框获得输入焦点。EN_UPDATE在编辑框准备显示改变了的正文时发送该消息。EN_VSCROLL用户在垂直滚动条上单击鼠标。MFC的CEdit类封装了编辑框控件。CEdit类的成员函数Cr

24、eate负责创建按钮控件,该函数的声明为BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );参数dwStyle指定了编辑框控件风格,如表6.6所示,dwStyle可以是这些风格的组合。rect指定了编辑框的位置和尺寸。pParentWnd指定了父窗口,不能为NULL。编辑框的ID由nID指定。如果创建成功,该函数返回TRUE,否则返回FALSE表6.6 编辑框控件的风格控件风格含义ES_AUTOHSCROLL当用户在行尾键入一个字符时,正文将自动向右滚动10个字符,当用户按回车键时,正文总是滚向左

25、边。ES_AUTOVSCROLL当用户在最后一个可见行按回车键时,正文向上滚动一页。ES_CENTER在多行编辑框中使正文居中。ES_LEFT左对齐正文。ES_LOWERCASE把用户输入的字母统统转换成小写字母。ES_MULTILINE指定一个多行编辑器。若多行编辑器不指定ES_AUTOHSCROLL风格,则会自动换行,若不指定ES_AUTOVSCROLL,则多行编辑器会在窗口中正文装满时发出警告声响。ES_NOHIDESEL缺省时,当编辑框失去输入焦点后会隐藏所选的正文,当获得输入焦点时又显示出来。设置该风格可禁止这种缺省行为。ES_OEMCONVERT使编辑框中的正文可以在ANSI字符集

26、和OEM字符集之间相互转换。这在编辑框中包含文件名时是很有用的。ES_PASSWORD使所有键入的字符都用“*”来显示。ES_RIGHT右对齐正文。ES_UPPERCASE把用户输入的字母统统转换成大写字母。ES_READONLY将编辑框设置成只读的。ES_WANTRETURN使多行编辑器接收回车键输入并换行。如果不指定该风格,按回车键会选择缺省的命令按钮,这往往会导致对话框的关闭。除了上表中的风格外,一般还要为控件指定WS_CHILD、WS_VISIBLE、WS_TABSTOP和WS_BORDER窗口风格,WS_BORDER使控件带边框。创建一个普通的单行编辑框应指定风格为WS_CHILD|

27、WS_VISIBLE|WS_TABSTOP |WS_BORDER|ES_LEFT|ES_AUTOHSCROLL,这将创建一个带边框、左对齐正文、可水平滚动的单行编辑器。要创建一个普通多行编辑框,还要附加ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL |WS_HSCROLL| WS_VSCROLL风格,这将创建一个可水平和垂直滚动的,带有水平和垂直滚动条的多行编辑器。对于用对话框模板编辑器创建的编辑框控件,可以在控件的属性对话框中指定表6.6中列出的控件风格。例如,在属性对话框中选择Multi-line项,相当与指定了ES_MULTILINE风格。编辑框支持剪

28、贴板操作。CEdit类提供了一些与剪贴板有关的成员函数,如表6.7所示。表6.7 与剪切板有关的CEdit成员函数函数声明用途void Clear( )清除编辑框中被选择的正文。void Copy( )把在编辑框中选择的正文拷贝到剪贴板中。void Cut( )清除编辑框中被选择的正文并把这些正文拷贝到剪贴板中。void Paste( )将剪贴板中的正文插入到编辑框的当前插入符处。BOOL Undo( )撤消上一次键入。对于单行编辑框,该函数总返回TRUE,对于多行编辑框,返回TRUE表明操作成功,否则返回FALSE。可以用下列CEdit或CWnd类的成员函数来查询编辑框。在学习下面的函数时,

29、读者会经常遇到术语字符索引字符的字符索引是指从编辑框的开头字符开始的字符编号,它是从零开始编号的也就是说,字符索引实际上是指当把整个编辑正文看作一个字符串数组时,该字符所在的数组元素的下标int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;void GetWindowText( CString& rString ) const;这两个函数均是CWnd类的成员函数,可用来获得窗口的标题或控件中的正文。第一个版本的函数用lpszStringBuf参数指向的字符串数组作为拷贝正文的缓冲区,参数nMaxCount可以拷贝到缓冲区

30、中的最大字符数,该函数返回以字节为单位的实际拷贝字符数(不包括结尾的空字节)。第二个版本的函数用一个CString对象作为缓冲区。int GetWindowTextLength( ) const;CWnd的成员函数,可用来获得窗口的标题或控件中的正文的长度。DWORD GetSel( ) const;void GetSel( int& nStartChar, int& nEndChar ) const;两个函数都是CEdit的成员函数,用来获得所选正文的位置。GetSel的第一个版本返回一个DWORD值,其中低位字说明了被选择的正文开始处的字符索引,高位字说明了选择的正文结束处的后面一个字符的

31、字符索引,如果没有正文被选择,那么返回的低位和高位字节都是当前插入符所在字符的字符索引。GetSel的第二个版本的两个参数是两个引用,其含义与第一个版本函数返回值的低位和高位字相同。int LineFromChar( int nIndex = 1 ) const;CEdit的成员函数,仅用于多行编辑框,用来返回指定字符索引所在行的行索引(从零开始编号)。参数nIndex指定了一个字符索引,如果nIndex是-1,那么函数将返回选择正文的第一个字符所在行的行号,若没有正文被选择,则该函数会返回当前的插入符所在行的行号。int LineIndex( int nLine = 1 ) const;CE

32、dit的成员函数,仅用于多行编辑框,用来获得指定行的开头字符的字符索引,如果指定行超过了编辑框中的最大行数,该函数将返回-1。参数nLine是指定了从零开始的行索引,如果它的值为-1,则函数返回当前的插入符所在行的字符索引。int GetLineCount( ) const;CEdit的成员函数,仅用于多行编辑框,用来获得正文的行数。如果编辑框是空的,那么该函数的返回值是1。int LineLength( int nLine = 1 ) const;CEdit的成员函数,用于获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内)。参数nLine说明了字符索引如果nLine的值为-1,

33、则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个正文的长度。int GetLine( int nIndex, LPTSTR lpszBuffer ) const;int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;CEdit的成员函数,仅用于多行编辑框,用来获得指定行的正文(不包括行尾的回车和换行符)。参数nIndex是行号,lpszBuffer指向存放正文的缓冲区,nMaxLength规定了拷贝的最大字节数,若。

34、函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,GetLine函数不会在缓冲区中字符串的末尾加字符串结束符(NULL)下列CWnd或CEdit类的成员函数可用来修改编辑框控件。void SetWindowText( LPCTSTR lpszString );CWnd的成员函数,可用来设置窗口的标题或控件中的正文。参数lpszString可以是一个CString对象,或是一个指向字符串的指针。void SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );void SetSel( int nStartCha

35、r, int nEndChar, BOOL bNoScroll = FALSE );CEdit的成员函数,用来选择编辑框中的正文。参数dwSelection的低位字说明了选择开始处的字符索引,高位字说明了选择结束处的字符索引。如果低位字为0且高位字节为-1,那么就选择所有的正文,如果低位字节为-1,则取消所有的选择参数bNoScroll的值如果是FALSE,则滚动插入符并使之可见,否则就不滚动参数nStartChar和nEndChar的含义与参数dwSelection的低位字和高位字相同void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo =

36、FALSE );CEdit的成员函数,用来将所选正文替换成指定的正文参数lpszNewText指向用来替换的字符串参数bCanUndo的值为TRUE说明替换是否可以被撤消的在调用上述函数时,如果涉及的是一个多行编辑框,那么除了LineLength和GetLine函数外,都要把回车和换行符考虑在内例如,假设在编辑框中有如下几行正文:abcdefgij那么字母e的字符索引是6而不是4,因为abcd后面还有一对回车换行符调用LineLength(7)会返回第二行的长度3调用LineIndex(2)会得到11调用LineFromChar(8)会返回1如果没有选择任何正文,并且插入符在字母e上,那么调用

37、GetSel返回值的低位和高位字都是6通过分析上述函数,我们可以总结出一些查询和设置编辑框的方法调用CWnd的成员函数GetWindowText和SetWindowText可以查询和设置编辑框的整个正文,在上一章的Register程序中,我们就使用过这两个函数如果想对多行编辑框逐行查询,那么应该先调用GetLineCount获得总行数,然后再调用GetLine来获取每一行的正文下面一段代码演示了如何对多行编辑框进行逐行查询char buf40;int total=MyEdit.GetLineCount();int i,length;for(i=0;itotal;i+)length=MyEdit

38、.GetLine(i,buf,39);buflength=0; /加字符串结束符. . . . . .可以利用LineIndex和LineFromChar来在字符索引和字符的行列坐标之间相互转换下列代码演示了在已知字符索引的情况下,如何获得对应的行列坐标:int row,column;row=MyEdit.LineFromChar(charIndex);column=charIndex-MyEdit.LineIndex(row);下列代码演示了在已知字符的行列坐标的情况下,如何获得对应的字符索引:int charIndex;charIndex=MyEdit.LineIndex(row)+col

39、umn;不难看出字符索引与对应的行列坐标的关系是:字符索引=LineIndex(行坐标)+列坐标对于选择正文的查询和设置,应该利用函数GetSel、SetSel和ReplaceSel可以利用GetSel和SetSel来查询和设置插入符的位置SetSel可以使编辑框滚动到插入符的新位置要获取插入符的行列坐标,可用下面的代码实现:MyEdit.SetSel(-1,0); /取消正文的选择int start,end,row,column;MyEdit.GetSel(start,end); /start或end的值就是插入符的字符索引row=MyEdit.LineFromChar(start); /获

40、取插入符的行坐标column=start-MyEdit.LineIndex(row); /获取插入符的列坐标下面的代码演示了如何把插入符移到指定的行和列:MyEdit.SetSel(-1,0); /取消正文的选择int charIndex=MyEdit.LineIndex(row)+column;MyEdit.SetSel(charIndex,charIndex);可以利用ReplaceSel函数在 插入符处插入正文,典型的代码如下所示:MyEdit.SetSel(-1,0); /取消正文的选择MyEdit.ReplaceSel(“.”);可以利用ReplaceSel清除编辑框中的正文,典型的

41、代码如下所示:MyEdit.SetSel(0,-1); /选择全部正文MyEdit.ReplaceSel(“”);在后面的小节中,读者将会看到使用编辑框的例子.1.5 滚动条控件滚动条(Scroll Bar)主要用来从某一预定义值范围内快速有效地进行选择滚动条分垂直滚动条和水平滚动条两种在滚动条内有一个滚动框,用来表示当前的值用鼠标单击滚动条,可以使滚动框移动一页或一行,也可以直接拖动滚动框滚动条既可以作为一个独立控件存在,也可以作为窗口、列表框和组合框的一部分Windows 95的滚动条支持比例滚动框,即用滚动框的大小来反映页相对于整个范围的大小Windows 3.x使用单独的滚动条控件来调

42、整调色板、键盘速度以及鼠标灵敏度,在Windows 95中,滚动条控件被轨道条取代(参见6.2.3)不提倡使用单独的滚动条控件需要指出的是,从性质上划分,滚动条可分为标准滚动条和滚动条控件两种标准滚动条是由WS_HSCROLL或WS_VSCROLL风格指定的,它不是一个实际的窗口,而是窗口的一个组成部分(例如列表框中的滚动条),只能位于窗口的右侧(垂直滚动条)或底端(水平滚动条)标准滚动条是在窗口的非客户区中创建的与之相反,滚动条控件并不是窗口的一个零件,而是一个实际的窗口,可以放置在窗口客户区的任意地方,它既可以独立存在,也可以与某一个窗口组合,行使滚动窗口的职能由于滚动条控件是一个独立窗口

43、,因此可以拥有输入焦点,可以响应光标控制键,如PgUp、PgDown、Home和EndMFC的CScrollBar类封装了滚动条控件CScrollBar类的Create成员函数负责创建控件,该函数的声明为BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );参数dwStyle指定了控件的风格rect说明了控件的位置和尺寸pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE要创建一个普通的水平滚动条控件,应指定风格WS_C

44、HILD|WS_VISIBLE|BS_HORZ要创建一个普通的垂直滚动条控件,应指定风格WS_CHILD|WS_VISIBLE|BS_VERT主要的CScrollBar类成员函数如下所示:int GetScrollPos( ) const;该函数返回滚动框的当前位置若操作失败则返回0int SetScrollPos( int nPos, BOOL bRedraw = TRUE );该函数将滚动框移动到指定位置参数nPos指定了新的位置参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之函数返回滚动框原来的位置若操作失败则返回0void GetScrollRange( LPINT

45、lpMinPos, LPINT lpMaxPos ) const;该函数对滚动条的滚动范围进行查询参数lpMinPos和lpMaxPos分别指向滚动范围的最小最大值void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );该函数用于指定滚动条的滚动范围参数nMinPos和nMaxPos分别指定了滚动范围的最小最大值由这两者指定的滚动范围不得超过32767当两者都为0时,滚动条将被隐藏参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之BOOL GetScrollInfo( LPSCROLLINFO l

46、pScrollInfo, UINT nMask );该函数用来获取滚动条的各种状态,包括滚动范围、滚动框的位置和页尺寸参数lpScrollInfo指向一个SCROLLINFO结构,该结构如下所示:typedef struct tagSCROLLINFO UINT cbSize; /结构的尺寸(字节为单位)UINT fMask; /*说明结构中的哪些参数是有效的,可以是屏蔽值的组合, 如SIF_POS|SIF_PAGE,若为SIF_ALL则整个结构都有效*/int nMin; /滚动范围最大值,当fMask中包含SIF_RANGE时有效int nMax; /滚动范围最小值,当fMask中包含SI

47、F_RANGE时有效UINT nPage; /*页尺寸,用来确定比例滚动框的大小,当fMask中包含 SIF_PAGE时有效*/int nPos; /滚动框的位置,当fMask中包含SIF_POS有效int nTrackPos; /*拖动时滚动框的位置,当fMask中包含 SIF_TRACKPOS时有效,该参数只能查询,不能设 置,最好不要用该参数来查询拖动时滚动框的位置*/ SCROLLINFO;typedef SCROLLINFO FAR *LPSCROLLINFO;参数nMask的意义与SCROLLINFO结构中的fMask相同函数在获得有效值后返回TRUE,否则返回FALSEBOOL

48、SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );该函数用于设置滚动条的各种状态,一个重要用途是设定页尺寸从而实现比例滚动框参数lpScrollInfo指向一个SCROLLINFO结构,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之若操作成功,该函数返回TRUE,否则返回FALSECWnd类也提供了一些函数来查询和设置所属的标准滚动条这些函数与CScrollBar类的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条例如,CWnd: GetScrollPos 的声明为int GetSc

49、rollPos( int nBar ) const;参数nBar用来选择滚动条,可以为下列值:SB_HORZ /指定水平滚动条SB_VERT /指定垂直滚动条无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用WM_HSCROLL和WM_VSCROLL消息发送出去的对这两个消息的确省处理函数是CWnd:OnHScroll和CWnd:OnVScroll,它们几乎什么也不做一般需要在派生类中对这两个函数从新设计,以实现滚动功能这两个函数的声明为afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );af

50、x_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );参数nSBCode是通知消息码,如表6.8所示nPos是滚动框的位置,只有在nSBCode为SB_THUMBPOSITION或SB_THUMBTRACK时,该参数才有意义如果通知消息是滚动条控件发来的,那么pScrollBar是指向该控件的指针,如果是标准滚动条发来的,则pScrollBar为NULL表6.8滚动条的通知消息码消息含义SB_BOTTOM / SB_RIGHT(二者的消息码是一样的,因此可以混用,下同)滚动到底端(右端)SB_TOP /

51、SB_LEFT滚动到顶端(左端)SB_LINEDOWN / SB_LINERIGHT向下(向右)滚动一行(列)SB_LINEUP / SB_LINELEFT向上(向左)滚动一行(列)SB_PAGEDOWN / SB_PAGERIGHT向下(向右)滚动一页SB_PAGEUP / SB_PAGELEFT向上(向左)滚动一页SB_THUMBPOSITION滚动到指定位置SB_THUMBTRACK滚动框被拖动可利用该消息来跟踪对滚动框的拖动SB_ENDSCROLL滚动结束6.1.8小节的例子中,读者将学会如何使用滚动条以及如何编写自己的OnHScroll函数6.1.6 列表框控件列表框主要用于输入,它

52、允许用户从所列出的表项中进行单项或多项选择,被选择的项呈高亮度显示列表框具有边框,并且一般带有一个垂直滚动条列表框分单选列表框和多重选择列表框两种单选列表框一次只能选择一个列表项,而多重选择列表框可以进行多重选择对于列表项的选择,微软公司有如下建议:单击鼠标选择一个列表项,单击一个按钮来处理选择的项双击鼠标选择一个列表项是处理选择项的快捷方法列表框会向父窗口发送如表6.9所示的通知消息表6.9 列表框控件的通知消息消息含义LBN_DBLCLK用户用鼠标双击了一列表项只有具有LBS_NOTIFY的列表框才能发送该消息LBN_ERRSPACE列表框不能申请足够的动态内存来满足需要LBN_KILLF

53、OCUS列表框失去输入焦点LBN_SELCANCEL当前的选择被取消只有具有LBS_NOTIFY的列表框才能发送该消息LBN_SELCHANGE单击鼠标选择了一列表项只有具有LBS_NOTIFY的列表框才能发送该消息LBN_SETFOCUS列表框获得输入焦点WM_CHARTOITEM当列表框收到WM_CHAR消息后,向父窗口发送该消息只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息WM_VKEYTOITEM当列表框收到WM_KEYDOWN消息后,向父窗口发送该消息只有具有LBS_WANTKEYBOARDINPUT风格的列表框才会发送该消息MFC的CListBox类封

54、装了列表框CListBox类的Create成员函数负责列表框的创建,该函数的声明是BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );参数dwStyle指定了列表框控件的风格,如表6.10所示,dwStyle可以是这些风格的组合rect说明了控件的位置和尺寸pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE表6.10 列表框控件的风格控件风格含义LBS_EXTENDEDSEL支持多重选择在点击列表项时按住Shift键

55、或Ctrl键即可选择多个 项LBS_HASSTRINGS指定一个含有字符串的自绘式列表框LBS_MULTICOLUMN指定一个水平滚动的多列列表框,通过调用CListBox:SetColumnWidth来设置每列的宽度LBS_MULTIPLESEL支持多重选择列表项的选择状态随着用户对该项单击或双击鼠标而翻转LBS_NOINTEGRALHEIGHT列表框的尺寸由应用程序而不是Windows指定通常,Windows指定尺寸会使列表项的某些部分隐藏起来LBS_NOREDRAW当选择发生变化时防止列表框被更新,可发送WM_SETREDRAW来改变该风格LBS_NOTIFY当用户单击或双击鼠标时通知父

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!