VC中Windows常用控件的创建和使用.docx

上传人:b****3 文档编号:4000524 上传时间:2022-11-27 格式:DOCX 页数:16 大小:25.89KB
下载 相关 举报
VC中Windows常用控件的创建和使用.docx_第1页
第1页 / 共16页
VC中Windows常用控件的创建和使用.docx_第2页
第2页 / 共16页
VC中Windows常用控件的创建和使用.docx_第3页
第3页 / 共16页
VC中Windows常用控件的创建和使用.docx_第4页
第4页 / 共16页
VC中Windows常用控件的创建和使用.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

VC中Windows常用控件的创建和使用.docx

《VC中Windows常用控件的创建和使用.docx》由会员分享,可在线阅读,更多相关《VC中Windows常用控件的创建和使用.docx(16页珍藏版)》请在冰豆网上搜索。

VC中Windows常用控件的创建和使用.docx

VC中Windows常用控件的创建和使用

 

VC中Windows常用控件的创建和使用

2007-08-2010:

23

本文将要介绍的Windows控件指的是Windows系统预定义的标准控件,如按钮控件、编辑控件和列表控件等。

这些预定义控件实际是一种特殊的

子窗口,主要供用户同应用程序的交互之用。

和普通窗口类一样,每一个预定义控件也都是由所属的窗口类规定了自身的外观属性和具有的功能。

Windows

系统通过预定义的方式提供了一些标准控件的窗口类名,在程序设计时只需通过调用CreateWindow()函数或CreateWindowEx()函

数并将预定义的窗口类名作为参数传入即可创建出相应的控件。

当用户通过屏幕对象同控件进行交互操作时,控件将以"通知消息"的形式向父窗口发送

WM_COMMAND通知消息,消息的wParam参数含有控制标识,在lPamam参数的高位字和低位字中分别含有通知码和控制句柄,由父窗口完成对

消息的响应处理。

按钮类控件

按钮类控件是窗口类名被系统预定义为BUTTON的一类控件,该类控件具有十余种不同的窗口风格,包含了普通的下压式按钮、单选按钮、复选按钮和分

组框等多种常用的按钮形式。

具体情况列表如下:

按钮风格说明

BS_AUTOCHECKBOX同复选按钮类似,点击一下选中,再次点击取消。

BS_AUTORADIOBUTTON同单选按钮类似,点击后选中标志将从同组的其他单选按钮处移到当前选项。

BS_AUTO3STATE同三态复选按钮类似,只是在用户点击后改变状态。

BS_CHECKBOX复选按钮

BS_DEFPUSHBUTTON下压按钮,具有较黑的边框。

BS_GROUPBOX分组框

BS_LEFTTEXT同单选按钮或复选按钮配合使用,标题将显示在左侧。

BS_OWNERDRAW可创建一个拥有者自绘按钮。

BS_PUSHBUTTON普通下压按钮

BS_RADIOBUTTON单选按钮

BS_3STATE三态复选按钮

以上按钮风格通常需要同窗口风格共同使用,由CreateWindow()函数或MFC的CButton类成员函数Create()完成对按钮的创

建:

//按钮类窗口风格

DWORDSTYLE[9]={BS_AUTOCHECKBOX,

BS_AUTORADIOBUTTON,

BS_AUTO3STATE,

BS_CHECKBOX,

BS_DEFPUSHBUTTON,

BS_GROUPBOX,

BS_PUSHBUTTON,

BS_RADIOBUTTON,

BS_3STATE};

//动态创建按钮

for(inti=0;i<9;i++)

{

m_ctrButton[i].Create("BUTTON",WS_VISIBLE|WS_CHILD|WS_BORDER|

STYLE[i],CRect(10+110*i,10,100+110*i,40),this,

IDC_BUTTON1+i);

}

如果需要处理按钮发送给其父窗口的消息,可以在进行消息响应的类实现中添加一个如下形式的消息映射入口和相应的消息处理函数:

ON_Notification(id,memberFxn)

其中,id为发送通知消息的按钮ID号,memberFxn为消息处理函数。

