友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第35部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
…………………………………………………………Page 294……………………………………………………………
图6。 2 控件的Properties对话框
图6。 3 对话框编辑器的Controls工具窗口
在下面的过程中,我们将一个编辑框控件添加到在第四章创建的基于
对话框的MFC框架应用程序的主对话框窗口中。
1。 首先,在Workspace窗口的ResourceView选项内双击DialogDemo
resourcesDialog节点下的IDD_DIALOGDEMO_DIALOG图标。上面的操
作如图所示。
2。 用鼠标选中标有 “要做……”的静态文本控件。右击鼠标,从上
下文菜单中选择Properties,打开如图6。2所示的对话框,在Caption
文本框中输入新的控件文本: “在下面的文本框中输入一些字符”,
然后将静态文本控件拖动到对话框的左上角。
3。 从Controls工具窗口(如图6。3所示,如果在你的资源编辑器中看
不到该工具窗口,可以在工具条上右击鼠标,从上下文菜单中选择
Controls)中选择编辑控件图标 ,在对话框中绘制一个编辑框控
件,如图6。4所示。
在该编辑框控件的Properties窗口的General选项卡中输入其ID为
IDC_EDIT。然后在Styles选项卡下将Multiline复选框划上勾,并消
除Auto HScroll复选框前的勾。
4。 右击该编辑框控件,从上下文菜单中选择ClassWizard命令,打开
ClassWizard对话框,该对话框看起来如图6。5所示。
…………………………………………………………Page 295……………………………………………………………
图6。 4 向对话框中添加一个编辑框控件
图6。 5 ClassWizard对话框
单击Member Variables选项卡,确信在Project处选择了
DialogDemo,在Class name处选择了CDialogDemoDlg。现在我们为刚
才添加的编辑框控件IDC_EDIT添加一个数据映射入口。在Control
IDs处选择IDC_EDIT,单击右边的Add Viable按钮。打开如图6。6所示
的对话框。
在Member variable name处链接变量名m_strEdit (这里m表示该变量
为类CDialogDemoDlg的一个成员变量,str表明其类型为字符串,即
类CString),在Category下拉列表中选择Value (另一种选择是
Control,两种选择的不同将在后面的内容中讲述),在Variable
type下拉列表中选择CString (还有其它很多数据类型可供选择,但
由于这里编辑框中的内容为一字符串,因此CString是最恰当的选
择)。单击OK关闭对话框。
…………………………………………………………Page 296……………………………………………………………
图6。 6 为控件映射添加成员变量
5。 检查一下现在的ClassWizard对话框 (图6。7)与图6。5相比有何不
同。在图6。7所示的对话框中下方的Maximum characters文本框中输
入50。由字面意思可以很容易猜出其含义,即将编辑框IDC_EDIT中可
能的最长字符串的大小限制为50。单击OK关闭对话框。
图6。 7 使用ClassWizard设置数据验证方案
6。 从Workspace窗口的ClassView中双击类CDialogDemoDlg的
OnInitDialog成员函数,使用下面的代码来代替位于语句
return TRUE;
前的// TODO注释:
m_strEdit=〃您好! 请在这里输入一些字符串。〃;
UpdateData(FALSE);
…………………………………………………………Page 297……………………………………………………………
7。 在ClassView中双击类CDialogDemoApp的InitInstance成员函数,
使用下面的代码来找替位于选择支
if (nResponse == IDOK)
下的//TODO注释:
AfxMessageBox(dlg。m_strEdit);
然后将同一成员函数中的下面的代码行删掉 (或注释掉):
m_pMainWnd = &dlg;
8。 编译并运行该应用程序。显示如图6。8所示的对话框。
图6。 8 示例程序DialogDemo的运行结果
在图6。8所示的文本框中输入一些字符,单击 “确定”。随即弹出如
图6。9所示的消息框。该消息框复述了用户在图6。8所示的对话框中的
输入。我们还发现,在图6。8所示的对话框中,当输入字符串达到一
定的长度之后,我们不可以再输入更多的字符,这是我们在前面设置
了Maximum characters为50的结果。
图6。 9 以消息框的形式反馈输入的字符串
下面我们来看在上面的步骤中都完成了什么。首先我们使用资源编辑
器向对话框模板中添加这些标准控件,这一步的概念很清晰,因此并
不难理解。
然后,我们打开了所绘制的编辑框的Properties (属性)对话框。先
将其控件ID设置为IDC_EDIT。这时如果打开头文件Resource。h,就会
发现宏IDC_EDIT被定义为常量1001。不过,事实上在很多情况下我们
并不需要关心每一控件的ID的具体值,而只需要记住相应的助记符。
对于这里的编辑框控件,我们只需要记住IDC_EDIT即可,而不需要关
…………………………………………………………Page 298……………………………………………………………
心它等于1001。接着,我们在Styles选项卡中设置了Multiline属
性,同时清除了Auto HScroll属性,两者共同作用使用得编辑框
IDC_EDIT支持多行文本,并且如文本行的长度超过编辑框宽度时自动
回行。
下面的步骤是最重要的一步,我们动用了功能强大的工具
ClassWizard。首先,我们将编辑框与一个CString对象相关联,这使
用了一种被称为Dialog Data Exchange (DDX)的机制。在这种机制
中,我们先在处理函数OnInitDialog或对话框类的构造函数中对对话
框对象的成员变量进行初始化,在对话框显示之前,框架的DDX机制
将成员变量的值传递给对话框中的控件。这个过程在成员函数
DoModal或Create被调用的过程中发生。类CDialog中对OnInitDialog
成员函数的默认实现调用了类CWnd成员函数UpdateData来初始化对话
框中的控件。这时我们就可以看到前面的第6步还可在具有下面的几
种变通方案:
1。 将代码行
m_strEdit=〃您好! 请在这里输入一些字符串。〃;
移到对基类的OnInitDialog成员函数的调用之前,即位于下面的代码
之前:
CDialog::OnInitDialog();
2。 将代码
m_strEdit=〃您好! 请在这里输入一些字符串。〃;
移到类CDialogDemoDlg的构造函数中。
对于上面的两种方法,与前面第6步中使用的方法相比,我们没有必
要调用类CWnd的成员函数UpdateData。因为该函数在类CDialog的成
员函数OnInitDialog中将被调用。
这三种方法之间并没有明确的优劣之分,在很多情况下,它们分别适
用于不同的场合。
这里我们说一下成员函数UpdateData。该函数带有一个布尔类型的参
数,如果该参数为FALSE,函数UpdateData将成员变量的值传递给对
话框的变量;而如果该参数为TRUE,函数UpdateData将进行相反的过
程。
…………………………………………………………Page 299……………………………………………………………
如果用户单击了对话框中ID为IDOK的按钮,或者以TRUE为参数调用函
数UpdateData,DDX机制从控件中将值传递到成员变量,同时对话框
数据验证 (dialog data validation,DDV)机制根据设定的验证规则
验证所有数据项。
在数据交换的过程中,成员函数UpdateData先创建一个
CDataExchange对象,然后调用对话框对类CDialog成员函数
DoDataExchange的重载版本。该CDataExchange对象将作为成员函数
DoDataExchange的一个参数,该参数定义了数据交换的上下文。
在DoDataExchange中,我们为每一个数据成员指定了一个对DDX函数
的调用。每一个函数定义了基于由成员函数UpdateData所提供的
CDataExchange参数所确定的上下文而进行的双向数据交换。
下面的代码摘自实现文件DialogDemo。cpp 中对函数DoDataExchange的
定义:
void CDialogDemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDialogDemoDlg)
DDX_Text(pDX; IDC_EDIT; m_strEdit);
DDV_MaxChars(pDX; m_strEdit; 50);
//}}AFX_DATA_MAP
}
在两行注释//{{AFX_DATA_MAP和//}}AFX_DATA_MAP之间的代码部分称
作数据映射。函数DDX_Text使用CString对象m_strEdit与ID为
IDC_EDIT的编辑框控件相关联。函数DDV_MaxChars设置与编辑框控件
IDC_EDIT相关联CString对象m_strEdit的最大长度为50。
需要注意的是,如果用户在模式对话框中单击了 “取消”(Cancel)按
钮,DoModal函数将返回值IDCANCEL,在这种情况下,在对话框和对
话框对象之前的数据交换不会发生。
由于这个原因,如果DoModal函数返回了值IDOK,我们可以使用下面
的代码来复述用户在对话框中所输入的值:
…………………………………………………………Page 300……………………………………………………………
AfxMessageBox(dlg。m_strEdit);
l 注意:
l 在前面的第7步中有一个乍看起来有一些费解的过程,这就是我们
为什么要将下面的代码从函数OnInitDialog中删除:
l m_pMainWnd = &dlg;
这基于下面的一个事实:
类CWinThread的数据成 员m_pMainWnd有一个有用的特征,如
果由该成员所引用的窗口被关闭的话,MFC库将 自动的终止
CWinThread对象所代表的线程。这样,如果我们将指向dlg的
指针赋予了成员变量m_pMainWnd,那么,无论我们单击 了
“确认”还是 “取消”,应用程序的主线程都将被自动终
止,之后的代码 当然不会得到执行。而在本示例中,我们希
望在对话框被关闭后程序继续运行 (即弹出一个消息重述用户
所输入的内容),因此不应该将dlg对象的指针赋予成员变量
m_pMainWnd,从而需要将前面的代码从函数OnInitDialog中
删除。
第二节 所有窗口类的基类:CWnd
在MFC中类CWnd是一个很重要的类,它封装了Windows窗口句柄HWND。
在Windows编程中,窗口句柄唯一的标识了一个窗口。然而,尽管类
CWnd的对象和窗口句柄之间有着如此紧密的联系,但两者并不是等同
的概念。CWnd对象通过类CWnd的构造函数和析构函数创建和消毁,而
Windows窗口是Windows内部的一种数据结构,在类CWnd中,它通过
Create成员函数创建,通过其析构函数消毁。除此之外,成员函数
DestroyWindow可以消毁Windows窗口,而不需要消毁CWnd对象。
传统的Windows应用程序中,消息是通过一个称作窗口过程 (window
procedure,通常具有WndProc之类的函数名)的回调函数来处理的。
这种方式在MFC中仍然使用,但为CWnd类及其消息映射所隐藏。在类
CWnd中,Windows通知消息会被自动的通过消息映射传递到类CWnd中
合适的OnMessage成员函数 (这里OnMessage是指这些函数具有的以On
为前缀的函数名,如OnPaint和前面接触到的OnInitDialog等)进行处
理。通常我们都在类CWnd的派生类中重载需要处理的特定消息所对应
的OnMessage成员函数。除了直接从CWnd派生新的窗口类以外,我们
…………………………………………………………Page 301……………………………………………………………
更倾向于从MFC中定义的其它类,如CFrameWnd、CMIDFrameWnd、
CMDIChileWnd、CView和CDialog以及CButton之类的控件类派生新的
窗口类。在MFC中定义的这些类本身也是从CWnd派生的。
通常我们使用两个步骤来创建一个窗口:首先,调用类CWnd的构造函
数来构造一个CWnd对象,然后调用其成员函数Create来创建窗口并将
该窗口与所创建的CWnd对象相关联。
当用户终止该窗口时,消毁与之相关联的CWnd对象,或者调用CWnd对
象的成员函数DestroyWindow删除窗口并消毁其数据结构。
大多数以HWND为参数的Win32 API函数都已作为类CWnd的成员函数进
行了封装,事实上,很多时候我们通过类Wnd的派生类调用的成员函
数并不是由派生类本身所提供的,而是在类CWnd中进行定义的。下面
我们分类给出在CWnd类中定义的各类成员函数。完整而详尽的说明每
一个成员函数在本书中是不现实的,这里我们仅给出对每一个成员函
数的简短说明,以便读者在编程时能够很快的查找到所需的函数,这
时再去查找有关于该函数的详细的说明就不是一件困难的事了。
1。 类CWnd的数据成员(表6。2):
表6。 2 类CWnd的数据成员
数据成 描述
员
m_hWnd 与该CWnd对象相关联的Windows窗口句柄
(HWND)
2。 构造函数/析构函数 (表6。3)
表6。 3 类CWnd的构造函数和析构函数
成员函数 获得图标句柄
SetIcon 设置句柄为一指定
图标
GetWindowContextHelpId 获得帮助上下文标
识符
SetWindowContextHelpId 设置帮助上下文标
识符
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!