mfc控件:

windows标准控件:

windows标准控件由windows 操作系统提供,在windows 95中还提供了一些新增的控件。所有这些控件对象都是可编程的,我们可以使用visual c++提供的对话框编辑器把它们添加到对话框中。microsoft基础类库(mfc)提供了封装这些控件的类,它们列于表6.1。

在mfc 中,类cwnd是所有窗口类的基类,很自然的,它也是所控件类的基类。

windows标准控件在以下环境下提供:

windows 95

windows nt 3.51及以后版本

win32s 1.3

注意:visual c++4.2及以后版本不再支持win32s.

mfc基本常用控件基本用法

vc++控件工具箱:

按钮(button)

用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作。按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通知,用户可以对这些控件通知进行消息映射,从而进行相应的处理。

在一个对话框中,可以定义一个默认按钮,这只要选中按钮属性中的“default”选项。如果在对话框活动的时候按下了enter键,则等同于单击了默认按钮。mfc提供了cbutton类支持按钮控件。

复选框(check box)

用来显示某种可能的选择,该项选择是独立的,用户可以选中或取消该选项。在选项被选中的时候核选标记出现,选项被取消时核选标记消失。mfc中由cbutton类对核选框进行支持,用户可以通过setcheck()函数和getcheck()函数设置或获取核选框当前的状态

bst_unchecked==((cbutton*)getdlgitem(idc_check_res1))->getcheck()
((cbutton*)getdlgitem(idc_check_res1))->setcheck(true);		

编辑框(edit control)

用来接收用户输入的字符串通过选择编辑框的选项,编辑框可以接收字符串、数字、密码等;编辑框还可以设置成接收多行字符串的模式;可以自动进行大小写转换。编辑框可能向父窗口发送多种控件通知,如果用户需要,可以对这些控件通知进行处理。mfc提供了cedit类支持编辑框控件

getdlgitem(idc_***)->setwindowtext(cstring);
 
getdlgitem(idc_***)->getwindowtext(cstring);

组合框(combo box)

列表框和编辑框的组合,用户除了可以在列表中对已经存在的选项进行选择外,还可以输入新的选择。mfc提供了ccombobox类对组合框控件进行支持。

ccombobox * aaa = (ccombobox*)(getdlgitem(idc_***));
 
aaa->addstring(_t("***"));
 
aaa->selectstring(0, _t("***"));
 
aaa->setcursel(0);
 
 
int nsel = aaa->getcursel();
 
aaa->getlbtext(nsel, cstring);
 
if(strtype.trim() == _t("***"))

列表框(list box)

用来选择一系列的可能选择,用户通过滚动条可以在这些选择中浏览。在列表框中,可以进行单项选择,也可以进行多项选择,这取决于用户在控件属性对话框中的设置。mfc提供了clistbox类对列表框控件进行支持。

组成框(group box)

用来包围具有逻辑关系的一组控件,在这些控件的周围加上边界和标题。需注意的是,组成框仅仅是在视觉效果上对控件进行“成组”,真正的“成组”工作还需要另外一些工作。仅仅在视觉上展现出一组的逻辑关系,并不添加任何代码

单选按钮(radio button)

用来选择某种可能的选择,与 (check box)复选框不同,该选项不是独立的

一般是几个单选按钮组成一组同组中的单选按钮仅有一个按钮被选中

mfc同样使用cbutton类对单选按钮控件进行支持

setcheck()函数和getcheck()函数对单选按钮也是适用的。

静态文本(static text)

用来在指定的位置显示特定的字符串一般用来标识附近另一个控件的内容。显示在静态文本控件中的字符串一般不再改变,但是在需要的时候,必须为其指定一个不同食物id号,通过调用相应的函数来进行设置。mfc提供了cstatic类支持静态控件

图形控件(picture control)

显示位图(bitmap)和图标(icon),图形绘制与显示,主要是其方形的区域适合显示,同样方形区域也可利用(static text)静态文本框。

滚动条(scroll bar)

这包括水平滚动条和垂直滚动条,除了在视觉效果上的方向不同外,水平滚动条在被滚动时发生wm_hscroll消息,而垂直滚动条在被滚动时发送wm_vscroll消息mfc提供了cscrollbar进行支持

滑块控件(slider control)

通常用来在程序中接受一系列离散的数值

用户可以设置滑块控件的取值范围,并可以为控件加上刻度标记以显示特定位置的含义。

mfc提供了csliderctrl类进行支持

微调按钮(spin button)

包括一对紧靠在一起的上下箭头,使用微调按钮可以增大或者缩小某个特定的数值。

微调按钮往往都需要一个“伙伴”控件,这通常都是一个编辑框

