八宝书库 > 文学其他电子书 > 深入浅出MFC第2版(PDF格式) >

第124部分

深入浅出MFC第2版(PDF格式)-第124部分

小说: 深入浅出MFC第2版(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




                   #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 

                   #0004  ///////////////////////////////////////////////////////////////// 

                   #0005  // CPenWidthsDlg dialog 

                   #0006 

                   #0007  class CPenWidthsDlg : public CDialog 

                   #0008  { 

                   #0009  // Construction 

                   #0010  public: 

                   #0011          CPenWidthsDlg(CWnd* pParent = NULL);   // standard constructor 

                   #0012 

                   #0013  // Dialog Data 

                   #0014          //{{AFX_DATA(CPenWidthsDlg) 

                   #0015          enum { IDD = IDD_PEN_WIDTHS }; 

                   #0016                  // NOTE: the ClassWizard will add data members here 

                   #0017          //}}AFX_DATA 

                   #0018 

                   #0019 

                   #0020  // Overrides 

                   #0021          // ClassWizard generated virtual function overrides 

                   #0022          //{{AFX_VIRTUAL(CPenWidthsDlg) 

                   #0023          protected: 

                   #0024          virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV suppo 

                   #0025          //}}AFX_VIRTUAL 

                   #0026 

                   #0027  // Implementation 

                   #0028  protected: 

                   #0029 

                   #0030          // Generated message map functions 

                   #0031          //{{AFX_MSG(CPenWidthsDlg) 

                   #0032          afx_msg void OnDefaultPenWidths(); 

                   #0033          //}}AFX_MSG 

                   #0034          DECLARE_MESSAGE_MAP() 

                   #0035  }; 



                   PENDLG。CPP 



                   #0001  // PenDlg。cpp : implementation file 

                   #0002  // 

                   #0003 

                   #0004  #include 〃stdafx。h〃 

                   #0005  #include 〃Scribble。h〃 



610 


…………………………………………………………Page 673……………………………………………………………

                                                                   10      MFC 

                                                                第 章            與對話盒 



#0006  #include 〃PenDlg。h〃 

#0007 

#0008  #ifdef _DEBUG 

#0009  #define new DEBUG_NEW 

#0010  #undef THIS_FILE 

#0011  static char THIS_FILE'' = __FILE__; 

#0012  #endif 

#0013 

#0014  ///////////////////////////////////////////////////////////// 

#0015  // CPenWidthsDlg dialog 

#0016 

#0017 

#0018  CPenWidthsDlg::CPenWidthsDlg(CWnd* pParent /*=NULL*/) 

#0019          : CDialog(CPenWidthsDlg::IDD; pParent) 

#0020  { 

#0021          //{{AFX_DATA_INIT(CPenWidthsDlg) 

#0022              // NOTE: the ClassWizard will add member initialization here 

#0023          //}}AFX_DATA_INIT 

#0024  } 

#0025 

#0026 

#0027  void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX) 

#0028  { 

#0029          CDialog::DoDataExchange(pDX); 

#0030          //{{AFX_DATA_MAP(CPenWidthsDlg) 

#0031                  // NOTE: the ClassWizard will add DDX and DDV calls here 

#0032          //}}AFX_DATA_MAP 

#0033  } 

#0034 

#0035 

#0036  BEGIN_MESSAGE_MAP(CPenWidthsDlg; CDialog) 

#0037          //{{AFX_MSG_MAP(CPenWidthsDlg) 

#0038          ON_BN_CLICKED(IDC_DEFAULT_PEN_WIDTHS; OnDefaultPenWidths) 

#0039          //}}AFX_MSG_MAP 

#0040  END_MESSAGE_MAP() 

#0041 

#0042  /////////////////////////////////////////////////////////////// 

#0043  // CPenWidthsDlg message handlers 

#0044 

#0045  void CPenWidthsDlg::OnDefaultPenWidths() 

#0046  { 

#0047          // TODO: Add your control notification handler code here 

#0048 

#0049  } 



                                                                                               611 


…………………………………………………………Page 674……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   稍早我曾提过,ClassWizard 会为我们做出一个Data Map 。此一Data Map 将放在 



                   DoDataExchange  函数中。目前Data Map 还没有什么内容,CPenWidthsDlg 的Message 



                   Map 也是空的,因为我们还未透过ClassWizard 加料呢。 



                   请注意,CPenWidthsDlg 构造式会先引发基础类别CDialog 的构造式,后者会产生一 



                   个modal 对话框。CDialog 构造式的两个参数分别是对话框ID  以及父窗口指针: 



                   #0018  CPenWidthsDlg::CPenWidthsDlg(CWnd* pParent /*=NULL*/) 

                   #0019          : CDialog(CPenWidthsDlg::IDD; pParent) 

                   #0020  { 

                   #0021          //{{AFX_DATA_INIT(CPenWidthsDlg) 

                   #0022              // NOTE: the ClassWizard will add member initialization here 

                   #0023          //}}AFX_DATA_INIT 

                   #0024  } 



                    ClassWizard 帮我们把CPenWidthsDlg::IDD 塞给第一个参数, 这个值定义于 



                   PENDLG。H  的AFX_DATA  区中,其值为IDD_PEN_ WIDTHS: 



                   #0013  // Dialog Data 

                   #0014          //{{AFX_DATA(CPenWidthsDlg) 

                   #0015          enum { IDD = IDD_PEN_WIDTHS }; 

                   #0016                  // NOTE: the ClassWizard will add data members here 

                   #0017          //}}AFX_DATA 



                   也就是【Pen Widths 】对话框资源的ID : 



                   // in 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 



                   对话框类别CPenWidthsDlg 因此才有办法取得「RC 文件中的对话框资源」。 



612 


…………………………………………………………Page 675……………………………………………………………

                                                     10     MFC 

                                                   第 章       與對話盒 



对话框的消息处理函数 



     CDialog 本就定义有两个按钮【OK 】和【Cancel】,【Pen Widths 】对话框又新增一个 



     【Default 】钮,当使用者按下此钮时,粗笔与细笔都必须回复为预设宽度(分别是5个 



     图素和2个图素)。那么,我们显然有两件工作要完成: 



       1。 在CPenWidthsDlg 中增加两个变量,分别代表粗笔与细笔的宽度。 



       2。 在CPenWidthsDlg 中增加一个函数,负责【Default 】钮被按下后的动作。 



     以下是ClassWizard 的操作步骤(增加一个函数): 



       ■进入ClassWizard,选择【Message Maps】附页,再选择【Class name 】清单中 



         的CPenWidthsDlg 。 



       ■左侧的【Object IDs 】清单列出对话框中各个控制组件的ID 。请选择其中的 



         ID C_DEFAULT_PEN_ WIDTHS  (代表【Default 】钮)。 



       ■在右侧的【Messages 】中选择BN_CLICKED 。这和我们在前两章的经验不同, 



         如今我们处理的是控制组件,它所产生的消息是特别的一类,称为Notification 



         消息,这种消息是控制组件用来通知其父窗口(通常是个对话框)某些状况发 



         生了,例如BN_CLICKED 表示按钮被按下。至于不同的Notification 所代表的 



         意义,画面最下方的〃Description〃 会显示出来。 



       ■按下【Add Function 】钮,接受预设的OnDefaultPenWidths  函数(也可以改名): 



       ■现在,【Member Functions 】清单中出现了新函数,以及它所对映之控制组件 


返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的