当前位置:文档之家› MFC组件消息及函数

MFC组件消息及函数

MFC组件消息及函数
MFC组件消息及函数

CButton类的主要的成员函数有:

UINT GetState( ) const;

该函数返回按钮控件的各种状态。可以用下列屏蔽值与函数的返回值相与,以获得各种信息。

0x0003。用来获取检查框或单选按钮的状态。0表示未选中,1表示被选中,2表示不确定状态(仅用于检查框)。

0x0004。用来判断按钮是否是高亮度显示的。非零值意味着按钮是高亮度显示的。当用户点击了按钮并按主鼠标左键时,按钮会呈高亮度显示。

0x0008。非零值表示按钮拥有输入焦点。

void SetState( BOOL bHighlight );

当参数bHeightlight值为TRUE时,该函数将按钮设置为高亮度状态,否则,去除按钮的高亮度状态。

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指定了按钮的风格。bRedraw为TRUE则重绘按钮,否则就不重绘。

HBITMAP SetBitmap( HBITMAP hBitmap );

设置按钮显示的位图。参数hBitmap指定了位图的句柄。该函数还会返回按钮原来的位图。

HBITMAP GetBitmap( ) const;

返回以前用SetBitmap设置的按钮位图。

HICON SetIcon( HICON hIcon );

设置按钮显示的图标。参数hIcon指定了图标的句柄。该函数还会返回按钮原来的图标。

HICON GetIcon( ) const;

返回以前用SetIcon设置的按钮图标。

HCURSOR SetCursor( HCURSOR hCursor );

设置按钮显示的光标图。参数hCursor指定了光标的句柄。该函数还会返回按钮原来的光标。

HCURSOR GetCursor( );

返回以前用GetCursor设置的光标。

另外,可以使用下列的一些与按钮控件有关的CWnd成员函数来设置或查询按钮的状态。用这些函数的好处在于不必构建按钮控件对象,只要知道按钮的ID,就可以直接设置或查询按钮。

void CheckDlgButton( int nIDButton, UINT nCheck );

用来设置按钮的选择状态。参数nIDButton指定了按钮的ID。nCheck的值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态。

void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );

用来选择组中的一个单选按钮。参数nIDFirstButton指定了组中第一个按钮的ID,nIDLastButton指定了组中最后一个按钮的ID,nIDCheckButton指定了要选择的按钮的ID。

int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );

该函数用来获得一组单选按钮中被选中按钮的ID。参数nIDFirstButton说明了组中第一个按钮的ID,nIDLastButton说明了组中最后一个按钮的ID。

UINT IsDlgButtonChecked( int nIDButton ) const;

返回检查框或单选按钮的选择状态。返回值0表示按钮未被选择,1表示按钮被选择,2表示按钮处于不确定状态(仅用于检查框)。

可以调用CWnd成员函数GetWindowText,GetWindowTextLength和SetWindowText来查询或设置按钮中显示的正文.

MFC还提供了CButton的派生类CBitmapButton。利用该类可以创建一个拥有四幅位图的命令按钮,按钮在不同状态时会显示不同的位图,这样可以使界面显得生动活泼。如果读者对CBitmapButton感兴趣,可以参看VC5.0随盘提供的MFC例子CTRLTEST。

在上一章的Register例子中已演示了各种按钮控件的使用,故这里就不再举例了。

6.1.4 编辑框控件

编辑框(Edit Box)控件实际上是一个简易的正文编辑器,用户可以在编辑框中输入并编辑正文。编辑框既可以是单行的,也可以是多行的,多行编辑框是从零开始编行号的.在一个多行编辑框中,除了最后一行外,每一行的结尾处都有一对回车换行符(用"\r\n"表示).这对回车换行符是正文换行的标志,在屏幕上是不可见的.

编辑框控件会向父窗口发出如表6.5所示的控件通知消息。

可以用下列CEdit或CWnd类的成员函数来查询编辑框。在学习下面的函数时,读者会经常遇到术语字符索引.字符的字符索引是指从编辑框的开头字符开始的字符编号,它是从零开始编号的.也就是说,字符索引实际上是指当把整个编辑正文看作一个字符串数组时,该字符所在的数组元素的下标.

