没有合适的资源?快使用搜索试试~ 我知道了~
首页c++界面编程(界面设计必备)
资源详情
资源评论
资源推荐

VC 中 Windows 常用控件的创建和使用
本文将要介绍的 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()完成对按钮的创建:
// 按钮类窗口风格
DWORD STYLE[9] = {BS_AUTOCHECKBOX,
BS_AUTORADIOBUTTON,

BS_AUTO3STATE,
BS_CHECKBOX,
BS_DEFPUSHBUTTON,
BS_GROUPBOX,
BS_PUSHBUTTON,
BS_RADIOBUTTON,
BS_3STATE};
// 动态创建按钮
for (int i = 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("Hello World!");
……
// 添件对控件通知消息的响应
//{{AFX_MSG(CSample02View)
afx_msg void OnEnChange();
//}}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()
……
void CSample02View::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 消息重
新启用自动重绘风格。示例过程如下:
CListBox m_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 宏 值 含义
剩余63页未读,继续阅读














安全验证
文档复制为VIP权益,开通VIP直接复制

评论3