mfc控件总览
1。mfc单文档结构
2。添加 左击鼠标,按下键盘事件
3。消息:窗口消息,控件的通知消息,命令消息
第5章对话框和常用控件
5.1 对话框的使用
5.2 控件的创建和使用方法
5.3 常用控件
5.4 通用对话框和消息对话框
5.1对话框的使用
5.1.1模式和无模式对话框
Ø 模式对话框
u 指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
u 无模式对话框
u 指当对话框被弹出后,一直保留在屏幕上,可继续在对话框所在的应用程序中进行其它操作;需要使用对话框时,单击对话框所在的区域即可激活。
在创建和退出对话框窗口时的方式不同:
u 创建时,模式对话框由系统自动分配内存空间,对话框退出时,对话框对象自动删除。无模式对话框需要来指定内存,退出时还需删除对话框对象。
u 退出时,两种对话框所使用的终止函数不一样。模式对话框通过调用CDialog:: EndDialog来终止,无模式对话框则是调用CWnd::DestroyWindow来终止。
u 函数CDiaolog::OnOK和CDiaolog::OnCancel是调用EndDialog的,因此无模式对话框必须用DestroyWindow来重载OnOK 和OnCancel两个函数。
u 需要正确删除
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示对话框的对象。对模式对话框,在创建函数返回后即可删除对象。无模式对话框不是同步的,在创建函数调用后立即返回,因而不知道何时删除对象,但可以通过重载CWnd::PostNcDestroy函数并执行清除操作。
5.1对话框的使用
5.1.2使用对话框编辑器
Ø 打开对话框编辑器
将项目工作区窗口切换到ResourceView页面,双击Dialog目录下任意一个对话框ID。或者,选择“Insert”à“Resource”菜单命令(或按快捷键Ctrl+R),选择Dialog项,单击New。
5.1对话框的使用
在对话框中添加和编辑控件
(1)控件添加的方法
在对话框中添加一个控件的方法有下列几种:
u 在控件工具栏中单击某控件,鼠标箭头在对话框内变成“十”字形状;在对话框指定位置单击鼠标左键,再拖动选择框可改变控件的大小和位置。
u 在控件工具栏中单击某控件,鼠标箭头对话框内变成“十”字形状;在指定位置处单击鼠标左键不放,拖动鼠标至满意位置,释放鼠标键。
u 用鼠标左键点中控件工具栏中的某控件,并按住鼠标键不放;在移动鼠标到对话框的指定位置的过程中,会看到一个虚线框,下面带有该控件的标记;释放鼠标键。
5.1对话框的使用
(2)单个控件的选取
Ø鼠标选取
保证选择按钮( )是被选中的,移动鼠标指针至指定的控件上,单击鼠标左键。
Ø助记符选取
在相应的控件上右击。选择“Properties”菜单项,对话框中的“Caption”框是用来输入控件的标
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,在标题中的某个字母之前键入“&”符号,则该字母就是此控件的助记符。
ØTab键选取
利用Tab键,可在对话框内的控件中进行选择。每按一次Tab键依次选取对话框中的下一个控件,若按住Shift键,再单击Tab键则选取上一个控件。
(3)多个控件的选取
u在对话框内按住鼠标左键不放,拖出一个大的虚框,释放鼠标,则被该虚框所包围的控件都将被选取。
u先按住Shift键不放,用鼠标选取控件,直到所需要的多个控件选取之后再释放Shift键。若在选取时,对已选取的控件再选取一下,则该控件取消选取。
u一旦单个控件被选取后,其四周由选择框包围着,选择框上还有几个(通常是八个)蓝色实心小方块,拖动它可改变控件的大小,如图。
u多个控件被选取后,其中只有一个控件的选择框有几个蓝色实心小方块,这个控件称为主要控件,而其他控件的选择框的小方块是空心的。如图。
5.1对话框的使用
(4)控件的移动、删除和复制
当单个控件或多个控件被选取后,按方向键或用鼠标拖动控件的选择框可移动控件。若在鼠标拖动过程中还按住Ctrl键则复制控件。若按Del键可将选取的控件删除。
(5)设定控件的Tab键次序
一是改变用Tab键选择控件的次序,二是当两个或两个以上的控件构成一组时,需要它们的Tab键次序连续。
对话框内控件的Tab键次序设定步骤如下:
u 首先,选择“Layout”à“Tab Order”命令,或按Ctrl+D,此时每个控件的左上方都有一个数字,表明了当前Tab键次序,如图。
u 其次,按新的次序依次用鼠标单击各个控件,新的Tab键即可生成。
u 最后,单击对话框或按Enter键结束Tab Order 方式。
5.1对话框的使用
对话框内的控件的布局
5.1对话框的使用
u 大多布置控件的命令使用前,需要选取多个控件,且“主要控件”起到了关键作用。多个控件的布置过程中,常需要重新设置“主要控件”。设置的方法是按住Ctrl或Shift键,用鼠标单击所要指定的控件。
u 系统提供了网格、标尺等辅助工具。在图5.5的控件布局工具栏的最后两个按钮分别用来网格和标尺的切换。一旦网格显示,添加或移动控件时都将自动定位在网格线上。“Layout”菜单下的“Guide Settings”命令提供了设置网格单元大小的功能,如图。
Ø 测试对话框
5.1对话框的使用
5.1.3对话框的编程
Ø 添加对话框资源
选择“Insert”à“Resource”菜单命令(或按Ctrl+R),若单击Dialog项左边的“+”号,将展开对话框资源的不同类型选项,如图。
5.1对话框的使用
Ø 改变对话框的属性
在对话框模板的非控件的区域内左击,用下列方式之一打开属性对话框:
u 选择“View”菜单à“Properties”命令或按Alt+Enter健。
u 用鼠标右击对话框模板,选取Properties命令。
如图,General是对话框属性的默认显示页面,其中列有对话框的标识符名称框、标题框等,具体说明如表。
5.1对话框的使用
Ø 向对话框内添加控件
Ø 添加一个类 :注意:以字母c开头
在对话框模板的非控件的区域内双击,如图的对话框。
单击[OK],弹出如图的对话框。可以为对话框资源定义一个新类名c123。
5.1对话框的使用
Ø 消息映射 首先添加“按钮”
单击[OK]按钮,出现“MFC ClassWizard”对话框,如图。
5.1对话框的使用
选定IDC_BUTTON1的BN_CLICKED,双击左键或单击[Add Function]按钮,如图。
对话框中,可以为添加的成员函数名重新定义,单击[OK]。选定成员函数OnButton1项,双击左键或单击[Edit Code]按钮,在此成员函数添加代码。
u 不同资源对象(控件、菜单命令等)的消息是不相同的。例如,按钮控件IDC_BUTTON1的消息有两个:BN_CLICKED和BN_DOUBLECLICKED,分别表示当用户单击或双击该按钮时产生的消息。
u 一般不需要对图5.10对话框中的[OK](确定)与[Cancel](取消)按钮进行消息映射,因为系统已自动设置了这两个按钮的动作,当用户单击这两个按钮都将自动关闭对话框。
5.1对话框的使用
Ø 程序在三处添加新用户代码
(1)在头文件(MyDlg.h文件)中声明消息处理函数OnButton1:
protected:
//{{AFX_MSG(CMyDlg)
afx_msg void OnButton1();
//}}AFX_MSG
(2)在MyDlg.cpp源文件开头部分的消息映射入口,添加消息映射宏:
BEGIN_MESSAGE_MAP(CMyDlg, CDialog) // 消息映射开始
//{{AFX_MSG_MAP(CMyDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP() // 消息映射结束
表明消息及其处理函数之间的联系。单击按钮控件IDC_BUTTON1时,系统将自动调用OnButton1函数。
(3)在MyDlg.cpp文件中写入一个空的消息处理函数的模板,以便用户填入具体代码,如下面的框架:
void CMyDlg::OnButton1()
{
// TODO: Add your control notification handler code here
}
5.1对话框的使用
Ø 在程序中使用对话框
(1)利用项目工作区的ClassView标签项,将Ex_SDIHello.cpp源文件打开;
(2)在Ex_SDIHello.cpp源文件的前面加上包含类CMyDlg的头文件:
#include "MyDlg.h"
(3)在InitInstance函数体中的“return TRUE;”语句之前添加下列代码:
CMyDlg dlg;
dlg.DoModal();
DoModal是模式对话框最常用的函数,它负责对话框的显示和终止。
(4)编译并运行。在程序的一开始就出现用户自己
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的对话框,单击[Button1]按钮将弹出“欢迎进入对话框的设计!”的消息对话框来。
5.2控件的创建和使用方法
5.2.1控件的创建方法
控件的创建方式有以下两种:
1。一种是在对话框模板中用编辑器指定控件,也就是说,将控件的父窗口指定为对话框,这样做的好处是明显的,因为当应用程序启动该对话框时,Windows系统就会为对话框创建控件;而当对话框消失时,控件也随之清除。
2。另一种方式是将控件看作是任一窗口的子窗口,并通过调用相应的Create函数来创建。
[例Ex_SDIHello] 在上例Ex_SDIHello的基础上用子窗口方式创建控件。
(1)打开CMyDlg的头文件MyDlg.h,添加一个按钮类CButton指针变量:
class CMyDlg : public CDialog
{
// Construction
public:
CMyDlg(CWnd* pParent = NULL); // standard constructor
CButton *m_btnWnd;
…
}
5.2控件的创建和使用方法
(2)按Ctrl+W快捷键打开对话框,切换到Message Maps页面,在Object IDs列表中选定“CMyDlg”项,并在Message列表中找到WM_INITDIALOG消息,双击鼠标左键,然后单击[Edit Code]按钮,添加下列代码:
BOOL CMyDlg::OnInitDialog()
{ CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_btnWnd = new CButton(); // 构造按钮控件
m_btnWnd ->Create("你好", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
CRect(20, 20, 120, 60), this, 201); // 创建
CFont *font = this->GetFont(); // 获取对话框的字体
m_btnWnd->SetFont(font); // 设置控件字体
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
Create用来创建一个按钮控件,第一个参数指定按钮的标题,第二个参数指定控件的风格,第三个参数指定它在父窗口中的位置和大小,第四个参数指定父窗口指针,最后一个参数是指定该控件的标识值。
(3)编译并运行,
结论:采用第一种办法
5.2控件的创建和使用方法
5.2.2控件的数据交换和数据校验 ddx交换,ddv校验
例如,为CMyDlg类的按钮控件IDC_BUTTON1添加并使用其成员变量m_MyBtn,则其相应的过程如下:
(1)启动MFC ClassWizard,切换到Member Variables页面,如图。
(2)选定Class name为CMyDlg,然后在Control IDs列表中,选定所要关联的控件ID号IDC_BUTTON1,双击鼠标左键或单击[Add Variable]按钮,如图。
5.2控件的创建和使用方法
(3)在Member variable name框中填好与控件相关联的成员变量m_MyBtn,单击[OK],在Control IDs列表中出现刚才添加的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
。
需要说明的是,
u DDV/DDX技术中,允许为同一个控件关联多个数据成员变量,但必须保证这些变量名是互不相同的(control(控件类),value(具体数据))且这些变量在同一个类型不能有多个变量。
u 如果添加的成员变量是一个数值类型,则在MFC ClassWizard对话框的Member Variables页面下方还要求用户输入变量的范围,这就是控件的数据校验设置。
u 同样方法为edit添加m_stredit
(4)单击[OK],发现ClassWizard作了以下三方面的修改。
u 1在MyDlg.h文件中,添加与控件关联的成员变量的声明,代码如下:
// Dialog Data
//{{AFX_DATA(CMyDlg)
enum { IDD = IDD_DIALOG1 };
CButton m_MyBtn;
CString m_strEdit;
//}}AFX_DATA
5.2控件的创建和使用方法
u 2在MyDlg.cpp文件中的CMyDlg构造函数实现代码处,添加数据成员变量的初始代码:
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{ //{{AFX_DATA_INIT(CMyDlg)
m_strEdit = _T("");
//}}AFX_DATA_INIT
}
u 3在MyDlg.cpp文件中的DoDataExchange函数体内,添加控件的DDX/DDV代码。
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{ CDialog::DoDataExchange(pDX); // 调用此函数作为DDX的开始
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_BUTTON1, m_MyBtn);
DDX_Text(pDX, IDC_EDIT1, m_strEdit);
DDV_MaxChars(pDX, m_strEdit, 20);
//}}AFX_DATA_MAP
}
5.2控件的创建和使用方法
(5)为一个控件定义一个关联的数据成员变量后,就可以使用CWnd::UpdateData 控件相关数据的输入和读取
True:控件传给变量
False:变量传给控件
函数实现控件的控制,包括控件相关数据的输入和读取。
运行该程序,当在编辑框中输入“Hello”后,单击[Button1]按钮,则此时该按钮的名称就变成了编辑框控件中的内容“Hello”,如图。
void c123::OnButton1() c123--button1—click
{
// TODO: Add your control notification handler code here
UpdateData();
m_mybtn.SetWindowText(m_stredit);
}
5.2控件的创建和使用方法
5.2.3控件的通用属性
5.2控件的创建和使用方法
5.2.4控件的消息
控件的编程和使用过程中,可以向控件发送消息来完成特定的任务,或者是根据控件产生的消息执行自己的代码(主要)。
应用程序创建一般控件或公共控件之后,控件的状态发生改变时,控件就会向其父窗口发送消息,这个消息称为“通知消息”。对于每个消息,系统都会用一个MSG结构来记录,MSG具有下列结构:
typedef struct tagMSG { // msg
HWND hwnd; // 接收到消息的窗口句柄
UINT message; // 消息
WPARAM wParam; // 消息的附加信息,它的含义取决于message
LPARAM lParam; // 消息的附加信息,它的含义取决于 message
DWORD time; // 消息传送时的时间
POINT pt; // 消息传送时,光标的屏幕坐标
} MSG;
对于一般控件来说,通知消息通常是一条WM_COMMAND消息,这条消息的wParam参数的低位字中含有控件标识符,wParam参数的高位字则为通知代码,lParam参数则是指向控件的句柄。
5.2控件的创建和使用方法
对于公共控件,通知消息通常是一条WM_NOTIFY消息,wParam参数是发送通知消息的控件的标识符,lParam参数是指向NMHDR结构的指针。对于有些控件的通知消息,lParam参数是指向一个更大的结构,且结构中的第一个成员还必须具有NMHDR结构。
对于控件的WM_COMMAND或是WM_NOTIFY消息,都可以用ClassWizard对它们加以映射。
尽管控件的各自通知消息并不相同,但下列的通知消息是所有Windows控件所共有的:
NM_CLICK 在控件中单击鼠标左按钮
NM_DBLCLK 在控件中双击鼠标左按钮
NM_RCLICK 在控件中单击鼠标左按钮
NM_RDBLCLK 在控件中双击鼠标右按钮
NM_RETURN 当控件具有输入焦点时按下ENTER键
NM_SETFOCUS 控件得到输入焦点
NM_KILLFOCUS 控件失去输入焦点
NM_OUTOFMEMORY 没有足够的内存使控件完成操作
添加消息映射
类向导-c123-c123-oncommand:
BOOL c123::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
WORD aa=HIWORD(wParam);
WORD bb=LOWORD(wParam);
if((bb==IDC_BUTTON2)&&(aa==BN_CLICKED))
MessageBox("abc");
return CDialog::OnCommand(wParam, lParam);
}
5.3常用控件
根据控件的特性和功能,一般可将其分为三类:Windows公共控件、ActiveX控件以及MFC新增的一些控件等。
5.3常用控件
5.3.1静态控件和按钮
Ø静态控件
一个静态控件是用来显示一个字符串、框、矩形、图标、位图或增强的图元文件。它可以被用来作为标签、框或用来分隔其它的控件。一个静态控件一般不接收用户输入,也不产生通知消息。
在对话框编辑器的控件工具栏中,属于静态控件的有:静态文本( )、组框( )和静态图片(添加bmp图片资源-设置图片为bmp格式-选择)( )三种。
5.3常用控件
Ø 按钮
(1)按键按钮
通常可以立即产生某个动作,执行某个命令,常被称为命令按钮。两种风格:标准按键按钮和默认按键按钮。从外观上来说,默认按键按钮是在标准按键按钮的周围加上一个黑色边框,这个黑色边框表示该按钮已接受到键盘的输入焦点,只须按回车键就能按下该按钮。具体设定的方法是在按键按钮属性对话框的Style页面中选中“Default button”项。
(2)单选按钮
外形是在文本前有一个圆圈,被选中时,就标上一个黑点,可分为一般和自动两种类型。自动类型中,若选中同组按钮中的某个单选按钮,则其余的单选按钮的选中状态就会清除,保证了多个选项始终只有一个被选中。
(3)复选框
外形是在文本前有一个空心方框,被选中时,复选框中就加上一个“ü”标记,三态复选框还有种处于灰框状态,表示“不确定”。设定成三态复选框的方法是在复选框属性对话框的Style页面中选中“Tri-state”项。
5.3常用控件
Ø 按钮的消息
常见的只有两个:BN_CLICKED和BN_DOUBLE- CLICKED。
Ø 按钮选中操作
u 最常用的按钮操作是设置或获取一个或多个按钮的选中状态。CButton类的成员函数SetCheck和GetCheck设置或获取指定按钮的选中状态,原型:
void SetCheck( int nCheck );
int GetCheck( ) const;
nCheck和GetCheck函数返回的值可以是:0表示不选中,1表示选中,2表示不确定(仅用于三态按钮)。
u 对于多个单选按钮的选中状态的设置或获取,需要使用CWnd类的成员函数CheckRadioButton和GetCheckedRadioButton,原型:
void CheckRadioButton( int nIDFirstButton, int nIDLastButton, int nIDCheckButton );
int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );
nIDFirstButton和nIDLastButton指定这组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。
5.3常用控件
[例Ex_Ctrls1] 用静态图片、单选按钮、复选框和按键按钮控件,设计界面。开始,所有单选按钮都是灰显的,不能选择,选中“允许”复选框后,所有单选按钮可以使用,选定一个单选框后,单击[应用]。
(1)用MFC AppWizard(exe)创建一个名为Ex_CommCtrls的基于对话框的应用程序。在创建的第一步,将应用程序类型选择为Dialog Based,按[Finish]。自动显示出该程序的对话框资源模板内容。
(2)打开属性对话框将其标题改为“使用Windows常用控件”。
(3)用编辑器为对话框添加如下表所示的一些控件。
(4)四个单选按钮的Tab次序应连续,从IDC_RADIO1到IDC_RADIO4依次增加。
(5)按Ctrl+W快捷键,切换到Member Variables页面,在Class name中选择CEx_CommCtrlstDlg,选中复选框控件ID号IDC_CHECK1,双击鼠标或单击Add Variables按钮。
5.3常用控件
(6)切换到ClassWizard的Messsage Maps页面,为复选框IDC_CHECK1和按钮IDC_BUTTON1增加BN_CLICKED的消息映射,添加代码:
void CEx_CommCtrlsDlg::OnCheck1()
{ UpdateData();
for (int i=0; i<4; i++)
GetDlgItem(IDC_RADIO1 + i)->EnableWindow(m_bEnabled);
}
void CEx_CommCtrlsDlg::OnButton1()
{ UpdateData();
if (!m_bEnabled) return;
int nID = GetCheckedRadioButton(IDC_RADIO1, IDC_RADIO4);
if (nID == IDC_RADIO1)
{ MessageBox("1"); }
if (nID == IDC_RADIO2)
{ MessageBox("2"); }
if (nID == IDC_RADIO3)
{ MessageBox("3"); }
if (nID == IDC_RADIO4)
{ MessageBox("4"); }
}
5.3常用控件
(7)定位到CEx_CommCtrlsDlg::OnInitDialog函数体中,添加下列代码:
BOOL CEx_CommCtrlsDlg::OnInitDialog()
{ CDialog::OnInitDialog();
…
CheckRadioButton(IDC_RADIO1, IDC_RADIO4, IDC_RADIO1); //设置第一个单选按钮为选中
OnCheck1(); ---why?
return TRUE; // return TRUE unless you set the focus to a control
}
(8)编译并运行。
5.3常用控件
5.3.2编辑框
Ø 编辑框的属性和风格
5.3常用控件
Ø 编辑框的基本操作
(1)口令设置
默认的口令字符是“*”,应用程序可以用成员函数CEdit::SetPasswordChar 来定义自己的口令字符,其函数原型如下:
void SetPasswordChar( TCHAR ch );
(2)选择文本
用鼠标来选择文本的操作方法:在要选择的文本的一端按下鼠标左键并拖动鼠标,到另一端释放鼠标键。
用键盘来选择文本的方法:在按光标方向移动键的同时,按住Shift键。
应用程序中可以通过编程选择文本,需要通过调用成员函数CEdit::SetSel 来实现。与该函数相对应的还有CEdit::GetSel和CEdit::ReplaceSel,分别用来获取编辑框中前选择的开始和结束的位置以及替换被选择的文本。
(3)设置编辑框的页面边距
设置编辑框的页面边距可以使文本在编辑框显示更具满意效果trim,应用程序可通过调用成员函数CEdit::SetMargins来实现,函数原型:
void SetMargins( UINT nLeft, UINT nRight );
(4)剪帖板操作
编辑框自动支持文本的复制、粘贴、剪切的键盘操作,对应的快捷健为Ctrl+C、Ctrl+V和Ctrl+X。若应用程序调用CEdit::Undo函数时,还可撤消当前的操作,再调用一次该函数,则恢复刚才的操作。
5.3常用控件
(5)获取多行编辑框文本
一种是使用DDX/DDV,将编辑框控件所关联的变量类型选定为CString后,则不管多行编辑框的文本有多少都可用此变量来保存。这种方法不能单独获得多行编辑框中的某一行文本。
另一种方法是使用编辑框CEdit类的相关成员函数来获取文本。例如,下面的代码将显示编辑框中第二行的文本内容:
char str[100];--在头文件定义
if (m_Edit.GetLineCount()>=2) // 判断多行编辑框的文本是否有两行以上
{ int nChars;
nChars = m_Edit.LineLength(m_Edit.LineIndex(1)); // 获取第二行文本的字符个数
// 0表示第一行,1表示第二行,依次类推。LineIndex用于将文本行转换成
// 能被LineLength识别的索引
m_Edit.GetLine(1,str,nChars); // 获取第二行文本
str[nChars] = '\0';
MessageBox(str);
}
5.3常用控件
Ø 编辑框的通知消息
[例Ex_Ctrls2] 使用静态文本、组框、编辑框以及按钮等控件,设计界面。用户在“成绩1”、“成绩2”和“成绩3”编辑框中输入成绩后,单击[计算平均分]按钮,将显示出这三个成绩的平均分。
(1)打开前面的Ex_CommCtrls。
(2)向应用程序中添加一个对话框资源,打开属性对话框将其标题改为“使用编辑框”,ID号改为IDD_EDIT。
(3) 用编辑器为对话框添加如下表所示的一些控件。
(4)双击对话框模板或按Ctrl+W快捷键,为对话框资源IDD_EDIT创建一个对话框类CEditDlg。
5.3常用控件
(5)打开ClassWizard的Member Variables标签,在Class name中选择CEditDlg,选中所需的控件ID号,双击鼠标或单击Add Variables按钮。依次为控件增加成员变量。
(6)切换到ClassWizard的Messsage Maps标签页,为CEditDlg增加WM_INITDIALOG的消息映射,并添加下列代码:
BOOL CEditDlg::OnInitDialog()
{ CDialog::OnInitDialog();
m_strAve = "0.00";
UpdateData(FALSE);// 将成员变量数据传给控件,并在控件中显示
return TRUE;
}
5.3常用控件
(7)用ClassWziard为按钮IDC_BUTTON1添加BN_CLICKED的消息映射,并增加下列代码:
void CEditDlg::OnButton1()
{ UpdateData(); // 将控件显示的数据传给成员变量
double ave = (double)(m_nScore1+m_nScore2+m_nScore3)/3.0;
m_strAve.Format("%6.2f", ave);
UpdateData(FALSE); // 将成员变量数据传给控件并显示
}
(8)定位到CEx_CommCtrlsDlg::OnButton1函数处,修改代码如下:
if (nID == IDC_RADIO1) {
CEditDlg dlg;
dlg.DoModal();
}
(9)在Ex_CommCtrlsDlg.cpp文件的开始处,增加包含CEditDlg的头文件。
#include “EditDlg.h” //目的是“从启动窗体运行本窗体!”
(10)编译运行并测试。
如何启动一个新窗体
5.3常用控件
5.3.3列表框
Ø 列表框的风格
5.3常用控件
Ø 列表框的基本操作
(1)添加列表项
列表框创建时是一个空的列表,需要添加或插入一些列表项。CListBox类成员函数AddString 和InsertString用来向列表框增加列表项,原型:
int AddString( LPCTSTR lpszItem );
int InsertString( int nIndex, LPCTSTR lpszItem );
CListBox的SetItemData和SetItemDataPtr能使数据和某个列表项关联起来。
int SetItemData( int nIndex, DWORD dwItemData );
int SetItemDataPtr( int nIndex, void* pData );
(2)删除列表项
CListBox类成员函数DeleteString和ResetContent分别用来删除指定的列表项和清除列表框所有项目。它们的函数原型如下:
int DeleteString( UINT nIndex ); // nIndex指定要删除的列表项的索引
void ResetContent( );
若在添加列表项时使用SetItemDataPtr函数,不要忘记在进行删除操作时及时将关联数据所占的内存空间释放出来。
5.3常用控件
(3)查找列表项
CListBox类成员函数FindString 和FindStringExact分别用来在列表框中查找所匹配的列表项,其中FindStringExact的查找精度最高。
int FindString( int nStartAfter, LPCTSTR lpszItem ) const;
int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const;
lpszFind和lpszItem指定要查找的列表项文本,nStartAfter和nIndexStart指定查找的开始位置,若为-1,则从头至尾查找。查到后,这两个函数都将返回所匹配列表项的索引,否则返回LB_ERR。
(4)列表框的单项选择
当选中列表框中某个列表项,可以使用CListBox::GetCurSel来获取这个结果,与该函数相对应的CListBox::SetCurSel 函数是用来设定某个列表项呈选中状态(高亮显示)。
int GetCurSel( ) const; // 返回当前选择项的索引
int SetCurSel( int nSelect );
nSelect指定要设置的列表项索引,错误时这两个函数都将返回LB_ERR。
若要获取某个列表项的字符串,可使用下列函数:
int GetText( int nIndex, LPTSTR lpszBuffer ) const;
void GetText( int nIndex, CString& rString ) const;
nIndex指定列表项索引,lpszBuffer 和rString是用来存放列表项文本。
5.3常用控件
(5)列表框的多项选择
在列表框的Style属性对话框中选中多选(Multiple)或扩展多选(Extended)类型后,就可以在列表框中进行多项选择。要想获得选中的多个选项,通过需要用ClassWizrd映射LBN_SELCHANGE消息,添加类似代码:
void CListBoxDlg::OnSelchangeList1()
{ int nCount = m_list.GetSelCount(); // 获取用户选中的项数
if (nCount != LB_ERR)
{ int *buffer = new int[nCount]; // 开辟缓冲区
m_list.GetSelItems(nCount,buffer);
CString allStr, str;
allStr.Empty(); // 字符串清空
for (int i=0; i
score1;
m_nScore2 = data->score2;
m_nScore3 = data->score3;
UpdateData(FALSE);
}
}
5.3常用控件
(8)用ClassWizard为对话框添加WM_DESTROY的消息映射,增加代码:
void CListBoxDlg::OnDestroy()