int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;

void GetWindowText( CString& rString ) const;

这两个函数均是CWnd类的成员函数,可用来获得窗口的标题或控件中的正文。第一个版本的函数用lpszStringBuf参数指向的字符串数组作为拷贝正文的缓冲区,参数nMaxCount可以拷贝到缓冲区中的最大字符数,该函数返回以字节为单位的实际拷贝字符数(不包括结尾的空字节)。第二个版本的函数用一个CString对象作为缓冲区。

int GetWindowTextLength( ) const;

CWnd的成员函数,可用来获得窗口的标题或控件中的正文的长度。

DWORD GetSel( ) const;

void GetSel( int& nStartChar, int& nEndChar ) const;

两个函数都是CEdit的成员函数,用来获得所选正文的位置。GetSel的第一个版本返回一个DWORD值,其中低位字说明了被选择的正文开始处的字符索引,高位字说明了选择的正文结束处的后面一个字符的字符索引,如果没有正文被选择,那么返回的低位和高位字节都是当前插入符所在字符的字符索引。GetSel的第二个版本的两个参数是两个引用,其含义与第一个版本函数返回值的低位和高位字相同。

int LineFromChar( int nIndex = –1 ) const;

CEdit的成员函数,仅用于多行编辑框,用来返回指定字符索引所在行的行索引(从零开始编号)。参数nIndex指定了一个字符索引,如果nIndex是-1,那么函数将返回选择正文的第一个字符所在行的行号,若没有正文被选择,则该函数会返回当前的插入符所在行的行号。

int LineIndex( int nLine = –1 ) const;

CEdit的成员函数,仅用于多行编辑框,用来获得指定行的开头字符的字符索引,如果指定行超过了编辑框中的最大行数,该函数将返回-1。参数nLine是指定了从零开始的行索引,如果它的值为-1,则函数返回当前的插入符所在行的字符索引。

int GetLineCount( ) const;

CEdit的成员函数,仅用于多行编辑框,用来获得正文的行数。如果编辑框是空的,那么该函数的返回值是1。

int LineLength( int nLine = –1 ) const;

CEdit的成员函数,用于获取指定字符索引所在行的字节长度(行尾的回车和换行符不计算在内)。参数nLine说明了字符索引.如果nLine的值为-1,则函数返回当前行的长度(假如没有正文被选择),或选择正文占据的行的字符总数减去选择正文的字符数(假如有正文被选择)。若用于单行编辑框,则函数返回整个正文的长度。

int GetLine( int nIndex, LPTSTR lpszBuffer ) const;

int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;

CEdit的成员函数,仅用于多行编辑框,用来获得指定行的正文(不包括行尾的回车和换行符)。参数nIndex 是行号,lpszBuffer指向存放正文的缓冲区,nMaxLength规定了拷贝的最大字节数,若。函数返回实际拷贝的字节数,若指定的行号大于编辑框的实际行数,则函数返回0。需要注意的是,GetLine函数不会在缓冲区中字符串的末尾加字符串结束符(NULL).

下列CWnd或CEdit类的成员函数可用来修改编辑框控件。

void SetWindowText( LPCTSTR lpszString );

CWnd的成员函数,可用来设置窗口的标题或控件中的正文。参数lpszString可以是一个CString对象,或是一个指向字符串的指针。

void SetSel( DWORD dwSelection, BOOL bNoScroll = FALSE );

void SetSel( int nStartChar, int nEndChar, BOOL bNoScroll = FALSE );

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

void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE );

CEdit的成员函数,用来将所选正文替换成指定的正文.参数lpszNewText指向用来替换的字符串.参数bCanUndo的值为TRUE说明替换是否可以被撤消的.

在调用上述函数时,如果涉及的是一个多行编辑框,那么除了LineLength和GetLine函数外,都要把回车和换行符考虑在内.例如,假设在编辑框中有如下几行正文:

abcd

efg

ij

那么字母"e"的字符索引是6而不是4,因为"abcd"后面还有一对回车换行符.调用LineLength(7)会返回第二行的长度3.调用LineIndex(2)会得到11.调用LineFromChar(8)会返回1.如果没有选择任何正文,并且插入符在字母"e"上,那么调用GetSel返回值的低位和高位字都是6.