如果按钮是以new操作符的方式在堆(heap)内创建一个

CButton对象,那么就必须确保在关闭窗口前能调用delete销毁该对象。

如果CButton对象是在栈上创建的就不必显式销毁对象了,应用程序

在退出时会自动予以销毁。

编辑类控件

以窗口类名"EDIT"创建的编辑类控件是一个可以用来接受用户键盘字符输入的矩形区域,可以在其内进行编辑操作。

该控件是程序接受用户字符输入的

一种主要手段,输入的内容存放在其父窗口容量有限的(32KB)局部堆中。

MFC的CEdit类提供了有关编辑类控件的功能函数。

编辑控件既可以在对话框模板上创建也可以通过代码来直接创建,这两种方式均要通过CEdit

的构造函数来构造一个CEdit对象。

CEdit类从CWnd继承了一些重要的函数,比如可以通过使用CWnd类成员函数

SetWindowText()和GetWindowText()来设定和获取一个编辑控件中的文本。

同按钮类控件类似,如果要处理由编辑控件发送给其

父窗口的通知消息,需要在父窗口类中为每一个待处理消息增添消息映射入口和消息响应函数。

在调用Create()函数创建编辑控件时,Windows系统将发出WM_NCCREATE、WM_NCCALCSIZE、WM_CREATE和

WM_GETMINMAXINFO等消息给编辑控件。

这些消息缺省地分别由

OnNcCreate()、OnNcCalcSize()、OnCreate()和OnGetMinMaxInfo()等CWnd类成员函数进行处理,

可以根据实际需要对其进行重载使用。

作为一种特殊的窗口,编辑控件除了需要指定普通窗口风格外,还可以通过选用不同的控件风格而获取相应的功能效果,可

选用的编辑风格列表如下:

编辑风格说明

ES_AUTOHSCROLL当在行尾添加一个字符后自动向右滚动10个字符。

ES_AUTOVSCROLL当输入回车后自动上滚一行。

ES_CENTER字符居中显示。

ES_LEFT字符左对齐。

ES_LOWERCASE统一转化为小写字母。

ES_MULTILINE允许多行显示。

ES_NOHIDESEL当编辑失去焦点时隐藏对字符的选定,重新获得焦点后以反色显示选中内容。

ES_OEMCONVERT将ANSI字符转化为OEM字符。

ES_PASSWORD以星号显示字符,多用于回显密码。

ES_RIGHT字符右对齐

ES_UPPERCASE统一转化为大写字母。

ES_READONLY设置字符为只读。

ES_WANTRETURN接受回车键输入。

下面给出创建、用编辑控件的示例代码,该示例首先通过Create()函数创建一个控件对象,并通过SetWindowText()函数为其设置字

符。

通过添加对控件通知消息的响应代码可以检测文本是否发生了改变。

程序主要实现清单如下:

//控件的创建部分:

//创建编辑控件

m_ctrEdit.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_WANTRETURN|

ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,CRect(10,50,250,

150),this,ID_EDIT1);

//为控件设置字符

