按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
_ _ _
604
…………………………………………………………Page 667……………………………………………………………
10 MFC
第 章 與對話盒
■右键选按第一个Static 控制组件,Property page 中出现其属性,现在把文字
内容改为〃Thin Pen Width: 〃。以同样的方式把第二个Static 控制组件的文字
内容改为〃Thick Pen Width: 〃。不必在意Static 控制组件的ID 值,因为我们
根本不可能在程序中用到Static 控制组件的ID 。
■调整每一个控制组件的大小位置,使之美观整齐。
■调整tab order 。所谓tab order 是使用者在操作对话框时,按下Tab 键后,键
盘输入焦点在各个控制组件上的巡回次序。调整方式是选按Visual C++ 整合环
境中的【Layout/Tab Order 】命令项,出现带有标号的对话框如下,再依你所想
要的次序以鼠标点选一遍即可。
■测试对话框。选按Visual C++ 整合环境中的【Layout/Test 】命令项,出现运作
状态下的对话框。你可以在这种状态下测试tab order 和预设按钮( default
button )。若欲退出,请选按【OK 】或【Cancel】或按下ESC 键。
注意:所谓default button ,是指与 键相通的那个按钮。
605
…………………………………………………………Page 668……………………………………………………………
第篇 深入 MFC 程式設計
所有调整都完成之后,存盘。于是SCRIBBLE。RC 增加了下列内容(一个对话框模板):
IDD_PEN_WIDTHS DIALOG DISCARDABLE 0; 0; 203; 65
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION 〃Pen Widths〃
FONT 8; 〃MS Sans Serif〃
BEGIN
DEFPUSHBUTTON 〃OK〃;IDOK;148;7;50;14
PUSHBUTTON 〃Cancel〃;IDCANCEL;148;24;50;14
PUSHBUTTON 〃Default〃;IDC_DEFAULT_PEN_WIDTHS;148;41;50;14
LTEXT 〃Thin Pen Width:〃;IDC_STATIC;10;12;70;10
LTEXT 〃Thick Pen Width:〃;IDC_STATIC;10;33;70;10
EDITTEXT IDC_THIN_PEN_WIDTH;86;12;40;13;ES_AUTOHSCROLL
EDITTEXT IDC_THICK_PEN_WIDTH;86;33;40;13;ES_AUTOHSCROLL
END
利用ClassWizard 连接对话框与其专属类别
一旦完成了对话框的外貌设计,再来就是设计其行为。我们有两件事要做:
1。 从MFC 的CDialog 中衍生出一个类别,用来负责对话框行为。
2。 利用ClassWizard 把这个类别和先前你产生的对话框资源连接起来。通常这意
味着你必须声明某些函数,用以处理你感兴趣的对话框消息,并将对话框中的
控制组件对应到类别的成员变量上,这也就是所谓的Dialog Data eXchange
(DDX )。如果你对这些变量内容有任何「确认规则」的话,ClassWizard 也
允许你设定之,这就是所谓的Dialog Data Validation (DDV) 。
注意:所谓「确认规则」是指对某些特殊用途的变量进行内容查验工作。例如月份
一定只可能在1~12 之间,日期一定只可能在1~31 之间,人名一定不会有数字夹
杂其中,金钱数额不能夹带文字,新竹的电话号码必须是03 开头后面再加7位数。。。
等等等。
606
…………………………………………………………Page 669……………………………………………………………
10 MFC
第 章 與對話盒
所有动作当然都可以手工完成,然而ClassWizard 的表现非常好,让我们快速又轻松地
完成这些事样。它可以为你的对话框产生一个。H 档,一个。CPP 文件,内有你的对话框
类别、函数骨干、一个Message Map 、以及一个Data Map 。哎呀,我们又看到了新东西,
稍后我会解释所谓的Data Map 。
回忆Scribble 诞生之初,程序中有一个About 对话框,寄生于SCRIBBLE。CPP 中。
AppWizard 并没有询问我们有关这个对话框的任何意见,就自作主张地放了这些码:
#0001 /////////////////////////////////////////////////////////////////
#0002 // CAboutDlg dialog used for App About
#0003
#0004 class CAboutDlg : public CDialog
#0005 {
#0006 public:
#0007 CAboutDlg();
#0008
#0009 // Dialog Data
#0010 //{{AFX_DATA(CAboutDlg)
#0011 enum { IDD = IDD_ABOUTBOX };
#0012 //}}AFX_DATA
#0013
#0014 // ClassWizard generated virtual function overrides
#0015 //{{AFX_VIRTUAL(CAboutDlg)
#0016 protected:
#0017 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
#0018 //}}AFX_VIRTUAL
#0019
#0020 // Implementation
#0021 protected:
#0022 //{{AFX_MSG(CAboutDlg)
#0023 // No message handlers
#0024 //}}AFX_MSG
#0025 DECLARE_MESSAGE_MAP()
#0026 };
#0027
#0028 CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
#0029 {
#0030 //{{AFX_DATA_INIT(CAboutDlg)
#0031 //}}AFX_DATA_INIT
#0032 }
#0033
#0034 void CAboutDlg::DoDataExchange(CDataExchange* pDX)
607
…………………………………………………………Page 670……………………………………………………………
第篇 深入 MFC 程式設計
#0035 {
#0036 CDialog::DoDataExchange(pDX);
#0037 //{{AFX_DATA_MAP(CAboutDlg)
#0038 //}}AFX_DATA_MAP
#0039 }
#0040
#0041 BEGIN_MESSAGE_MAP(CAboutDlg; CDialog)
#0042 //{{AFX_MSG_MAP(CAboutDlg)
#0043 // No message handlers
#0044 //}}AFX_MSG_MAP
#0045 END_MESSAGE_MAP()
#0046
#0047 // App mand to run the dialog
#0048 void CScribbleApp::OnAppAbout()
#0049 {
#0050 CAboutDlg aboutDlg;
#0051 aboutDlg。DoModal();
#0052 }
CAboutDlg 虽然衍生自CDialog,但太简陋,不符合我们新增的这个【Pen Width】对话
框所需,所以我们首先必须另为【Pen Width】对话框产生一个类别,以负责其行径。步
骤如下:
接续刚才完成对话框模板的动作,选按整合环境的【View/ClassWizard 】命令项
(或是直接在对话框模板上快按两下),进入ClassWizard 。这时候【Adding a
Class 】对话框会出现,并以刚才的IDD_PEN_ WIDTHS 为新资源,这是因为
ClassWizard 知道你已在对话框编辑器中设计了一个对话框模板,却还未设计
其对应类别(整合环境就是这么便利)。好,按下【OK 】。
608
…………………………………………………………Page 671……………………………………………………………
10 MFC
第 章 與對話盒
在【Create New Class 】对话框中设计新类别。键入〃CPenWidthsDlg〃 做为类别
名称。请注意类别的基础类型为CDialog,因为ClassWizard 知道目前是由对
话盒编辑器过来:
ClassWizard 把类别名称再加上。cpp 和。h,作为预设档名。毫无问题,因为
Windows 95 和Windows NT 都支持长档名。如果你不喜欢,按下上图右侧的
【Change 】钮去改它。本例改用PENDLG。CPP 和PENDLG。H 两个档名。
按下上图的【OK 】钮,于是类别产生,回到ClassWizard 画面。
这样,我们就进账了两个新文件:
609
…………………………………………………………Page 672……………………………………………………………
第篇 深入 MFC 程式設計
PENDLG。H
#0001 // PenDlg。h : header file
#0002 //
#0003
#000