现在的位置: 首页 > 综合 > 正文

Window MFC 控件使用全集

2013年11月17日 ⁄ 综合 ⁄ 共 7339字 ⁄ 字号 评论关闭

Button
按钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,Push
Button
Check BoxRadio
Box
。所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。
创建按钮:BOOL CButton::Create( LPCTSTR lpszCaption, DWORD dwStyle,
const RECT& rect, CWnd* pParentWnd, UINT nID );
其中lpszCaption是按钮上显示的文字,dwStyle为按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)还有按钮专用的一些风格。

BS_AUTOCHECKBOX 
检查框,按钮的状态会自动改变   Same as a check box, except
that a check mark appears in the check box when the user selects the box; the check mark disappears the next time the user selects the box.

BS_AUTORADIOBUTTON 
圆形选择按钮,按钮的状态会自动改变   Same as a radio button,
except that when the user selects it, the button automatically highlights itself and removes the selection from any other radio buttons with the same style in the same group.

BS_AUTO3STATE 
允许按钮有三种状态即:选中,未选中,未定   Same as a three-state
check box, except that the box changes its state when the user selects it.

BS_CHECKBOX 
检查框   Creates a small square that has text displayed
to its right (unless this style is combined with the BS_LEFTTEXT style).

BS_DEFPUSHBUTTON 
默认普通按钮   Creates a button that has a heavy
black border. The user can select this button by pressing the ENTER key. This style enables the user to quickly select the most likely option (the default option).

BS_LEFTTEXT 
左对齐文字   When combined with a radio-button or
check-box style, the text appears on the left side of the radio button or check box.

BS_OWNERDRAW 
自绘按钮   Creates an owner-drawn button. The framework
calls the DrawItem member function when a visual aspect of the button has changed. This style must be set when using the CBitmapButton class.

BS_PUSHBUTTON 
普通按钮   Creates a pushbutton that posts a WM_COMMAND
message to the owner window when the user selects the button.

BS_RADIOBUTTON 
圆形选择按钮   Creates a small circle that has
text displayed to its right (unless this style is combined with the BS_LEFTTEXT style). Radio buttons are usually used in groups of related but mutually exclusive choices.

BS_3STATE 
允许按钮有三种状态即:选中,未选中,未定   Same as a check box, except
that the box can be dimmed as well as checked. The dimmed state typically is used to show that a check box has been disabled.

rect
为窗口所占据的矩形区域,pParentWnd为父窗口指针,nID为该窗口的ID值。
获取/改变按钮状态:对于检查按钮和圆形按钮可能有两种状态,选中和未选中,如果设置了BS_3STATEBS_AUTO3STATE风格就可能出现第三种状态:未定,这时按钮显示灰色。通过调用int
CButton::GetCheck( ) 
得到当前是否被选中,返回0:未选中,1:选中,2:未定。调用void
CButton::SetCheck( int nCheck );
设置当前选中状态。
处理按钮消息:要处理按钮消息需要在父窗口中进行消息映射,映射宏为ON_BN_CLICKED( id, memberFxn
)id
为按钮的ID值,就是创建时指定的nID值。处理函数原型为afx_msg
void memberFxn( );

 

Static Box
静态文本控件的功能比较简单,可作为显示字符串,图标,位图用。创建一个窗口可以使用成员函数:

BOOL CStatic::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对静态控件指明专门的风格。

SS_CENTER,SS_LEFT,SS_RIGHT 指明字符显示的对齐方式。

SS_GRAYRECT 
显示一个灰色的矩形

SS_NOPREFIX 
如果指明该风格,对于字符&将直接显示,否则&将作为转义符,&将不显示而在其后的字符将有下划线,如果需要直接显示&必须使用&&表示。

SS_BITMAP 
显示位图

SS_ICON 
显示图标

SS_CENTERIMAGE 
图象居中显示

控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。

控制显示的图标利用成员函数SetIcon/GetIcon用于设置/得到当前显示的图标。

控制显示的位图利用成员函数SetBitmap/GetBitmap用于设置/得到当前显示的位图。下面一段代码演示如何创建一个显示位图的静态窗口并设置位图