m_ctrEdit.SetWindowText("HelloWorld!

");

......

//添件对控件通知消息的响应

//{{AFX_MSG(CSample02View)

afx_msgvoidOnEnChange();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

......

BEGIN_MESSAGE_MAP(CSample02View,CView)

//{{AFX_MSG_MAP(CSample02View)

ON_EN_CHANGE(ID_EDIT1,OnEnChange)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

......

voidCSample02View:

:

OnEnChange()

{

//通知消息响应代码

AfxMessageBox("内容已改变!

");

}

列表框与组合框

列表框是窗口类名为"ListBox"的预定义子窗口,在窗口矩形内包含有一些可以滚动显示的栏状字符串列表。

标准的列表框只能允许选中一个条目,

选中的条目将以系统颜色COLOR_HIGHLIGHT高亮显示。

Windows还提供了多种不同风格的标准列表框,其中包括多选列表框、多列显示的列

表框和可以显示图象的拥有者画(Owner-draw)列表框等。

另一种与列表框相关的控件是组合框,该控件预定义类名为"COMBOBOX",实际是

一个编辑控件同一个彼此相关的列表框控件的组合。

用户既可以在组合框的编辑栏上直接输入、编辑文字也可以从下拉列表中显示的可能选择中进行选取。

MFC的CListBox类封装了列表框控件,由成员函数Create()完成对列表框的创建,在创建的同时指定了控件的窗口风格。

当列表框中的

条目被选中或被鼠标双击后将向父窗口发送WM_COMMAND消息。

如果列表框采用了LBS_NOTIFY风格,父窗口就可以通过ON_LBN消息映射

宏直接将通知消息同消息处理函数建立起映射关系。

列表框提供了十余种窗口风格,现将列表框风格及说明列表如下:

列表框风格说明

LBS_STANDARD创建一个具有边界和垂直滚动条、当选择发生变化或条目被双击时能够通知父窗口的标准列表框。

所有条目按字母排序。

LBS_SORT按字母排序。

LBS_NOSEL条目可视但不可选。

LBS_NOTIFY当用户选择或双击一个串时,发出消息通知父窗口。

LBS_DISABLENOSCROLL在条目不多时依然显示并不起作用的滚动条。

LBS_MULTIPLESEL允许条目多选。

LBS_EXTENDEDSEL可用SHIFT和鼠标或指定键组合来选择多个条目。

LBS_MULTICOLUMN允许多列显示。

LBS_OWNERDRAWVARIABLE创建一个拥有者画列表框,条目高度可以不同。

LBS_OWNERDRAWFIXED创建一个具有相同条目高度的拥有者画列表框。

LBS_USETABSTOPS允许使用TAB制表符。

LBS_NOREDRAW当条目被增删后不自动更新列表显示。

LBS_HASSTRINGS记忆了添加到列表中的字串。

LBS_WANTKEYBOARDINPUT当有键按下时向父窗口发送WM_VKEYTOITEM或WM_CHARTOITEM消息。

LBS_NOINTEGRALHEIGHT按程序设定尺寸创建列表框。

缺省的,列表框在每添加或删除一个条目后都会自动重绘,如果在列表框中已经有了几百条甚至上千条条目,将会因为重绘而引起比较严重的闪烁。

可以通过

使用LBS_NOREDRAW风格来禁止列表框的自动重绘。

在需要更新显示时强制重绘列表框窗口即可。

如果在创建时未使用LBS_NOREDRAW风

格,可以在增删条目前向列表框发送WM_SETREDRAW消息,指定其不重绘,增添完毕后再次发送WM_SETREDRAW消息重新启用自动重绘风

格。

示例过程如下:

CListBoxm_ctrListBox;

//禁止自动重绘

m_ctrListBox.SendMessage(WM_SETREDRAW,FALSE,0);

//进行条目增删操作

......

//允许自动重绘

m_ctrListBox.SendMessage(WM_SETREDRAW,TRUE,0);

列表框创建之初是不含任何条目的,通过CListBox成员函数AddString()和InsertString()向列表框增添或插入条目。

果列表框具有LBS_SORT风格,那么新添加字串的位置是不固定的,要根据字串的字母进行排序;如果不具有该风格,新字串将添加到列表框的末尾。

如果有必要,可以使用SetItemDataPtr()或SetItemData()将一个32位的指针(或一个DWORD的值)同列表框中的一个

条目联系起来,并且在设置后可以通过调用GetItemDataPtr()或GetItemData()而获取。

这样做的目的是可以将列表框中的条目同

外部数据建立联系。

例如:

可以用这种方式非常方便地将一个包含有地址、电话号码和E-mail地址等信息的数据结构同列举在列表框中的持有人建立起关

联。

当从列表框中选中某个人时,可以同时得到有关该人的通讯信息。

当操作列表框时,将会通过WM_COMMAND消息发送通知给父窗口,消息参数lParam的高字节包含了通知码标识符。

在MFC应用程序中,列表

框的通知消息通过ON_LBN消息映射宏而映射到类成员函数。

下表给出了列表框的几个通知消息以及相应的ON_LBN宏。

中,LBN_DBLCLK,LBN_SELCHANGE和LBN_SELCANCEL通知消息只有在列表框使用了LBS_NOTIFY或

LBS_STANDARD风格时才会被发出,其他通知消息则无此限制。

通知码标识符ON_LBN宏值含义

LBN_SETFOCUSON_LBN_SETFOCUS4列表框接收到输入焦点

LBN_KILLFOCUSON_LBN_KILLFOCUS5列表框接失去输入焦点

LBN_ERRSPACEON_LBN_ERRSPACE-2列表框存储溢出

LBN_DBLCLKON_LBN_DBLCLK2双击条目

LBN_SELCHANGEON_LBN_SELCHANGE1改变选择

LBN_SELCANCELON_LBN_SELCANCEL3取消选择

其中,最经常使用的两个通知消息是LBN_DBLCLK和LBN_SELCHANGE。

对于不可复选的列表框可以通过GetCurSel()来获取

当前双击的是列表框条目的索引值;对于允许多选的列表框则需要用GetCaretIndex()来代替GetCurSel()。

下面通过一段示例代码对

列表控件的使用做一个直观的演示:

//创建并初始化列表框

//创建列表框

m_ctrListBox.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|

LBS_STANDARD,CRect(270,50,370,150),this,IDC_LIST1);

//添加条目

CStringItem[9]={"Item1","Item2","Item3","Item4","Item5",

"Item6","Item7","Item8","Item9"};

for(inti=0;i<9;i++)

m_ctrListBox.AddString(Item[i]);

//选中第4个条目

m_ctrListBox.SetCurSel(3);

......

//父窗口对通知消息的处理函数的声明(在头文件中)

//{{AFX_MSG(CSample02View)

afx_msgvoidOnLbnDblClk();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

......

//父窗口对通知消息的映射入口(在实现文件中)

BEGIN_MESSAGE_MAP(CSample02View,CView)

//{{AFX_MSG_MAP(CSample02View)

ON_LBN_DBLCLK(IDC_LIST1,OnLbnDblClk)

//}}AFX_MSG_MAP

//Standardprintingcommands

END_MESSAGE_MAP()

......

//父窗口对LBN_DBLCLK通知消息的处理

voidCSample02View:

:

OnLbnDblClk()

{

//得到当前选中条目的索引

intIndex=m_ctrListBox.GetCurSel();

//得到此条目的内容

charText[20];

m_ctrListBox.GetText(Index,Text);

//以信息框报告得到的内容

AfxMessageBox(CString(Text));

}

虽然组合框实际是列表框和编辑框的组合,但在使用中的表现使得组合框同其他控件一样当作一个独立的控件去使用。

MFC的CComboBox类提供了

对组合框的功能支持。

在使用Create()函数创建组合框时可以同时指定组合框的风格(参见下表)。

窗口风格说明

CBS_AUTOHSCROLL当在行尾输入字符时自动将编辑框中的文字向右滚动。

CBS_DROPDOWN同CBS_SIMPLE风格类似,只是只有在用户点击下拉图标时才会显示出下拉列表。

CBS_DROPDOWNLIST同CBS_DROPDOWN类似,只是显示当前选项的编辑框为一静态框所代替。

CBS_HASSTRINGS创建一个包含了由字串组成的项目的拥有者画组合框。

CBS_OEMCONVERT将组合框中的ANSI字串转化为OEM字符。

CBS_OWNERDRAWFIXED由下拉列表框的拥有者负责对内容的绘制;列表框中各项目高度相同。

CBS_OWNERDRAWVARIABLE由下拉列表框的拥有者负责对内容的绘制;列表框中各项目高度可以不同。

CBS_SIMPLE下拉列表始终显示。

CBS_SORT自动对下拉列表中的项目进行排序。

CBS_DISABLENOSCROLL当下拉列表显示内容过少时显示垂直滚动条。

CBS_NOINTEGRALHEIGHT在创建控件时以指定的大小来精确设定组合框尺寸。

对组合框进行操作也会向父窗口发送通知消息,处理过程同前面几种控件大同小异,是通过ON_CBN消息映射宏完成对通知消息的映射的。

下面就给出这

些ON_CBN宏的详细说明:

ON_CBN宏对应事件

ON_CBN_CLOSEUP关闭下拉列表。

ON_CBN_DBLCLK双击下拉列表中的项目。

ON_CBN_DROPDOWN下拉显示列表框。

ON_CBN_EDITCHANGE编辑框中文本内容被改动。

ON_CBN_EDITUPDATE编辑框内容更新显示。

ON_CBN_ERRSPACE组合框不能为某个特殊请求分配足够的内存。

ON_CBN_SELENDCANCEL用户的选择被取消。

ON_CBN_SELENDOK用户选择了一个项目并且通过回车键或按下鼠标而隐藏组合框的下拉列表。

ON_CBN_KILLFOCUS组合框失去焦点。

ON_CBN_SELCHANGE选择发生变化。

ON_CBN_SETFOCUS组合框获得输入焦点。

最后给出一段有关组合框的示例代码,从代码实现不难看出组合框控件同前面给出的列表控件在编程实现上的相似性。

//组合框的创建

//创建列表控件

m_ctrComboBox.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|CBS_DROPDOWN,

CRect(400,50,470,150),this,IDC_COMBOX1);