当微调按钮的向上箭头被单击时,编辑框中的数字就增大;反之则减小mfc提供了cpinbuttonctrl类进行支持

进度条(progress control)

进行一项需要较长时间的操作时来反应当前的进度

当操作的进度不断前进时,进度条就用特色颜色填充进度条框。用户可以设定进度条的范围和当前位置。

mfc提供了cprogressctrl类进行支持

cprogressctrl* progressbar = (cprogressctrl*)getdlgitem(idc_progress_1);
 
progressbar->setrange(0, 4);
 
progressbar->setpos(0);

热键控制(hot key)

热键控件看起来就像一个编辑框,但是在热键控件中能够立刻反应用户刚刚按下的键组合,这在设置程序的热键时特别有用。

热键控件只是在“视觉”上显示了按键组合,设置热键的工作还需要用户添加代码完成。

mfc提供了chotkey类进行支持

列表控制(list control)

按一定的排列顺序显示一系列带图标的字符串。

列表控件提供了四种显示模式:大图标(icon)、小图标(small icon)、列表(list)和报表(report)

用户可以向列表控件中添加新的项,也可以控制列表控件的显示模式。

mfc提供了clistctrl类进行支持

初始化:

 struct info { int id; cstring time; cstring type; }info; cstring id; int nrow=0; id.format(_t("%d"), info.id); m_listctrl.insertitem(nrow,id); m_listctrl.setitemtext(nrow, 1, info.time); m_listctrl.setitemtext(nrow, 2, info.type); nrow ++;

添加记录:

 
struct info
 
{
 
int id;
 
cstring time;
 
cstring type;
 
}info;
 
cstring id;
 
int nrow=0;
 
id.format(_t("%d"), info.id);
 
m_listctrl.insertitem(nrow,id);
 
m_listctrl.setitemtext(nrow, 1, info.time);
 
m_listctrl.setitemtext(nrow, 2, info.type);
 
nrow ++;

树形控件(tree control)

显示一系列项目的层次关系最典型的例子是显示磁盘上的文件与文件夹

如果有子项目的话,单击树形控件中的项目可以展开或者收缩其子项目

mfc提供了ctreectrl类进行支持