通过分析上述函数,我们可以总结出一些查询和设置编辑框的方法.

调用CWnd的成员函数GetWindowText和SetWindowText可以查询和设置编辑框的整个正文,在上一章的Register程序中,我们就使用过这两个函数.

如果想对多行编辑框逐行查询,那么应该先调用GetLineCount获得总行数,然后再调用GetLine来获取每一行的正文.下面一段代码演示了如何对多行编辑框进行逐行查询.

char buf[40];

int total=MyEdit.GetLineCount();

int i,length;

for(i=0;i

{

length=MyEdit.GetLine(i,buf,39);

buf[length]=0; //加字符串结束符

. . . . . .

}

可以利用LineIndex和LineFromChar来在字符索引和字符的行列坐标之间相互转换.下列代码演示了在已知字符索引的情况下,如何获得对应的行列坐标:

int row,column;

row=MyEdit.LineFromChar(charIndex);

column=charIndex-MyEdit.LineIndex(row);

下列代码演示了在已知字符的行列坐标的情况下,如何获得对应的字符索引:

int charIndex;

charIndex=MyEdit.LineIndex(row)+column;

不难看出字符索引与对应的行列坐标的关系是:字符索引=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); //获取插入符的行坐标

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清除编辑框中的正文,典型的代码如下所示:

MyEdit.SetSel(0,-1); //选择全部正文

MyEdit.Replac eSel(“”);

在后面的小节中,读者将会看到使用编辑框的例子.

.1.5 滚动条控件

滚动条(Scroll Bar)主要用来从某一预定义值范围内快速有效地进行选择.滚动条分垂直滚动条和水平滚动条两种.在滚动条内有一个滚动框,用来表示当前的值.用鼠标单击滚动条,可以使滚动框移动一页或一行,也可以直接拖动滚动框.滚动条既可以作为一个独立控件存在,也可以作为窗口、列表框和组合框的一部分.Windows 95的滚动条支持比例滚动框,即用滚动框的大小来反映页相对于整个范围的大小.Windows 3.x使用单独的滚动条控件来调整调色板、键盘速度以及鼠标灵敏度,在Windows 95中,滚动条控件被轨道条取代(参见6.2.3)不提倡使用单独的滚动条控件.

需要指出的是,从性质上划分,滚动条可分为标准滚动条和滚动条控件两种.标准滚动条是由WS_HSCROLL 或WS_VSCROLL风格指定的,它不是一个实际的窗口,而是窗口的一个组成部分(例如列表框中的滚动条),只能位于窗口的右侧(垂直滚动条)或底端(水平滚动条).标准滚动条是在窗口的非客户区中创建的.与之相反,滚动条控件并不是窗口的一个零件,而是一个实际的窗口,可以放置在窗口客户区的任意地方,它既可以独立存在,也可以与某一个窗口组合,行使滚动窗口的职能.由于滚动条控件是一个独立窗口,因此可以拥有输入焦点,可以响应光标控制键,如PgUp、PgDown、Home和End.

MFC的CScrollBar类封装了滚动条控件.CScrollBar类的Create成员函数负责创建控件,该函数的声明为

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

参数dwStyle指定了控件的风格.rect说明了控件的位置和尺寸.pParentWnd指向父窗口,该参数不能为NULL。nID则说明了控件的ID。如果创建成功,该函数返回TRUE,否则返回FALSE.

要创建一个普通的水平滚动条控件,应指定风格WS_CHILD|WS_VISIBLE|BS_HORZ.要创建一个普通的垂直滚动条控件,应指定风格WS_CHILD|WS_VISIBLE|BS_VERT.

主要的CScrollBar类成员函数如下所示:

int GetScrollPos( ) const;

该函数返回滚动框的当前位置.若操作失败则返回0.

int SetScrollPos( int nPos, BOOL bRedraw = TRUE );

该函数将滚动框移动到指定位置.参数nPos指定了新的位置.参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.函数返回滚动框原来的位置.若操作失败则返回0.

void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) const;

该函数对滚动条的滚动范围进行查询.参数lpMinPos和lpMaxPos分别指向滚动范围的最小最大值.

void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );

该函数用于指定滚动条的滚动范围.参数nMinPos和nMaxPos分别指定了滚动范围的最小最大值.由这两者指定的滚动范围不得超过32767.当两者都为0时,滚动条将被隐藏.参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.

BOOL GetScrollInfo( LPSCROLLINFO lpScrollInfo, 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中包含SIF_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,否则返回FALSE.

BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

该函数用于设置滚动条的各种状态,一个重要用途是设定页尺寸从而实现比例滚动框.参数lpScrollInfo 指向一个SCROLLINFO结构,参数bRedraw表示是否需要重绘滚动条,如果为TRUE,则重绘之.若操作成功,该函数返回TRUE,否则返回FALSE.

CWnd类也提供了一些函数来查询和设置所属的标准滚动条.这些函数与CScrollBar类的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条.例如,CWnd:: GetScrollPos 的声明为

int GetScrollPos( 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 );

afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );

int SetCurSel( int nSelect );

该函数仅适用于单选择列表框,用来选择指定的列表项.该函数会滚动列表框以使选择项可见.参数nIndex 指定了列表项的索引,若为-1,那么将清除列表框中的选择.若出错函数返回LB_ERR.

int SelectString( int nStartAfter, LPCTSTR lpszItem );

该函数仅适用于单选择列表框,用来选择与指定字符串相匹配的列表项.该函数会滚动列表框以使选择项可见.参数的意义及搜索的方法与函数FindString类似.如果找到了匹配的项,函数返回该项的索引,如果没有匹配的项,函数返回LB_ERR并且当前的选择不被改变.

int GetSelCount( ) const;

该函数仅用于多重选择列表框,它返回选择项的数目,若出错函数返回LB_ERR.

int SetSel( int nIndex, BOOL bSelect = TRUE );

该函数仅适用于多重选择列表框,它使指定的列表项选中或落选.参数nIndex指定了列表项的索引,若为-1,则相当于指定了所有的项.参数bSelect为TRUE时选中列表项,否则使之落选.若出错则返回LB_ERR.

int GetSelItems( int nMaxItems, LPINT rgIndex ) const;

该函数仅用于多重选择列表框,用来获得选中的项的数目及位置.参数nMaxItems说明了参数rgIndex指向的数组的大小.参数rgIndex指向一个缓冲区,该数组是一个整型数组,用来存放选中的列表项的索引.函数返回放在缓冲区中的选择项的实际数目,若出错函数返回LB_ERR.

int SelItemRange( BOOL bSelect, int nFirstItem, int nLastItem );

该函数仅用于多重选择列表框,用来使指定范围内的列表项选中或落选.参数nFirstItem和nLastItem

指定了列表项索引的范围.如果参数bSelect为TRUE,那么就选择这些列表项,否则就使它们落选.若出错函数返回LB_ERR.

在6.1.8小节的例子中,读者将会看到对列表框的测试.

6.1.7 组合框控件

组合框把一个编辑框和一个单选择列表框结合在了一起.用户既可以在编辑框中输入,也可以从列表框中选择一个列表项来完成输入.如上一章所提到的,组合框分为简易式(Simple)、下拉式(Dropdown)和下拉列表式(Drop List)三种.简易式组合框包含一个编辑框和一个总是显示的列表框。下拉式组合框同简易式组合框类似,二者的区别在于仅当单击下滚箭头后列表框才会弹出。下拉列表式组合框也有一个下拉的列表框,但它的编辑框是只读的,不能输入字符。

Windows中比较常用的是下拉式和下拉列表式组合框,在Developer Studio中就大量使用了这两种组合框.二者都具有占地小的特点,这在界面日益复杂的今天是十分重要的.下拉列表式组合框的功能与列表框类似.下拉式组合框的典型应用是作为记事列表框使用,既把用户在编辑框中敲入的东西存储到列表框组件中,这样当用户要重复同样的输入时,可以从列表框组件中选取而不必在编辑框组件中从新输入.在Developer Studio中的Find对话框中就可以找到一个典型的下拉式组合框.

要设计一个记事列表框,应采取下列原则:

在创建组合框时指定CBS_DROPDOWNLIST风格.

相关主题
文本预览
相关文档 最新文档