//添加条目

CStringItem[9]={"Item1","Item2","Item3","Item4","Item5",

"Item6","Item7","Item8","Item9"};

for(inti=0;i<9;i++)

m_ctrComboBox.AddString(Item[i]);

//选中第4个条目

m_ctrComboBox.SetCurSel(3);

......

//通知消息响应函数的声明(在头文件中)

//{{AFX_MSG(CSample02View)

afx_msgvoidOnCbnSelChange();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

......

//对通知消息的响应处理(在实现文件中)

BEGIN_MESSAGE_MAP(CSample02View,CView)

//{{AFX_MSG_MAP(CSample02View)

ON_CBN_SELCHANGE(IDC_COMBOX1,OnCbnSelChange)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

......

voidCSample02View:

:

OnCbnSelChange()

{

//得到当前选中条目的索引

intIndex=m_ctrComboBox.GetCurSel();

//得到此条目的内容

charText[20];

m_ctrComboBox.GetLBText(Index,Text);

//以信息框报告得到的内容

AfxMessageBox(CString(Text));

}

树形控件

树形控件是一种可以分级显示项目列表的窗口,其所含项目以相互关联的方式显示在控件中,通过点击位于某个层次的项目节点可以展开下一层次中从属于该

节点的所有项目。

树形控件非常适合于管理那些层次较多且相互间隶属关系较为清晰的项目元素。

