常用控件类的函数.docx
《常用控件类的函数.docx》由会员分享,可在线阅读,更多相关《常用控件类的函数.docx(12页珍藏版)》请在冰豆网上搜索。
![常用控件类的函数.docx](https://file1.bdocx.com/fileroot1/2023-1/1/32fef895-96be-4138-9010-2105e8f6ec06/32fef895-96be-4138-9010-2105e8f6ec061.gif)
常用控件类的函数
常用控件总结
一:
MFC中DLALOG下的RADIO控件在MFC中radiobutton的用法:
先为对话框加上2个radiobutton,分别是Radio1和Radio2。
问题1:
如何让Radio1或者Radio2默认选上?
如何知道哪个被选上了?
关键是选上,“默认”只要放在OnInitDialog()即可。
三种方法可以让它选上,
第一种:
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(TRUE);//选上
((CButton*)GetDlgItem(IDC_RADIO1))->SetCheck(FALSE);//不选上
((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck();返回1表示选上,0表示没选上
第二种:
关联一个congtrol型变量(子类化),好ctrl+W(即打开classwizard),点开MemberVariables,咦?
怎么没有IDC_RADIO1这个ID?
原来是没有分组。
因为radiobutton通常都是成组使用的,在一组里面是互斥的。
取消,回到对话框资源面板,右键Radio1查看属性把Group选上,那么,Radio1和Radio2就是一组了(怎么知道他们是一组的?
后面说)。
此时,就可以为Radio1增加一congtrol型变量m_ctrlRadio1了。
如下:
m_ctrlRadio1.SetCheck(TRUE);
同样可以使用GetCheck()获取状态。
第三种:
关联一个int型变量(同样需要先分组)m_nRadio1,打开对话框构造函数,你会发现有:
m_nRadio1=-1;m_nRadio1别赋值-1表示哪个都没有选上。
如果你把-1改成0,就会发现Radio1默认被选上了,依此类推,m_nRadio1的值为1就是第二个被选上了(这里同样有问题,哪个是第一个?
哪个是第二个?
)。
获取状态很简单,UpdateData(TRUE)后判断m_nRadio1的值即可。
问题2:
如何使用多组?
多组和一组是一样的使用,只要搞清楚哪个是哪一组的就行了。
再为对话框添加Radio3和Radio4。
很简单,先为这些RadioButton排个顺序(这个必须要做,比如你的一组控件有Radio1,Radio2,Radio3,就把它们的TAB顺序分别设为1,2,3,并将Radio1的Group属性设为True,这样,当选中Radio1的时候和它关联的变量就是0,当选中Radio2的时候和它关联的变量就是1,依此类推),就是排列他们的TABORDER。
在对话框资源面板上Ctrl+D,然后按你自己的理想顺序用鼠标逐个点击就可以了。
不妨假设Radio1、Radio2、Radio3、Radio4分别是1、2、3、4。
Radio1和Radio3都选上Group属性,那么,1、2是一组,3、4是另外一组,因为分组的原则是在选上Group属性的这一个开始直到碰到下一个选上Group属性的。
你不妨再Ctrl+D,令Radio1、Radio2、Radio3、Radio4分别是1、3、2、4,那么Radio1和Radio3是一组,如果m_nRadio1=1,此时是Radio3被选上而不是Radio2被选上。
。
二单选按钮控件(RadioButton)的使用
对单选按钮进行分组:
每组的第一个单选按钮设置属性:
Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto。
如:
Radio1、Radio2、Radio3为一组,Radio4、Radio5为一组
设定Radio1属性:
Group,Tabstop,Auto
设定Radio2属性:
Tabstop,Auto
设定Radio3属性:
Tabstop,Auto
设定Radio4属性:
Group,Tabstop,Auto
设定Radio5属性:
Tabstop,Auto
用ClassWizard为单选控件定义变量,每组只能定义一个。
如:
m_Radio1、m_Radio4。
用ClassWizard生成各单选按钮的单击消息函数,并加入内容:
voidCWEditView:
:
OnRadio1()
{
m_Radio1=0;//第一个单选按钮被选中
}
voidCWEditView:
:
OnRadio2()
{
m_Radio1=1;//第二个单选按钮被选中
}
voidCWEditView:
:
OnRadio3()
{
m_Radio1=2;//第三个单选按钮被选中
}
voidCWEditView:
:
OnRadio4()
{
m_Radio4=0;//第四个单选按钮被选中
}
voidCWEditView:
:
OnRadio5()
{
m_Radio4=1;//第五个单选按钮被选中
}
设置默认按钮:
在定义控件变量时,ClassWizard在构造函数中会把变量初值设为-1,只需把它改为其它值即可。
如:
//{{AFX_DATA_INIT(CUnitBlockTypeFlankPublicAdd)
m_Radio1=0;//初始时第一个单选按钮被选中
m_Radio4=0;//初始时第四个单选按钮被选中
//}}
//RadioButton使用
使用方法一:
在工程中添加控件后,直接在控件的Click事件中写入需要的代码即可
使用方法二:
1.建立一个基于对话框的用用程序,在其中加入三个RadioButton,ID分别为:
IDC_RADIO1,IDC_RADIO2,IDC_RADIO3
2.控件的初始化:
在对话框类的OnInitDialog中加入代码:
CheckRadioButton(IDC_RADIO1,IDC_RADIO3,IDC_RADIO3);//第一个参数为该组的第一个单选按钮的ID
//第二个参数为该组的最后一个单选按钮的ID
//第三个参数为该组中被选中的单选按钮的ID
3.在加入一个Button控件,并为其写入Click事件代码:
intiRadioButton;
iRadioButton="GetCheckedRadioButton"(IDC_RADIO1,IDC_RADIO3);
if(iRadioButton==IDC_RADIO1)
MessageBox("ClickButton1");
if(iRadioButton==IDC_RADIO2)
MessageBox("ClickButton2");
if(iRadioButton==IDC_RADIO3)
MessageBox("ClickButton3");
其他说明:
RadioButton成组使用时,只需保证在添加控件时资源号连续,并且第一个RadioButton的属性中Group被选中即可.
这样就可以给这一组控件添加成员变量使用
例:
1.建立一个基于对话框的应用程序,添加三个RadioButton,和一个Button
选中第一个RadioButton属性中的Group
2.在Button的Click事件中添加代码:
UpdateData(TRUE);
if(m_radio==0)
MessageBox("0");
if(m_radio==1)
MessageBox("1");
if(m_radio==2)
MessageBox("2");
UpdateData(false);
三:
MFC里CHECKBOX用法
可以对变量进行get或者set之类的操作来设置或者判断复选框的选择状态。
得到复选框状态的函数:
CButton*pBtn=(CButton*)GetDlgItem(IDC_CHECK);
intstate=pBtnNONE->GetCheck();
当state==1时表示该复选框没有被选中;
当state==0时表示该复选框被选中
设置复选框状态的函数:
CButton*pBtn=(CButton*)GetDlgItem(IDC_CHECK);
pBtnNONE->SetCheck
(1);
SetCheck
(1)表示设置复选框为“选中”状态;
SetCheck(0)表示设置复选框为“未选中”状态;
四:
在MFC中CComboBox(组合框)使用技巧
1.CComboBox风格
CBS_AUTOHSCROLL//自动水平滚动条
CBS_DISABLENOSCROLL//选中时始终显示滚动条
CBS_DROPDOWN//下拉式
CBS_DROPDOWNLIST//下拉列表
CBS_HASSTRINGS//为字符串提供GetText()函数
CBS_LOWERCASE//转换为小写
CBS_NOINTEGRALHEIGHT//指定组合框由应用程序来指定大小的
CBS_OEMCONVERT//OEM字符集转换
CBS_OWNERDRAWFIXED//所有项目的高度是一样的
CBS_OWNERDRAWVARIABLE//指定单一项目的高度
CBS_SIMPLE//简单风格
CBS_SORT//排序
CBS_UPPERCASE//转换为大写
2.初始化数据
1).在ComboBox控件属性的Data标签里面添加,一行表示ComboBox下拉列表中的一行。
换行用ctrl+回车。
2).在程序初始化时动态添加
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);//strTemp为CString
3.删除指定行
DeleteString(UINTnIndex)//删除指定行
4.插入指定位置
InsertString(intnIndex,LPCTSTRlpszItem)//将行插入到指定位置
5.删除所有项
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent();//消除ID为IDC_COMBO_CF现有所有内容
6.查找指定字符串
FindString(intnStartAfter,LPCTSTRlpszItem)//可以在当前所有行中查找指定的字符串的位置,nStartAfter指明从那一行开始进行查找。
SelectString(intnStartAfter,LPCTSTRlpszItem)//可以选中包含指定字符串的行
7.选择其中某行
//
(1)选中:
intiPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel();//当前选中的行。
//
(2)设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n)//设置第n行内容为显示的内容。
8.获取总行数
intGetCount()//得到当前列表框中行的数量
9.取得ComboBox框内容
/*
(1)取当前内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp);//将获取的值存放到CString类型变量strTemp中。
//如果定义了关联的变量,例如m_combo,可以直接获取:
m_combo->GetWindowText(strTemp);
/*
(2)取其他行内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp);//其中n为从0开始的索引值
10.获得焦点
通常要判断控件是否获得了焦点,可以用GetFocus()函数
例如:
if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。
但是combobox的焦点不同,因为它是由edit和listbox两部分组成的,所以获得焦点要用GetParent():
if((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
11.改变下拉框大小
在设计界面里,点击一下ComboBox的下拉箭头,此时出现的调整框就是ComboBox的下拉调整框
12.常用消息映射宏
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会自动列出相关的消息,并能自动产生消息映射代码。
常用的函数:
GetCount()函数功能:
用以获得列表框中的选项数目.
GetCurSel()函数功能:
用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1
SetCurSel函数功能:
选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;
SetEditSel函数功能:
设置编辑区中蓝色选中字段的长度原型:
BOOLSetEditSel(intnStartChar,intnEndChar);
说明:
nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.
Clear()Cut()Paste()Copy()
这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.
LimitText()函数功能:
其作用是限制在编辑框中键入的文本长度原型:
BOOLLimitText(intnMaxChars);
说明:
当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节
GetLBText()函数原型:
voidGetLBText(intnIndex,CString&rString).说明:
nIndex为列表框中数据的索引值,rString为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度
AddString()DeleteString()InsertString()ResetContent()四个函数放在一起,他们都是针对下拉列表框的处理函数,
AddString(LPCTSTRlpszString)是在列表框的尾巴添加一条数据,参数为字符串.
DeleteString(UINTnIndex)为删除指定索引为nIndex的数据.InsertString(intnIndex,LPCTSTRlpszString)在索引nIndex处插入IpszString的内容.
ResetContent()是清除列表框中所有的内容.
SetDroppedWidth(UINTnWidth)函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.
五:
在MFC中TabControl(选项卡)的使用
1、首先创建一个MFC对话框框架,在对话框资源上从工具箱中添加上一个TabControl控件,根据需要修改一下属性,然后右击控件,为这个控件添加一个变量,
将此控件跟一个CTabCtrl类变量绑定在一起,这里设为m_tabctrl
2、创建两个新的对话框资源,其属性作如下修改:
Border:
none//边界为空,这样它就没了标题栏
Style:
Child//这样这个模板就可以当作另一个窗口的子窗口了。
其它如果没有必要,就不用改了。
在上面加一些控件什么的,具体操作跟普通对话框没有区别。
完成后从这两个对话框模板生成两个新的对话框类。
3、在主对话框中为新添加进来的两个类增加两个变量:
如:
CDialog1m_mm1;
CDialog2m_mm2;
4、在主对话框的OnInitDialog()函数中添加如下类似的代码:
TCITEMitem;
item.mask=TCIF_TEXT;
item.pszText="第一页";
m_tabctrl.InsertItem(0,&item);
item.pszText="第二页";
m_tabctrl.InsertItem(1,&item);
m_mm1.Create(IDD_DIALOG1,&m_tabctrl);
m_mm2.Create(IDD_DIALOG2,&m_tabctrl);
m_mm1.SetWindowPos(NULL,10,30,400,100,SWP_SHOWWINDOW);
m_mm2.SetWindowPos(NULL,10,30,400,100,SWP_HIDEWINDOW);
解释如下:
两个InsertItem函数的调用是为了给标签控件增加两个标签页面,文本是标题。
SetWindowPos()函数设置这两个对话框在Z顺序中的位置,显示或隐藏状态.。
5、在主对话中为标签控件添加一个标签选择改变(TCN_SELCHANGE)的控件通知消息,以便在用户选择标签时通知主对话框。
在主对话框的编辑界面右击标签控件
,选择添加一个事件可以完成这个操作。
在事件处理中添加如下代码,如下例:
voidCtabdialogDlg:
:
OnTcnSelchangeTab1(NMHDR*pNMHDR,LRESULT*pResult)
{
CRectr;
m_tabctrl.GetClientRect(&r);
switch(m_tabctrl.GetCurSel())
{
case0:
m_mm1.SetWindowPos(NULL,10,30,r.right-20,r.bottom-40,SWP_SHOWWINDOW);
m_mm2.SetWindowPos(NULL,10,30,r.right-20,r.bottom-40,SWP_HIDEWINDOW);
break;
case1:
m_mm1.SetWindowPos(NULL,10,30,r.right-20,r.bottom-40,SWP_HIDEWINDOW);
m_mm2.SetWindowPos(NULL,10,30,r.right-20,r.bottom-40,SWP_SHOWWINDOW);
break;
}
*pResult=0;
}
要想知道用户选择那个标签页,要通过m_tabctrl.GetCurSel()函数。
为了不使显示的子对话框覆盖标签控件的显示,所以要获得标签控件的尺寸然后设置各页面
的尺寸。
五:
在MFC中Slider(滑块控件)的使用
主要要方法有:
1、设置、取得滑动范围:
voidSetRange(intnMin,intnMax,BOOLbRedraw=FALSE);
voidGetRange(int&nMin,int&nMax)const;
2、设置、取得按下左右箭头滑动间隔:
intSetLineSize(intnSize);
intGetLineSize()const;
3、设置、取得按下PgUp、PgDown时滑动间隔:
intSetPageSize(intnSize);
intGetPageSize()const;
4、设置、取得滑块位置:
voidSetPos(intnPos);
intGetPos()const;
5、设置滑动条刻度的频度:
voidSetTicFreq(intnFreq);
实例:
在对话框中放一个Slider控件,添加相应的Ctrl型变量为m_slider。
在对话框初始化函数OnInitDialog()中添加:
BOOLCDlgSetup:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//TODO:
Addextrainitializationhere
m_slider.SetRang(0,100);//设置滑动范围
m_slider.SetTicFreq(10);//每10个单位画一刻度
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
//EXCEPTION:
OCXPropertyPagesshouldreturnFALSE
}
Slider控件本身并没有响应滑动的消息函数,但可以通过主窗体的OnHScroll()响应。
在类向导中为对话框添加WM_HSCROLL消息,在响应函数中添加:
voidCDlgSetup:
:
OnHScroll(UINTnSBCode,UINTnPos,CScrollBar*pScrollBar)
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CSliderCtrl*pSlidCtrl=(CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
m_int=pSlidCtrlHue->GetPos();//取得当前位置值
CDialog:
:
OnHScroll(nSBCode,nPos,pScrollBar);
}
//m_int即为当前滑块的值。
注意:
设置最大值和最小值
过函数SetRange来完