初始化

   void cconfigdlg::onsize(uint ntype, int cx, int cy) { cdialog::onsize(ntype, cx, cy); // todo: 在此处添加消息处理程序代码  crect rcwnd; getclientrect(&rcwnd);  crect rcchild = rcwnd; rcchild.top = rcwnd.top+10; rcchild.bottom -=10; rcchild.left += 160; rcchild.right -= 10; crect lanerect = rcchild;  if(::iswindow(m_1dlg)) m_1dlg.movewindow(rcchild);  if(::iswindow(m_2dlg)) m_2dlg.movewindow(rcchild);   if ( ::iswindow( ptree.getsafehwnd() ) ) { ptree.movewindow(rcwnd.left+10,rcwnd.top+30,130,350,1); } }

树节点切换

   void cconfigdlg::ontvnselchangedtree(nmhdr *pnmhdr, lresult *presult) { lpnmtreeview pnmtreeview = reinterpret_cast<lpnmtreeview>(pnmhdr); // todo: 在此添加控件通知处理程序代码 htreeitem hselected=pnmtreeview->itemnew.hitem; if(hselected!=null) { ptree.selectitem(hselected); int ndat = ptree.getitemdata(hselected);  switch(ndat) { case 1: /*messagebox(_t("yname"));*/ if(m_pprewnd) m_pprewnd->showwindow(sw_hide);  m_1dlg.showwindow(sw_show); m_pprewnd = &m_1dlg; break; case 3: /*messagebox(_t("xname"));*/ if(m_pprewnd) m_pprewnd->showwindow(sw_hide);  m_2dlg.showwindow(sw_show); m_pprewnd = &m_2dlg; break;  default: break; } } *presult = 0; }

改变位置

   void cconfigdlg::onsize(uint ntype, int cx, int cy) { cdialog::onsize(ntype, cx, cy); // todo: 在此处添加消息处理程序代码  crect rcwnd; getclientrect(&rcwnd);  crect rcchild = rcwnd; rcchild.top = rcwnd.top+10; rcchild.bottom -=10; rcchild.left += 160; rcchild.right -= 10; crect lanerect = rcchild;  if(::iswindow(m_1dlg)) m_1dlg.movewindow(rcchild);  if(::iswindow(m_2dlg)) m_2dlg.movewindow(rcchild);   if ( ::iswindow( ptree.getsafehwnd() ) ) { ptree.movewindow(rcwnd.left+10,rcwnd.top+30,130,350,1); } }

属性表控件(tab control)

包含大量的控件,可以满足用户显示或者获取大量数据分类显示的要求,典型例子是windows任务栏每个程序标签。

每个属性表又分为好几个属性页,这些属性页由各自的标签进行区分,这些属性页中都可以包容其他控件

在显示属性表的时候,一次只能够显示一个属性页的全部内容,同时显示其他属性页的标签,用户通过单击标签打开相应的属性页。

mfc提供了ctabctrl类进行支持

初始化绑定变量

m_tab_light.deleteallitems();
 
m_lightparkingdlg.destroywindow();
 
m_lightstatusdlg.destroywindow();
 
m_tab_light.insertitem(0, _t("0001")); // 插入第一个标签
 
m_tab_light.insertitem(1, _t("0002")); // 插入第二个标签
 
 
crect tabrect; // 标签控件客户区的位置和大小
 
m_tab_light.getclientrect(&tabrect); // 获取标签控件客户区rect
 
// 调整tabrect,使其覆盖范围适合放置标签页
 
tabrect.left += 2;
 
tabrect.right -= 1;
 
tabrect.top += 21;
 
tabrect.bottom -= 2;
 
m_lightparkingdlg.create(idd_dialog_light_parking, &m_tab_light); // 创建第一个标签页
 
m_lightstatusdlg.create(idd_dialog_light_status, &m_tab_light); // 创建第二个标签页
 
//m_lightparkingdlg.initdata();
 
m_lightparkingdlg.setwindowpos(null, tabrect.left, tabrect.top, tabrect.width(), tabrect.height(),swp_showwindow);

控件页面切换

 crect tabrect; // 标签控件客户区的位置和大小
 
m_tab_light.getclientrect(&tabrect); // 获取标签控件客户区rect
 
// 调整tabrect,使其覆盖范围适合放置标签页
 
tabrect.left += 2;
 
tabrect.right -= 1;
 
tabrect.top += 21;
 
tabrect.bottom -= 2;
 
switch (m_tab_light.getcursel())
 
{
 
 
case 0:
 
m_lightstatusdlg.setwindowpos(null, tabrect.left, tabrect.top, tabrect.width(), tabrect.height(), swp_hidewindow);
 
m_lightparkingdlg.setwindowpos(null, tabrect.left, tabrect.top, tabrect.width(), tabrect.height(), swp_showwindow);
 
break;
 
case 1:
 
m_lightparkingdlg.setwindowpos(null, tabrect.left, tabrect.top, tabrect.width(), tabrect.height(), swp_hidewindow);
 
m_lightstatusdlg.setwindowpos(null, tabrect.left, tabrect.top, tabrect.width(), tabrect.height(), swp_showwindow);
 
break;
 
 
}

动画控件(animation):

用来播放一段avi格式的视频剪辑。用户可以控制视频剪辑的播放、停止和定位,但也仅限于这些功能。动画控件设置不能播放音频剪辑,如果用户需要更高层次的视频或者音频的支持,请选用mciwnd控件

mfc提供了canimatectrl类对动画控件进行支持

高级编辑框(rich edit)

编辑控件(edit control)功能的扩展。在高级编辑框中,除了简单的输入和编辑字符串外,用户还可以为字符或段落指定特定的格式,用户甚至还可以向高级编辑框中插入ole项

高级编辑框基本上实现了一个带格式的文本编辑器功能,而只需要用户添加少量的接口。

mfc提供了cricheditctrl类进行支持

日期/时间选择器(date time picker)

向用户提供了一种直观的选择日期和时间的方法、日期/时间选择器在外观上类似于一个组合框,但是当用户单击下拉箭头时就会展开一个日历控件供用户选择,而一旦用户做出了选择,日期/时间选择器会自动显示新的日期/时间。mfc提供了cdatetimectrl类进行支持。

systemtime times_1; //开始时间日期
 
systemtime timee_1; //结束时间日期
 
 
cdatetimectrl* dtpickctrs_1 = (cdatetimectrl*)getdlgitem(idc_datetimepicker_start1); //获取时间控件句柄
 
cdatetimectrl* dtpickctre_1 = (cdatetimectrl*)getdlgitem(idc_datetimepicker_end1);
 
 
memset(×_1,0,sizeof(times_1)); //时钟初始化
 
memset(&timee_1,0,sizeof(timee_1));
 
 
dtpickctrs_1->gettime(×_1); //获取控件所选时间,保存至变量
 
dtpickctre_1->gettime(&timee_1);
 
 
 
cstring strtimestart; //将时间转换为字符串
 
strtimestart.format(_t("%04d-%02d-%02d %02d:%02d:%02d"), times_1.wyear,times_1.wmonth,times_1.wday,times_2.whour,times_2.wminute,times_2.wsecond);
 
cstring strtimeend;
 
strtimeend.format(_t("%04d-%02d-%02d %02d:%02d:%02d"), timee_1.wyear,timee_1.wmonth,timee_1.wday,timee_2.whour,timee_2.wminute,timee_2.wsecond);
 

获取系统时间

systemtime time;
 
::getlocaltime(&time);

日历控件(month calender)

如下图,看似与真正的日历类似,操作也类似,直观的为用户提供了观察和显示当前日期的途径。mfc提供了cmonthcalctrl类进行支持

ip地址控件(ip adress)

ip地址控件用来输入和编辑ip地址mfc提供了cipaddressctrl类进行支持

该控件外观类似于一个编辑框,但是可以自动对输入的字符按3个一组进行区分和加间隔圆点。ip地址控件为开发支持internet技术的程序提供了方便。

扩展组合框(extended combo box)

在普通组合框(combo box)的基础上还支持图像列表

可以在组合框中显示特定的图标表示相应的选择,而不仅仅是显示文本。

mfc提供了ccomboboxex类进行支持

用户自定义控件(custom control)

控件使用的时候,它的class必须有一个类的支持这个窗口类可以vc的类,例如:button、edit.在头文件增加一个cedit类的成员变量:cedit m_text(即点击右键添加变量),然后按照edit控件使用即可。

超链接控件(syslink control ):

1.用于在 mfc 应用程序上添加超链接,就像html中的超链接一样。你点下可以链接到一个网页上去。拖控件到页面上,并绑定一个变量(m_linkctrl),里面的内容全部是按照标准的html中href的用法写的。写错了自然链接不了的。

可以去瞧下html里面的href属性是怎/么设置的.另外要注意的是字符串中双引号的处理(记得加个转义符),添加单击响应消息

m_linkctrl.setwindowtextw(_t("<a href="http://blog.csdn.net/miko_xiaoming">miko's note</a>"));
 
pnmlink pnmlink = (pnmlink) pnmhdr;
 
shellexecutew(null, l"open", pnmlink->item.szurl, null, null, sw_shownormal); //在浏览器中打开

2.同按钮(button)控件一样,响应相应的消息

多按钮组合控件(split button control )

如下图,实现多选按钮选择功能,使用时添加相应菜单

网络ip地址输入输出控件(network address control):

可以直接作为inet_addr(ip)的输入,分隔符为逗号(,)

指令按钮控件(command button control)

不仅可以为按钮添加相应命令还可以对命令做出注解

所有控件的公共属性:

id:控件的资源标识。

visiable:控件是否可见。

disabled:控件是否被禁止、被禁止的控件无法接受键盘和鼠标输入。

group:是否从这个空间开始一个新组。

tab stop:在程序中是否可以用【tab】键切换到这个控件。

help id:是否给控件分配一个帮助标识,帮助标识基于控件本身的资源标识。

client edge:给控件增加一个凹陷的边界,使整个控件看起来像是凹下去的一样。

static edge:给控件增加一个边界。

modal frame:给控件增加一个3维的框架,与client edge相反,它是凸出来的。

transparent:拥有此属性的窗口是透明的,它下面的窗口不会被它遮掩住。

accept files:拥有此属性的窗口可以接收拖放文件,如果一个文件被拖动到这个控件上面,控件会收到wm_dropfiles消息。

no parent notify:表示控件不向其父窗口发送wm_parentnotify消息。

right aligned text:表示文本右对齐。

以上属性可通过控件的属性对话框进行设置,在属性对话框中按【f1】键可以查看属性的帮助信息。

每一种控件都由一个mfc控件类来管理,当通过资源编辑器在对话框上添加一个控件时,visualc++会自动为控件类生成一个实例,即对象,并调用构造函数,当对话框关闭时,其各个子控件对象被自动销毁。

也可以不使用资源编辑器,自己在程序中写代码创建、显示控件并设置控件的属性。

所有的控件类都来自cwnd,控件的某些操作和属性设置需要用到cwnd本身的成员函数,cwnd某些函数经常用来操纵控件和设置控件属性。

setwindowtext:设置控件上要显示的标题文本,即用来设置控件的caption属性

getwindowtext:得到控件的标题文本

enablewindow:设置控件的disabled属性,即社会自控件是否可以接收键盘和鼠标的输入

setwindowpos:改变窗口的大小、位置和z轴次序。

movewindow:改变窗口的大小和位置

getwindowrec:得到窗口的大小、位置(信息存放在一个矩形结构中)。

getclientrect:得到窗口客户区的大小(信息存放在一个矩形结构中 )

showwindow:设置窗口的可见性(即窗口是否可见)

setwindowtext/getwindowtext还可以用来设置/得到对话框的标题文本。