在MFC中,由CTreeCtrl类提供了对树形控件的功能

支持。

在用Create()创建了一个树形控件后可以用SetImageList()函数为其设置一个图象列表,这样就可以在树形控件中为各个层次的项目

设置图标。

通过InsertItem()函数可以为其添加数据项,返回的HTREEITEM类型的句柄唯一标识了此添加的项目。

该句柄应当妥善保管,只

有通过该句柄才能为此项目继续添加子项目。

如果在创建子窗口时指定父窗口句柄为NULL,则将直接在根目录创建项目。

下面这段代码将通过上述函数创建一

个树形控件并向其添加二个层次的项目:

//创建一个树形控件

m_ctrTreeCtrl.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|

TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS|TVS_EDITLABELS,

CRect(500,50,670,200),this,IDC_TREE1);

......

TV_ITEMtvItem;

TV_INSERTSTRUCTtvInsert;

tvItem.mask=TVIF_TEXT;//指定pszText成员可用

tvItem.pszText="Item0";//根项目显示的字符

tvInsert.hParent=TVI_ROOT;//指定父句柄

tvInsert.item=tvItem;//指定TV_ITEM结构对象

tvInsert.hInsertAfter=TVI_LAST;//项目插入方式

//创建根项目,当前项目句柄保存于hItem0中

HTREEITEMhItem0=m_ctrTreeCtrl.InsertItem(&tvInsert);

......

//在根项目下继续创建第二层项目

tvItem.mask=TVIF_TEXT;

tvItem.pszTe

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1