CStatic* pstaDis=new CStatic;

pstaDis->Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP|SSCENTERIMAGE,

CRect(0,0,40,40),pWnd,1);

CBitmap bmpLoad;

bmpLoad.LoadBitmap(IDB_TEST);

pstaDis->SetBitmap(bmpLoad.Detach());

 



Edit Box

Edit
窗口是用来接收用户输入最常用的一个控件。创建一个输入窗口可以使用成员函数:

BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对输入控件指明专门的风格。

ES_AUTOHSCROLL,ES_AUTOVSCROLL 指明输入文字超出显示范围时自动滚动。

ES_CENTER,ES_LEFT,ES_RIGHT 
指定对齐方式

ES_MULTILINE 
是否允许多行输入

ES_PASSWORD 
是否为密码输入框,如果指明该风格则输入的文字显示为*

ES_READONLY 
是否为只读

ES_UPPERCASE,ES_LOWERCASE 
显示大写/小写字符

控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。

通过GetLimitText/SetLimitText可以得到/设置在输入框中输入的字符数量。

由于在输入时用户可能选择某一段文本,所以通过void CEdit::GetSel( int& nStartChar, int&
nEndChar )
得到用户选择的字符范围,通过调用void CEdit::SetSel( int nStartChar,
int nEndChar, BOOL bNoScroll = FALSE )
可以设置当前选择的文本范围,如果指定nStartChar=0
nEndChar=-1
则表示选中所有的文本。void ReplaceSel( LPCTSTR lpszNewText,
BOOL bCanUndo = FALSE )
可以将选中的文本替换为指定的文字。

此外输入框还有一些和剪贴板有关的功能,void Clear( );删除选中的文本,void
Copy( );
可将选中的文本送入剪贴板,void Paste( );将剪贴板中内容插入到当前输入框中光标位置,void
Cut( );
相当于CopyClear结合使用。

最后介绍一下输入框几种常用的消息映射宏:

ON_EN_CHANGE 输入框中文字更新后产生

ON_EN_ERRSPACE 
输入框无法分配内存时产生

ON_EN_KILLFOCUS / ON_EN_SETFOCUS 
在输入框失去/得到输入焦点时产生
使用以上几种消息映射的方法为定义原型如:afx_msg void memberFxn( );的函数,并且定义形式如ON_Notification(
id, memberFxn )
的消息映射。如果在对话框中使用输入框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。 



Scroll Bar

Scroll Bar
一般不会单独使用,因为SpinCtrl可以取代滚动条的一部分作用,但是如果你需要自己生成派生窗口,滚动条还是会派上一些用场。创建一个滚动条可以使用成员函数::

BOOL CEdit::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对滚动条指明专门的风格。

SBS_VERT 风格将创建一个垂直的滚动条。

SBS_HORZ 
风格将创建一个水平的滚动条。

在创建滚动条后需要调用void SetScrollRange( int nMinPos, int nMaxPos, BOOL
bRedraw = TRUE )
设置滚动范围,

int GetScrollPos( )/int SetScrollPos( )
用来得到和设置当前滚动条的位置。

void ShowScrollBar( BOOL bShow = TRUE );用来显示/隐藏滚动条。

BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH )用来设置滚动条上箭头是否为允许状态。nArrowFlags可取以下值:

ESB_ENABLE_BOTH 两个箭头都为允许状态

ESB_DISABLE_LTUP 
/左箭头为禁止状态

ESB_DISABLE_RTDN 
/右箭头为禁止状态

ESB_DISABLE_BOTH 
两个箭头都为禁止状态


如果需要在滚动条位置被改变时得到通知,需要在父窗口中定义对消息WM_VSCROLL/WM_HSCROLL的映射。方法为在父窗口类中重载

afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )/afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar )
所使用的消息映射宏为:ON_WM_VSCROLL( ),ON_WM_HSCROLL( ),在映射宏中不需要指明滚动条的ID,因为所有滚动条的滚动消息都由同样的函数处理。在OnHScroll/OnVScroll的第三个参数会指明当前滚动条的指针。第一个参数表示滚动条上发生的动作,可取以下值:

