第四章 窗口控件.docx
《第四章 窗口控件.docx》由会员分享,可在线阅读,更多相关《第四章 窗口控件.docx(30页珍藏版)》请在冰豆网上搜索。
![第四章 窗口控件.docx](https://file1.bdocx.com/fileroot1/2023-1/31/9a274ad4-9faa-4112-bde0-5ae34fb69334/9a274ad4-9faa-4112-bde0-5ae34fb693341.gif)
第四章窗口控件
第四章窗口控件
4.1Button
按钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,PushButton,CheckBox,RadioBox。
所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。
创建按钮:
BOOLCButton:
:
Create(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID);其中lpszCaption是按钮上显示的文字,dwStyle为按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)还有按钮专用的一些风格。
●BS_AUTOCHECKBOX检查框,按钮的状态会自动改变Sameasacheckbox,exceptthatacheckmarkappearsinthecheckboxwhentheuserselectsthebox;thecheckmarkdisappearsthenexttimetheuserselectsthebox.
●BS_AUTORADIOBUTTON圆形选择按钮,按钮的状态会自动改变Sameasaradiobutton,exceptthatwhentheuserselectsit,thebuttonautomaticallyhighlightsitselfandremovestheselectionfromanyotherradiobuttonswiththesamestyleinthesamegroup.
●BS_AUTO3STATE允许按钮有三种状态即:
选中,未选中,未定Sameasathree-statecheckbox,exceptthattheboxchangesitsstatewhentheuserselectsit.
●BS_CHECKBOX检查框Createsasmallsquarethathastextdisplayedtoitsright(unlessthisstyleiscombinedwiththeBS_LEFTTEXTstyle).
●BS_DEFPUSHBUTTON默认普通按钮Createsabuttonthathasaheavyblackborder.TheusercanselectthisbuttonbypressingtheENTERkey.Thisstyleenablestheusertoquicklyselectthemostlikelyoption(thedefaultoption).
●BS_LEFTTEXT左对齐文字Whencombinedwitharadio-buttonorcheck-boxstyle,thetextappearsontheleftsideoftheradiobuttonorcheckbox.
●BS_OWNERDRAW自绘按钮Createsanowner-drawnbutton.TheframeworkcallstheDrawItemmemberfunctionwhenavisualaspectofthebuttonhaschanged.ThisstylemustbesetwhenusingtheCBitmapButtonclass.
●BS_PUSHBUTTON普通按钮CreatesapushbuttonthatpostsaWM_COMMANDmessagetotheownerwindowwhentheuserselectsthebutton.
●BS_RADIOBUTTON圆形选择按钮Createsasmallcirclethathastextdisplayedtoitsright(unlessthisstyleiscombinedwiththeBS_LEFTTEXTstyle).Radiobuttonsareusuallyusedingroupsofrelatedbutmutuallyexclusivechoices.
●BS_3STATE允许按钮有三种状态即:
选中,未选中,未定Sameasacheckbox,exceptthattheboxcanbedimmedaswellaschecked.Thedimmedstatetypicallyisusedtoshowthatacheckboxhasbeendisabled.
rect为窗口所占据的矩形区域,pParentWnd为父窗口指针,nID为该窗口的ID值。
获取/改变按钮状态:
对于检查按钮和圆形按钮可能有两种状态,选中和未选中,如果设置了BS_3STATE或BS_AUTO3STATE风格就可能出现第三种状态:
未定,这时按钮显示灰色。
通过调用intCButton:
:
GetCheck()得到当前是否被选中,返回0:
未选中,1:
选中,2:
未定。
调用voidCButton:
:
SetCheck(intnCheck);设置当前选中状态。
处理按钮消息:
要处理按钮消息需要在父窗口中进行消息映射,映射宏为ON_BN_CLICKED(id,memberFxn)id为按钮的ID值,就是创建时指定的nID值。
处理函数原型为afx_msgvoidmemberFxn();
4.2StaticBox
静态文本控件的功能比较简单,可作为显示字符串,图标,位图用。
创建一个窗口可以使用成员函数:
BOOLCStatic:
:
Create(LPCTSTRlpszText,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID=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=newCStatic;
pstaDis->Create("",WS_CHILD|WS_VISIBLE|SS_BITMAP|SSCENTERIMAGE,CRect(0,0,40,40),pWnd,1);
CBitmapbmpLoad;
bmpLoad.LoadBitmap(IDB_TEST);
pstaDis->SetBitmap(bmpLoad.Detach());
4.3EditBox
Edit窗口是用来接收用户输入最常用的一个控件。
创建一个输入窗口可以使用成员函数:
BOOLCEdit:
:
Create(LPCTSTRlpszText,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID=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可以得到/设置在输入框中输入的字符数量。
由于在输入时用户可能选择某一段文本,所以通过voidCEdit:
:
GetSel(int&nStartChar,int&nEndChar)得到用户选择的字符范围,通过调用voidCEdit:
:
SetSel(intnStartChar,intnEndChar,BOOLbNoScroll=FALSE)可以设置当前选择的文本范围,如果指定nStartChar=0nEndChar=-1则表示选中所有的文本。
voidReplaceSel(LPCTSTRlpszNewText,BOOLbCanUndo=FALSE)可以将选中的文本替换为指定的文字。
此外输入框还有一些和剪贴板有关的功能,voidClear();删除选中的文本,voidCopy();可将选中的文本送入剪贴板,voidPaste();将剪贴板中内容插入到当前输入框中光标位置,voidCut();相当于Copy和Clear结合使用。
最后介绍一下输入框几种常用的消息映射宏:
●ON_EN_CHANGE输入框中文字更新后产生
●ON_EN_ERRSPACE输入框无法分配内存时产生
●ON_EN_KILLFOCUS/ON_EN_SETFOCUS在输入框失去/得到输入焦点时产生
使用以上几种消息映射的方法为定义原型如:
afx_msgvoidmemberFxn();的函数,并且定义形式如ON_Notification(id,memberFxn)的消息映射。
如果在对话框中使用输入框,ClassWizard会自动列出相关的消息,并能自动产生消息映射代码。
4.4ScrollBar
ScrollBar一般不会单独使用,因为SpinCtrl可以取代滚动条的一部分作用,但是如果你需要自己生成派生窗口,滚动条还是会派上一些用场。
创建一个滚动条可以使用成员函数:
:
BOOLCEdit:
:
Create(LPCTSTRlpszText,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID=0xffff);
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对滚动条指明专门的风格。
●SBS_VERT风格将创建一个垂直的滚动条。
●SBS_HORZ风格将创建一个水平的滚动条。
在创建滚动条后需要调用voidSetScrollRange(intnMinPos,intnMaxPos,BOOLbRedraw=TRUE)设置滚动范围,
intGetScrollPos()/intSetScrollPos()用来得到和设置当前滚动条的位置。
voidShowScrollBar(BOOLbShow=TRUE);用来显示/隐藏滚动条。
BOOLEnableScrollBar(UINTnArrowFlags=ESB_ENABLE_BOTH)用来设置滚动条上箭头是否为允许状态。
nArrowFlags可取以下值:
●ESB_ENABLE_BOTH两个箭头都为允许状态
●ESB_DISABLE_LTUP上/左箭头为禁止状态
●ESB_DISABLE_RTDN下/右箭头为禁止状态
●ESB_DISABLE_BOTH两个箭头都为禁止状态
如果需要在滚动条位置被改变时得到通知,需要在父窗口中定义对消息WM_VSCROLL/WM_HSCROLL的映射。
方法为在父窗口类中重载
afx_msgvoidOnVScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)/afx_msgvoidOnHScroll(UINTnSBCode,UINTnPos,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滚动条拖动完成(用户松开鼠标)
4.5ListBox/CheckListBox
ListBox窗口用来列出一系列的文本,每条文本占一行。
创建一个列表窗口可以使用成员函数:
BOOLCListBox:
:
Create(LPCTSTRlpszText,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID=0xffff);
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。
●LBS_MULTIPLESEL指明列表框可以同时选择多行
●LBS_EXTENDEDSEL可以通过按下Shift/Ctrl键选择多行
●LBS_SORT所有的行按照字母顺序进行排序
在列表框生成后需要向其中加入或是删除行,可以利用:
intAddString(LPCTSTRlpszItem)添加行,
intDeleteString(UINTnIndex)删除指定行,
intInsertString(intnIndex,LPCTSTRlpszItem)将行插入到指定位置。
voidResetContent()可以删除列表框中所有行。
通过调用intGetCount()得到当前列表框中行的数量。
如果需要得到/设置当前被选中的行,可以调用intGetCurSel()/intSetCurSel(intiIndex)。
如果你指明了选择多行的风格,你就需要先调用intGetSelCount()得到被选中的行的数量,然后intGetSelItems(intnMaxItems,LPINTrgIndex)得到所有选中的行,参数rgIndex为存放被选中行的数组。
通过调用intGetLBText(intnIndex,LPTSTRlpszText)得到列表框内指定行的字符串。
此外通过调用intFindString(intnStartAfter,LPCTSTRlpszItem)可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
intSelectString(intnStartAfter,LPCTSTRlpszItem)可以选中包含指定字符串的行。
在MFC4.2版本中添加了CCheckListBox类,该类是由CListBox派生并拥有CListBox的所有功能,不同的是可以在每行前加上一个检查框。
必须注意的是在创建时必须指明LBS_OWNERDRAWFIXED或LBS_OWNERDRAWVARIABLE风格。
通过voidSetCheckStyle(UINTnStyle)/UINTGetCheckStyle()可以设置/得到检查框的风格,关于检查框风格可以参考4.1Button中介绍。
通过voidSetCheck(intnIndex,intnCheck)/intGetCheck(intnIndex)可以设置和得到某行的检查状态,关于检查框状态可以参考4.1Button中介绍。
最后介绍一下列表框几种常用的消息映射宏:
●ON_LBN_DBLCLK鼠标双击
●ON_EN_ERRSPACE输入框无法分配内存时产生
●ON_EN_KILLFOCUS/ON_EN_SETFOCUS在输入框失去/得到输入焦点时产生
●ON_LBN_SELCHANGE选择的行发生改变
使用以上几种消息映射的方法为定义原型如:
afx_msgvoidmemberFxn();的函数,并且定义形式如ON_Notification(id,memberFxn)的消息映射。
如果在对话框中使用列表框,ClassWizard会自动列出相关的消息,并能自动产生消息映射代码。
4.6ComboBox/ComboBoxEx
组合窗口是由一个输入框和一个列表框组成。
创建一个组合窗口可以使用成员函数:
BOOLCListBox:
:
Create(LPCTSTRlpszText,DWORDdwStyle,constRECT&rect,CWnd*pParentWnd,UINTnID=0xffff);
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对列表控件指明专门的风格。
●CBS_DROPDOWN下拉式组合框
●CBS_DROPDOWNLIST下拉式组合框,但是输入框内不能进行输入
●CBS_SIMPLE输入框和列表框同时被显示
●LBS_SORT所有的行按照字母顺序进行排序
由于组合框内包含了列表框,所以列表框的功能都能够使用,如可以利用:
intAddString(LPCTSTRlpszItem)添加行,
intDeleteString(UINTnIndex)删除指定行,
intInsertString(intnIndex,LPCTSTRlpszItem)将行插入到指定位置。
voidResetContent()可以删除列表框中所有行。
通过调用intGetCount()得到当前列表框中行的数量。
如果需要得到/设置当前被选中的行的位置,可以调用intGetCurSel()/intSetCurSel(intiIndex)。
通过调用intGetLBText(intnIndex,LPTSTRlpszText)得到列表框内指定行的字符串。
此外通过调用intFindString(intnStartAfter,LPCTSTRlpszItem)可以在当前所有行中查找指定的字符传的位置,nStartAfter指明从那一行开始进行查找。
intSelectString(intnStartAfter,LPCTSTRlpszItem)可以选中包含指定字符串的行。
此外输入框的功能都能够使用,如可以利用:
DWORDGetEditSel()/BOOLSetEditSel(intnStartChar,intnEndChar)得到或设置输入框中被选中的字符位置。
BOOLLimitText(intnMaxChars)设置输入框中可输入的最大字符数。
输入框的剪贴板功能Copy,Clear,Cut,Paste动可以使用。
最后介绍一下列表框几种常用的消息映射宏:
●ON_CBN_DBLCLK鼠标双击
●ON_CBN_DROPDOWN列表框被弹出
●ON_CBN_KILLFOCUS/ON_CBN_SETFOCUS在输入框失去/得到输入焦点时产生
●ON_CBN_SELCHANGE列表框中选择的行发生改变
●ON_CBN_EDITUPDATE输入框中内容被更新
使用以上几种消息映射的方法为定义原型如:
afx_msgvoidmemberFxn();的函数,并且定义形式如ON_Notification(id,memberFxn)的消息映射。
如果在对话框中使用组合框,ClassWizard会自动列出相关的消息,并能自动产生消息映射代码。
在MFC4.2中对组合框进行了增强,你可以在组合框中使用ImageList,有一个新的类CComboBoxEx(由CComboBox派生)来实现这一功能。
在CComboBoxEx类中添加了一些新的成员函数来实现新的功能:
首先你需要调用
CImageList*SetImageList(CImageList*pImageList);来设置ImageList,然后调用
intInsertItem(constCOMBOBOXEXITEM*pCBItem);来添加行,其中COMBOBOXEXITEM定义如下:
typedefstruct
{
UINTmask;
intiItem;
LPTSTRpszText;
intcchTextMax;
intiImage;
intiSelectedImage;
intiOverlay;
intiIndent;
LPARAMlParam;
}COMBOBOXEXITEM,*PCOMBOBOXEXITEM;
你需要设置mask=CBEIF_IMAGE|CBEIF_TEXT,并设置iItem为插入位置,设置pszText为显示字符串,设置iImage为显示的图标索引。
下面的代码演示了如何进行插入:
/*m_cbeWnd为已经创建的CComboBox对象
m_list为CImageList对象IDB_IMG为16*(16*4)的位图,每个图