没有幻灯片标题
*
面向对象与可视化
程序设计
–Visual C++ 编程
主讲教师:
娄 磊
南京工业职业技术学院
2019年10月
第4章 GDI及Windows绘图
第4章 GDI及Windows绘图
*
Huang Weitong
*
Huang Weitong
*
*
第十四章
按钮类与列表框类及其应用
第4章 GDI及Windows绘图
第5章 文本与字体
*
Huang Weitong
*
Huang Weitong
*
*
内容提要
按钮控件及其方法
列表框控件及其方法
按钮控件的应用
列表框控件的应用
*
*
§14.1.
按钮控件
第4章 GDI及Windows绘图
第5章 文本与字体
*
Huang Weitong
*
Huang Weitong
*
1. 常见的按钮控件
复选框(Checkboxes)
常用于只有两种完全相反状态的情况下
单选按钮(Radiobuttons)
适用于同一组属性相同的数据中选一个数据
下压式按钮(Pushbuttons)
适用于消息的发送
分组框(Group boxes)
没有太多的操作只是在窗口中划分区域范围
第4章 GDI及Windows绘图
第5章 文本与字体
*
Huang Weitong
*
Huang Weitong
*
2.Cbutton类和CBitmapButton类
Cbutton类是CWnd类直接派生的。
CBitmapButton类又是Cbutton类直接派生的。
在AfxWin.h中定义了Cbutton类。
第4章 GDI及Windows绘图
第5章 文本与字体
*
Huang Weitong
*
Huang Weitong
*
*
3. Cbutton类样式和方法
按钮不仅继承了一般的窗口式样,还可用winuser.h中所定义的按钮特有的式样。
Cbutton类提供一些很有用的方法。
*
*
3. Cbutton类样式和方法
*
*
*
*
4.CBitmapButton类的方法
LoadBitmaps()为CBitmapButton对象附上位图,最多可有4个位图,这些位图从资源文件中读取;
AutoLoad()将对话框按钮和CBitmapButton()对象联系起来;
SizeToContent() 用于调整位图的尺寸大小。
DrawItem()自动在一个按钮的用户区上画上位图,即用户可以自定义按钮。
*
*
§14.2.
列表框控件
第4章 GDI及Windows绘图
第5章 文本与字体
*
Huang Weitong
*
Huang Weitong
*
*
1. 列表框的用处
常用于从众多数据中选某一项,如在对话框里,用列表框选择文件名、目录等。
有预定义的键盘接口,实现交互操作。
可用盘上的方向(箭头)键和PageUp或PageDown键,在列表框中进行数据的选择;
设置适当的样式后,可与Shift或Ctrl键组合用。
*
*
2. CListBox类及其样式
CListBox类是CWnd类派生。
CListBox类控件有多种可用的样式。
MFC中CListBox类的层次结构
*
*
*
*
消息映像项使用下面的基本格式:
ON_Message(Control ID,ClassMethod)
所有者类声明中的方法原型
afx_msg void ClassMethod();
发送消息的列表框
控件的子窗口标识
处理消息的父
类方法的名字
*
*
3. CListBox类的方法
通用方法
单项选择特定方法
多项选择特定方法
字符串指定的方法
虚拟方法
*
*
(1) 通用方法
通用方法用来获得和设置列表框数据的值和属性,
所有的CListBox列表框,包括单选列表框、多选列表框和自绘列表框等都有这些方法。
*
*
(2) 单项选择特定方法
列表框的默认模式是单选项模式;
所有的通用方法均适用于单选项列表框。
只有两个类方法专门处理单选项列表框
GetCurSel()获得当前选择列表框项的下标(基于0)
SetCurSel()选择列表框字符串。
*
*
特定多项选择列表框的CListBox类方法
GetAnchorIndex() 获取当前定位项的下标
GetCaretIndex() 获取具有光标矩形的项的下标
GetSelCount() 获取当前所选的项的数目
GetSelItems() 将所有当前被选项下标放入一整型数组缓冲区
SelItemRange() 切换多选择列表框项范围的选择状态
SetAnchorIndex() 在框中扩充选择设置开始(定位)项
SetCaretIndex() 在框中指定下标项设置光标矩形
SetSel() 在框中切换项目的选择状态
(3) 多项选择特定方法
扩展了标准单选列表框
的能力,解决了在一个
列表框中选择多项带来
的复杂性
*
*
(4) 字符串指定的方法
CListBox指定列表框中字符串的方法
AddString() 加入一个字符串
DeleteString() 删除一个字符串
Dir() 从当前目录加文件名放入列表框
FindString() 搜索一字符串
FindStringExact() 搜索第一个与指定字符串匹配的字符串
InsertString() 在指定下标处插入一字符串
ResetContent() 清除列表框中的所有项
SelectString() 在单选列表框中搜索并选择一字符串
*
*
(5) 虚拟方法
CListBox类还声明了几个虚拟方法,可从CListBox类中派生一些类替换到你的类中。
能被替换的ClistBox类的虚拟方法
CharToItem() 为自绘列表框(没有字符串)处理WM-CHAR
CompareItem() 取得到排序的自绘列表框中新项的位置
DeleteItem() 从自绘列表框中删除一项时
DrawItem() 必要时,重绘时自绘列表框项
MeasureItem() 创建一自绘列表框时,决定列表框的维数
VKeyToItem() 处理具有LBS_WANTKEYBOARDINPUT样式
的列表框的WM_KEYDOWN
*
*
4. 创建和初始化CListBox对象
构造函数CListBox::CListBox()和关键字new为CListBox对象分配一个实例;并返回指向该对象的指针:
ClistBox *pMyListBox = new CListBox;
CListBox::Create()初始化指针pMyListBox。初始化CListBox对象并赋于它一个Windows列表框, 设置其参数和样式。
*
*
4. 创建和初始化CListBox对象
CListBox::Create() 声明如下:
BOOL Create
(
DWORD dwStyle, //列表框控件的窗口样式
const Recy& rect,//控件的大小和位置矩形
CWnd* pParentWnd,//指向控件所有者的指针
UINT nID //父窗口标识
);
*
*
§14.3.
按钮控件及列表框控件的应用
第4章 GDI及Windows绘图
第5章 文本与字体
*
Huang Weitong
*
Huang Weitong
*
*
[课程设计]交互界面具有三个分组框,分组框含有按钮和列表框。
*
*
1.应用程序的可视化编程
同一组单选按钮
必须一个接一个
地放进对话框中
中间不能中断
单选按钮组的ID都为IDC_STATIC,说明不同的控件可以有相同的ID。因为单选按钮组只是用来显示一组内容的属性,无具体操作
#define IDC_Age1_RADIO 1015
#define IDC_Age2_RADIO 1016
#define IDC_Age3_RADIO 1017
#define IDC_Boy_RADIO 1023
#define IDC_Girl_RADIO 1024
对于成组的单选按钮,只在每组的第一个按钮的属性窗口中选中Group
*
*
2.应用程序的代码编程部分
*
*
3. 给有关按钮、编辑框等控件连接方法
*
*
4.为复选框IDC_TIME_CHECK添加代码
void CSELECTBOXDlg::OnTimeCheck()
{ UpdateData(TRUE);
if(m_TimeCheck==TRUE)
{ CTime tNow;
tNow=CTime::GetCurrentTime();
CString sNow=tNow.Format(“%H:%M:%S”);
m_TimeEdit.SetSel(0,-1);
m_TimeEdit.ReplaceSel(sNow);
}
else
{ m_TimeEdit.SetSel(0,-1);
m_TimeEdit.ReplaceSel(“”);
}
UpdateData(FALSE);
}
%I是小时的表示法(01到12)
%m是分的表示法(00到59)
%d是秒的表示法(00到59)
*
*
5.给Enable按钮添加代码
void CSELECTBOXDlg::OnEnableButton()
{
GetDlgItem(IDC_DATE_CHECK)->EnableWindow(TRUE);
GetDlgItem(IDC_TIME_CHECK)->EnableWindow(TRUE);
m_DateEdit.EnableWindow(TRUE);
m_TimeEdit.EnableWindow(TRUE);
}
*
*
6.为Disable按钮连接代码
void CSELECTBOXDlg::OnDisableButton()
{
GetDlgItem(IDC_DATE_CHECK)->EnableWindow(FALSE);
GetDlgItem(IDC_TIME_CHECK)->EnableWindow(FALSE);
m_DateEdit.EnableWindow(FALSE);
m_TimeEdit.EnableWindow(FALSE);
}
*
*
7.为Show Again按钮添加代码
void CSELECTBOXDlg::OnShowButton()
{
GetDlgItem(IDC_DATE_CHECK)->EnableWindow(SW_SHOW);
GetDlgItem(IDC_TIME_CHECK)->EnableWindow(SW_SHOW);
GetDlgItem(IDC_DATE_EDIT)->EnableWindow(SW_SHOW);
m_DateEdit.ShowWindow(SW_SHOW);
GetDlgItem(IDC_TIME_EDIT)->EnableWindow(SW_SHOW);
m_TimeEdit.ShowWindow(SW_SHOW);
}
*
*
(第十四章)
完
*
*
第13-14章课后练习题
编写一个程序,用含有按钮和滚动条等控件的三个分组框,实现功能包括:
控制显示日期和时间;
选择加或减运算,并显示数据;
滚动条输入数据;
[注]5月28日前完成
CButton
类中按钮特有的样式
样式宏
说明
BS_3STATE
此样式为复选框,但是方框可以被选中,也可以变暗
(
表明复选框无效
)
BS_AUTO3STATE
此样式为复选框,但是方框可以被选中,也可以变暗
(
表明复选框无
效
)
,当用户选择方框时,它的选中状态会自动转换
BS_AUTOCHECKBOX
此样式为复选框,当用户选择方框时,它的选中状态会自动转换
BS_AUTORIDIOBUTTON
此样式为单选按钮,当用户选中圆圈时,按钮自动显示自己被选中的
状态,同时使其它具有相同样式的同组的单选按钮处于未被选中的状
态
BS_CHECKBOX
创建一个复选框,默认情况下它的右边有标题,当与
BS_LEFTTEXT
一起使用时,标题在左边
BS_DEFPUSHBUTTON
创建一个下式按钮
BS_GROUPBOX
创建一个带标题的急性分组框
BE_LEFTTEXT
当和一个单选按钮或复选按钮一起使用时,使得按钮文字出现在按钮
的左边
BS_OWNERDRAW
创建自定义按钮,当按钮视觉被改变时,
MFC
自动调用
DrawItem()
方法,在使用
CBitmapButton
类时,这种样式必须被指定
BS_PUSHBUTTON
创建一个下压式按钮,用户单击此按钮时,向系统发送
WM_COMMAND
消息
BS_RADIOBUTTON
创建单选按钮
表
14-2
Àà
CButton
µÄ·½·¨
·½·¨
˵Ã÷
G
etBitmap()
»ñµÃÓÃ
SetBitmap()
ÉèÖõÄλͼµÄ¾ä±ú
GetButtonStyle()
»ñµÃÓйذ´Å¥¿Ø¼þÑùʽµÄÐÅÏ¢
GetCheck()
»ñµÃ°´Å¥¿Ø¼þÑ¡ÖеÄ״̬
GetCursor()
»ñµÃͨ¹ý
SetCursor()
ÉèÖõĹâ±êͼÏñµÄ¾ä±ú
GetIcon()
»ñµÃÓÉ
SetIcon()
ͼ±ê¾ä±ú
GetState()
»ñµÃ°´Å¥¿Ø¼þµÄÑ¡ÖС¢Ñ¡ÔñºÍ¾Û½¹×´Ì¬
SetBitmap()
Ö¸¶¨°´Å¥ÉÏÏÔʾµÄλͼ
SetButtonStyle()
¸Ä±ä°´Å¥Ñùʽ
SetCheck()
ÉèÖð´Å¥¿Ø¼þµÄÑ¡ÖÐ״̬
SetCursor()
Ö¸¶¨°´Å¥¿Ø¼þÉϵĹâ±êͼÏñ
SetIcon()
Ö¸¶¨°´Å¥ÉÏÏÔʾµÄͼ±ê
SetState()
ÉèÖð´Å¥¿Ø¼þµÄÑ¡Ôñ״̬
CListBox()
控件可用的样式
样式
说明
LBS_DISABLENOSCROLL
当列表框不需要滚动条时,时滚动条无效
LBS_EXTENDSEL
允许使用鼠标及特殊键组合进行多项选择
LBS_HASSTRINGS
指明自绘的列表框,其中包括字符串选项
LBS_MULTICOLUMN
指明一个多列列表框,它含有一个水平滚动条,
可以用
SetColumnWidth()
方法设置列的宽度
LBS_MULTIPLESEL
用户通过单击或双击一项进行选择或取消选择
LBS_NOINTEGRALHEIGHT
将列表框设置为创建时指定的大小
LBS_NOREDRAW
列表框在变化时不重绘,用户可以在任何时候
发送
WM_SETREDRAW
消息改变这种模式
LBS_NOSEL
指明列表框包含只能看不能选择的项
LBS_NOTIFY
当用户单击或双击时向父窗口发送消息
LBS_OWNERDRAWFIXED
指明列表框的所有者负责填写列表项,且列表
框具有相同的高度
LBS_OWNERDRAWVARIABLE
指明列表框的所有者负责填写列表项,且列表
框可以不同高
LBS_SORT
列表项按字母顺序排列
LBS_STANDARD
此样式是
LBS_NOTIFY
、
LBS_SORT
、
WS_VSCROLL
和
WS_BORDER
的组合
LBS_USETABSTOPS
告知列表框在加入字符串列表项时加入
tab
字
符
LBS_WANTKEYBOARDINPUT
允许应用程序通过发送
WM_VKEYTOITEM
和
WM_CHARTOITEM
消息给列表框的所有者来处理
键盘输入
CListBox
消息的消息映像项
消息映像项
说明
ON_LBN_DBLCLK
当用户双击选项时具有
LBS_NOTIFY
样式的列表框向所有者发送此消息
ON_LBN_ERRSPACE
列表框不能分配足够内存以满足要求
ON_LBN_KILLFOCUS
当列表框失去输入焦点时出现此消息
ON_LBN_SELCANCEL
当取消当前列表框选择时,具有
LBS_NOTIFY
样式的列表框向所有者发
送此消息
ON_LBN_SELCHANGE
当列表框中的选择改变时,具有
LBS_NOTIFY
样式的列表框向它的父窗
口
发送此通知。如果选择是用
CListBox
::
SetCurSel
()类方法改变的,
则不发送通知。对多项选择列表框来说,当用户按箭头键时,即使选择
不变也发送此通知
通用
CListBox
类方法
方法
描述
GetCount()
获得列表框中列表项数目
GetHorizontalExtent
()
获得列表框的水平滚动宽度
(
按像素
)
GetItemData()
获得列表框项有关的
32
位值
GetItemDataPtr()
获得指向列表框项的指针
GetItemHeight()
获得列表框中项的高度
¿Ø¼þ¼°ÆäÁ¬½ÓµÄ±äÁ¿
ID
±äÁ¿Ãû
ÀàÐÍ
IDC_DATE_CHECK
m_DateCheck
B
OOL
IDC_TIME_CHECK
m_TimeCheck
B
OOL
IDC_DATE_EDIT
m_DateEdit
CEdit
IDC_TIME_EDIT
m_TimeEdit
CEdit
IDC_
Boy
_
RADIO
m_
SexRadio
C
Button
IDC
_
Age1_RADIO
m_
AgeRadio
C
B
utton
IDC_
Result_EDIT
m_
ResultEdit
C
Edit
IDC_
ENGLISH_RADIO
m_
English
int
IDC_COMBO_EDIT
m_ComboEdit
CString
IDC_RECORD_COMBO
m_Record
CComboBox
IDC_SHOW_COMBO_BUTTON
m_Combo_Button
CButton
¿Ø¼þµÄÁ¬½Ó·½·¨
ID
·½·¨
IDC_DATE_CHECK
OnDateCheck()
IDC_TIME_CHECK
OnTimeCheck()
IDC_ENABLE_BUTTON
OnEnableButton()
IDC_DISABLE_BUTTON
OnDisableButton()
IDC_SHOW_BUTTON
OnShowButton()
IDC_HIDE_BUTTON
OnHideButton()
IDC_Show_Sex_Age_BUTTON
OnShowSexAgeButton()
IDC_SHOW_COMBO_BUTTON
OnShowComboButton()
IED_EXIT_BUTTON
OnExitButton()