SB_TOP/SB_BOTTOM 已滚动到顶/底部

SB_LINEUP/SB_LINEDOWN 
向上/下滚动一行

SB_PAGEDOWN/SB_PAGEUP 
向上/下滚动一页

SB_THUMBPOSITION/SB_THUMBTRACK 
滚动条拖动到某一位置,参数nPos指明当前位置(参数nPos在其它的情况下是无效的)

SB_ENDSCROLL 
滚动条拖动完成(用户松开鼠标)

 



List BoxCheck List Box

ListBox
窗口用来列出一系列的文本,每条文本占一行。创建一个列表窗口可以使用成员函数:

BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。

LBS_MULTIPLESEL 指明列表框可以同时选择多行

LBS_EXTENDEDSEL 
可以通过按下Shift/Ctrl键选择多行

LBS_SORT 
所有的行按照字母顺序进行排序

在列表框生成后需要向其中加入或是删除行,可以利用:

int AddString( LPCTSTR lpszItem )
添加行,

int DeleteString( UINT nIndex )
删除指定行,

int InsertString( int nIndex, LPCTSTR lpszItem )
将行插入到指定位置。

void ResetContent( )
可以删除列表框中所有行。
通过调用int GetCount( )得到当前列表框中行的数量。

如果需要得到/设置当前被选中的行,可以调用int
GetCurSel( )/int SetCurSel(int iIndex)
。如果你指明了选择多行的风格,你就需要先调用int
GetSelCount( )
得到被选中的行的数量,然后int GetSelItems( int nMaxItems,
LPINT rgIndex )
得到所有选中的行,参数rgIndex为存放被选中行的数组。通过调用int
GetLBText( int nIndex, LPTSTR lpszText )
得到列表框内指定行的字符串。

此外通过调用int FindString( int nStartAfter, LPCTSTR lpszItem )可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。

int SelectString( int nStartAfter, LPCTSTR lpszItem )
可以选中包含指定字符串的行。

MFC 4.2版本中添加了CCheckListBox类,该类是由CListBox派生并拥有CListBox的所有功能,不同的是可以在每行前加上一个检查框。必须注意的是在创建时必须指明LBS_OWNERDRAWFIXEDLBS_OWNERDRAWVARIABLE风格。

通过void SetCheckStyle( UINT nStyle )/UINT GetCheckStyle( )可以设置/得到检查框的风格,关于检查框风格可以参考4.1
Button
中介绍。通过void SetCheck( int nIndex, int nCheck )/int
GetCheck( int nIndex )
可以设置和得到某行的检查状态,关于检查框状态可以参考4.1 Button中介绍。

最后介绍一下列表框几种常用的消息映射宏:

ON_LBN_DBLCLK 鼠标双击

ON_EN_ERRSPACE 
输入框无法分配内存时产生

ON_EN_KILLFOCUS / ON_EN_SETFOCUS 
在输入框失去/得到输入焦点时产生

ON_LBN_SELCHANGE 
选择的行发生改变
使用以上几种消息映射的方法为定义原型如:afx_msg void memberFxn( );的函数,并且定义形式如ON_Notification(
id, memberFxn )
的消息映射。如果在对话框中使用列表框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。 



Combo Box
组合窗口是由一个输入框和一个列表框组成。创建一个组合窗口可以使用成员函数:

BOOL CListBox::Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。

CBS_DROPDOWN 下拉式组合框

CBS_DROPDOWNLIST 
下拉式组合框,但是输入框内不能进行输入

CBS_SIMPLE 
输入框和列表框同时被显示

LBS_SORT 
所有的行按照字母顺序进行排序

由于组合框内包含了列表框,所以列表框的功能都能够使用,如可以利用:

int AddString( LPCTSTR lpszItem )
添加行,

int DeleteString( UINT nIndex )
删除指定行,

int InsertString( int nIndex, LPCTSTR lpszItem )
将行插入到指定位置。

void ResetContent( )
可以删除列表框中所有行。
通过调用int GetCount( )得到当前列表框中行的数量。

抱歉!评论已关闭.