第 26 章
,参数lpszNewText 指向用来替换
的字符串。参数bCanUndo 的值为TRUE 说明替换是可以被撤消的。
如果在编辑控件中只允许接收数字, 可以在一个标准的编辑控件中指定标志
ES_NUMBERS,该标志限制编辑控件只按收数字字符。如果用户需要复杂的编辑控件,可以
使用微软公司提供的屏蔽编辑控件,它是一个很有用的OLE 定制控件。
也可以从CEdit 类派生一个类并处理WM_CHAR 消息,然后从编辑控件中过滤出特定的
字符。具体方法为:首先,使用ClassWizard 建立一个CEdit 的派生类,其次,在对话类中指
定一个成员变量,将编辑控件分类在OnInitdialog()中调用下面的代码段:
CWnd::SubclassDlgItem
{
//In your dialog class declaration (.H file )
private :
CMyEdit m_wndEdit ; // Instance of your new edit control
}
//In you dialog class implcomntation (.CPP file )
BOOL CSampleDialog : : OnInitDialog ( )
{
…
//Subclass the edit lontrod .
m_wndEdit.SubclassDlgItem (IDC_EDIT,this );
…
}
然后使用ClassWizard 处理WM_CHAR 消息,计算nChar 并决定所执行的cāo作,用户可
以确定是否修改、传送字符。
下例说明了如何显示字母字符,如果字符是字母字符,则调用CWnd::OnChar,否则不
调用OnChar。
//Only display alphabetic dharacters .
void CMyEdit::OnChar (UINT nChar,UINT nRepCnt,UINT nFlags)
{
//Determine if nChar is an alphabetic character .
if (::IsCharAlpha ((TCHAR) nChar))
CEdit::OnChar (nChar, nRepCnt , nFlags );
}
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·108·
如果要修改字符,则不能仅仅简单地用修改过的nChar 调用CEdit::OnChar,然后用
CEdit::OnChar 调用CWnd::Default 获取原来的wParam 和lParam 的值。要修改一个字符,
需要首先修改nChar,然后用修改过的nChar 调用CWnd: : DefWindowProc。下例说明了如何
将字符转变为大写。
//Make all characters uppercase
void CMyEdit::OnChar (UINT nChar,UINT nRepCnt,UINT nFlags)
{
//Make sure character is uppercase .
if (::IsCharAlpha (( TCHAR) nChar))
nChar=::CharUpper (nChar ) ;
//Bypass default OnChar processing and directly call
//default window proc.
DefWindProc(WM_CHAR,nChar,MAKELPARAM (nRepCnt,nFlags));
}
5.3 滚动条(Scroll Bar)控件
5.3.1 滚动条控件的使用
滚动条(Scroll Bar)是一种传统控件,主要用来从某一预定义值范围内快速有效地进行
浏览,分为垂直滚动条(Horizontal Scroll Bar)和水平滚动条(Vertical Scroll Bar)两种,如
图5-3 所示。在滚动条内有一个滚动框,用来表示当前的值。用鼠标单击滚动条,可以使滚
动框移动一页或一行,也可以直接拖动滚动框。滚动条既可以作为一个独立控件存在,也可
以作为窗口、列表框和组合框的一部分。Windows 2000 中还支持比例滚动框,即用滚动框的
大小来反映页相对于整个范围的大小。
图5-3 滚动条样例
需要指出的是,从xìng质上划分,滚动条可分为标准滚动条和滚动条控件两种。标准滚动
条是由WS_HSCROLL 或WS_VSCROLL 风格指定的,它不是一个实际的窗口,而是窗口的
一个组成部分(例如列表框中的滚动条),只能位于窗口的右侧(垂直滚动条)或底端(水平
滚动条),标准滚动条是在窗口的非客户区中创建的。与之相反,滚动条控件并不是窗口中的
一部分,而是一个实际的窗口,可以放置在窗口客户区的任意地方,它既可以独立存在,也
可以与某一个窗口组合,行使滚动窗口的职能。由于滚动条控件是一个独立窗口,因此可以
拥有输入焦点,可以响应光标控制键,如PageUp、PageDown、Hcom 和End 等。
枫叶文学网www.fywxw.com
第5 章 常用控件
·109·
滚动条控件封装在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。
5.3.2 CscrollBar 类的主要成员函数
下面将介绍CScrollBar 类主要的成员函数。
1.GetScrollPos()函数
该成员函数声明如下:
int GetScrollPos() const;
该函数返回滚动框的当前位置,若cāo作失败则返回0。
2.SetScrollPos()函数
该成员函数声明如下:
int SetScrollPos(int nPos,BOOL bRedraw = TRUE);
该函数将滚动框移动到指定位置。参数nPos 指定了新的位置,参数bRedraw 表示是否
需要重绘滚动条,如果为TRUE,则重绘之。函数返回滚动框原来的位置,若cāo作失败则返
回0。
3.GetScrollRange()函数
该成员函数声明如下:
void GetScrollRange(LPINT lpMinPos,LPINT lpMaxPos) const;
该函数对滚动条的滚动范围进行查询。参数lpMinPos 和lpMaxPos 分别指向滚动范围的
最小、最大值。
4.SetScrollRange()函数
该成员函数声明如下:
void SetScrollRange(int nMinPos,int nMaxPos,BOOL bRedraw = TRUE);
该函数用于指定滚动条的滚动范围。参数nMinPos 和nMaxPos 分别指定了滚动范围的最
小、最大值,由这两者指定的滚动范围不得超过32767。当两者都为0 时,滚动条将被隐藏。
参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘之。
5.GetScrollInfo()函数
该成员函数声明如下:
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·110·
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。
6.SetScrollInfo()函数
该成员函数声明如下:
BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo,BOOL bRedraw = TRUE);
该函数用于设置滚动条的各种状态,如设定页尺寸从而实现比例滚动框。参数lpScrollInfo
指向一个SCROLLINFO 结构,参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则
重绘之。若cāo作成功,该函数返回TRUE,否则返回FALSE。
CWnd 类也提供了一些函数来查询和设置所属的标准滚动条。这些函数与CScrollBar 类
的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条。
7.GetScrollPos()函数
该成员函数声明如下:
int GetScrollPos(int nBar) const;
参数nBar 用来选择滚动条,可以为下列值。
? SB_HORZ:指定水平滚动条。
? SB_VERT:指定垂直滚动条。
枫叶文学网www.fywxw.com
第5 章 常用控件
·111·
8.OnHScroll()和OnVScroll()函数
无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用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);
参数nSBCode 是通知消息码,主要通知码如表5-7 所示。nPos 是滚动框的位置,只有在
nSBCode 为SB_THUMBPOSITION 或SB_THUMBTRACK 时,该参数才有意义。如果通知
消息是滚动条控件发来的,那么pScrollBar 是指向该控件的指针,如果是标准滚动条发来的,
则pScrollBar 为NULL。
表5-7 通知消息码
消息 含义
SB_BOTTOM/SB_RIGHT 滚动到底端(右端)
SB_TOP/SB_LEFT 滚动到顶端(左端)
SB_LINEDOWN/SB_LINERIGHT 向下(向右)滚动一行(列)
SB_LINEUP/SB_LINELEFT 向上(向左)滚动一行(列)
SB_PAGEDOWN/SB_PAGERIGHT 向下(向右)滚动一页
SB_PAGEUP/SB_PAGELEFT 向上(向左)滚动一页
SB_THUMBPOSITION 滚动到指定位置
SB_THUMBTRACK 滚动框被拖动。可利用该消息来跟踪对滚动框的拖动
SB_ENDSCROLL 滚动结束
5.4 按钮(Button、Radio Box、Check Box、Group Box)控件
5.4.1 按钮控件的使用
按钮也是一种传统控件。按钮控件包括命令按钮(Pushbutton)、检查框(Check Box)、
单选按钮(Radio Button)、组框(Group Box)和自绘式按钮(Owner-draw Button)。命令按
钮的作用是对鼠标的单击作出反应并触发相应的事件,在按钮中既可以显示文本,也可以显
示位图。选择框控件作为一种选择标记,可以有选中、
松语文学免费小说阅读_www.16sy.com
的字符串。参数bCanUndo 的值为TRUE 说明替换是可以被撤消的。
如果在编辑控件中只允许接收数字, 可以在一个标准的编辑控件中指定标志
ES_NUMBERS,该标志限制编辑控件只按收数字字符。如果用户需要复杂的编辑控件,可以
使用微软公司提供的屏蔽编辑控件,它是一个很有用的OLE 定制控件。
也可以从CEdit 类派生一个类并处理WM_CHAR 消息,然后从编辑控件中过滤出特定的
字符。具体方法为:首先,使用ClassWizard 建立一个CEdit 的派生类,其次,在对话类中指
定一个成员变量,将编辑控件分类在OnInitdialog()中调用下面的代码段:
CWnd::SubclassDlgItem
{
//In your dialog class declaration (.H file )
private :
CMyEdit m_wndEdit ; // Instance of your new edit control
}
//In you dialog class implcomntation (.CPP file )
BOOL CSampleDialog : : OnInitDialog ( )
{
…
//Subclass the edit lontrod .
m_wndEdit.SubclassDlgItem (IDC_EDIT,this );
…
}
然后使用ClassWizard 处理WM_CHAR 消息,计算nChar 并决定所执行的cāo作,用户可
以确定是否修改、传送字符。
下例说明了如何显示字母字符,如果字符是字母字符,则调用CWnd::OnChar,否则不
调用OnChar。
//Only display alphabetic dharacters .
void CMyEdit::OnChar (UINT nChar,UINT nRepCnt,UINT nFlags)
{
//Determine if nChar is an alphabetic character .
if (::IsCharAlpha ((TCHAR) nChar))
CEdit::OnChar (nChar, nRepCnt , nFlags );
}
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·108·
如果要修改字符,则不能仅仅简单地用修改过的nChar 调用CEdit::OnChar,然后用
CEdit::OnChar 调用CWnd::Default 获取原来的wParam 和lParam 的值。要修改一个字符,
需要首先修改nChar,然后用修改过的nChar 调用CWnd: : DefWindowProc。下例说明了如何
将字符转变为大写。
//Make all characters uppercase
void CMyEdit::OnChar (UINT nChar,UINT nRepCnt,UINT nFlags)
{
//Make sure character is uppercase .
if (::IsCharAlpha (( TCHAR) nChar))
nChar=::CharUpper (nChar ) ;
//Bypass default OnChar processing and directly call
//default window proc.
DefWindProc(WM_CHAR,nChar,MAKELPARAM (nRepCnt,nFlags));
}
5.3 滚动条(Scroll Bar)控件
5.3.1 滚动条控件的使用
滚动条(Scroll Bar)是一种传统控件,主要用来从某一预定义值范围内快速有效地进行
浏览,分为垂直滚动条(Horizontal Scroll Bar)和水平滚动条(Vertical Scroll Bar)两种,如
图5-3 所示。在滚动条内有一个滚动框,用来表示当前的值。用鼠标单击滚动条,可以使滚
动框移动一页或一行,也可以直接拖动滚动框。滚动条既可以作为一个独立控件存在,也可
以作为窗口、列表框和组合框的一部分。Windows 2000 中还支持比例滚动框,即用滚动框的
大小来反映页相对于整个范围的大小。
图5-3 滚动条样例
需要指出的是,从xìng质上划分,滚动条可分为标准滚动条和滚动条控件两种。标准滚动
条是由WS_HSCROLL 或WS_VSCROLL 风格指定的,它不是一个实际的窗口,而是窗口的
一个组成部分(例如列表框中的滚动条),只能位于窗口的右侧(垂直滚动条)或底端(水平
滚动条),标准滚动条是在窗口的非客户区中创建的。与之相反,滚动条控件并不是窗口中的
一部分,而是一个实际的窗口,可以放置在窗口客户区的任意地方,它既可以独立存在,也
可以与某一个窗口组合,行使滚动窗口的职能。由于滚动条控件是一个独立窗口,因此可以
拥有输入焦点,可以响应光标控制键,如PageUp、PageDown、Hcom 和End 等。
枫叶文学网www.fywxw.com
第5 章 常用控件
·109·
滚动条控件封装在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。
5.3.2 CscrollBar 类的主要成员函数
下面将介绍CScrollBar 类主要的成员函数。
1.GetScrollPos()函数
该成员函数声明如下:
int GetScrollPos() const;
该函数返回滚动框的当前位置,若cāo作失败则返回0。
2.SetScrollPos()函数
该成员函数声明如下:
int SetScrollPos(int nPos,BOOL bRedraw = TRUE);
该函数将滚动框移动到指定位置。参数nPos 指定了新的位置,参数bRedraw 表示是否
需要重绘滚动条,如果为TRUE,则重绘之。函数返回滚动框原来的位置,若cāo作失败则返
回0。
3.GetScrollRange()函数
该成员函数声明如下:
void GetScrollRange(LPINT lpMinPos,LPINT lpMaxPos) const;
该函数对滚动条的滚动范围进行查询。参数lpMinPos 和lpMaxPos 分别指向滚动范围的
最小、最大值。
4.SetScrollRange()函数
该成员函数声明如下:
void SetScrollRange(int nMinPos,int nMaxPos,BOOL bRedraw = TRUE);
该函数用于指定滚动条的滚动范围。参数nMinPos 和nMaxPos 分别指定了滚动范围的最
小、最大值,由这两者指定的滚动范围不得超过32767。当两者都为0 时,滚动条将被隐藏。
参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则重绘之。
5.GetScrollInfo()函数
该成员函数声明如下:
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·110·
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。
6.SetScrollInfo()函数
该成员函数声明如下:
BOOL SetScrollInfo(LPSCROLLINFO lpScrollInfo,BOOL bRedraw = TRUE);
该函数用于设置滚动条的各种状态,如设定页尺寸从而实现比例滚动框。参数lpScrollInfo
指向一个SCROLLINFO 结构,参数bRedraw 表示是否需要重绘滚动条,如果为TRUE,则
重绘之。若cāo作成功,该函数返回TRUE,否则返回FALSE。
CWnd 类也提供了一些函数来查询和设置所属的标准滚动条。这些函数与CScrollBar 类
的函数同名,且功能相同,但每个函数都多了一个参数,用来选择滚动条。
7.GetScrollPos()函数
该成员函数声明如下:
int GetScrollPos(int nBar) const;
参数nBar 用来选择滚动条,可以为下列值。
? SB_HORZ:指定水平滚动条。
? SB_VERT:指定垂直滚动条。
枫叶文学网www.fywxw.com
第5 章 常用控件
·111·
8.OnHScroll()和OnVScroll()函数
无论是标准滚动条,还是滚动条控件,滚动条的通知消息都是用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);
参数nSBCode 是通知消息码,主要通知码如表5-7 所示。nPos 是滚动框的位置,只有在
nSBCode 为SB_THUMBPOSITION 或SB_THUMBTRACK 时,该参数才有意义。如果通知
消息是滚动条控件发来的,那么pScrollBar 是指向该控件的指针,如果是标准滚动条发来的,
则pScrollBar 为NULL。
表5-7 通知消息码
消息 含义
SB_BOTTOM/SB_RIGHT 滚动到底端(右端)
SB_TOP/SB_LEFT 滚动到顶端(左端)
SB_LINEDOWN/SB_LINERIGHT 向下(向右)滚动一行(列)
SB_LINEUP/SB_LINELEFT 向上(向左)滚动一行(列)
SB_PAGEDOWN/SB_PAGERIGHT 向下(向右)滚动一页
SB_PAGEUP/SB_PAGELEFT 向上(向左)滚动一页
SB_THUMBPOSITION 滚动到指定位置
SB_THUMBTRACK 滚动框被拖动。可利用该消息来跟踪对滚动框的拖动
SB_ENDSCROLL 滚动结束
5.4 按钮(Button、Radio Box、Check Box、Group Box)控件
5.4.1 按钮控件的使用
按钮也是一种传统控件。按钮控件包括命令按钮(Pushbutton)、检查框(Check Box)、
单选按钮(Radio Button)、组框(Group Box)和自绘式按钮(Owner-draw Button)。命令按
钮的作用是对鼠标的单击作出反应并触发相应的事件,在按钮中既可以显示文本,也可以显
示位图。选择框控件作为一种选择标记,可以有选中、
松语文学免费小说阅读_www.16sy.com