友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第157章

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






  进入ClassWizard,选择【Member Variables 】附页,再选择CPenWidthsDlg。 



 对话框中央部份有一大块区域用来显示控制组件与变量间的对映关系(见下一 



 页图)。 



  选择IDC_THIN_PEN_ WIDTH,按下【Add Variable。。。 】钮,出现对话框如下。 



   键入变量名称为m_nThinWidth 。 

 



   选择变量型别为int  。 

 



  按下【OK  】键, 于是ClassWizard 为CPenWidthsDlg 增加了一个变量 



   m_nThinWidth 。 



     

 在ClassWizard 对话框最下方(见下一页图)填入变量的数值范围,以为DDV 



  之用。 



  重复前述步骤,为IDC_THICK_PEN_WIDTH  也设定一个对应变量,范围也是 



   1~20。 



                                                                              619 


…………………………………………………………Page 682……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   上述动作影响我们的程序代码如下: 



                   class CPenWidthsDlg : public CDialog 

                    { 

                   // Dialog Data 

                           //{{AFX_DATA(CPenWidthsDlg) 

                           enum { IDD = IDD_PEN_WIDTHS }; 

                           int             m_nThinWidth; 

                           int             m_nThickWidth; 

                           //}}AFX_DATA 

                    。。。 



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

                           : CDialog(CPenWidthsDlg::IDD; pParent) 

                    { 

                      m_nThickWidth = 0; 

                      m_nThinWidth = 0; 

                      。。。 

                    } 



                   void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX) 

                    { 

                       CDialog::DoDataExchange(pDX); 

                       //{{AFX_DATA_MAP(CPenWidthsDlg) 



620 


…………………………………………………………Page 683……………………………………………………………

                                                           10      MFC 

                                                        第 章          與對話盒 



    DDX_Text(pDX; IDC_THIN_PEN_WIDTH; m_nThinWidth); 

    DDV_MinMaxInt(pDX; m_nThinWidth; 1; 20); 

    DDX_Text(pDX; IDC_THICK_PEN_WIDTH; m_nThickWidth); 

    DDV_MinMaxInt(pDX; m_nThickWidth; 1; 20); 

    //}}AFX_DATA_MAP 

 } 



只要资料「有必要」在成员变量与控制组件之间搬移,Framework 就会自动调用 



DoDataExchange 。我所说的「有必要」是指,对话框初次显示在屏幕上,或是使用者按 



下【OK 】离开对话框等等。CPenWidthsDlg::DoDataExchange  由一组一组的DDX/DDV 



函数完成之。先做DDX ,然后做DDV,这是游戏规则。如果你纯粹借助ClassWizard, 



就不必在意此事,如果你要自己动手完成,就得遵循规则。 



该是完成上一节的OnDefaultPenWidths 的时候了。当【Default 】钮被按下,Framework 



会调用OnDefaultPenWidths,我们应该在此设定粗笔细笔两种宽度的默认值: 



void CPenWidthsDlg::OnDefaultPenWidths() 

 { 

        m_nThinWidth = 2; 

        m_nThickWidth = 5; 

        UpdateData(FALSE);  // causes DoDataExchange() 

                // bSave=FALSE means don't save from screen; 

                // rather; write to screen 

 } 



                   MFC 中各式各样的DDx_ 函数 



  如果你以为MFC 对于对话框的照顾,只有DDX 和DDV,那你就又错了,另外还有 



  一个DDP ,使用于OLE Custom Control      (也就是OCX )的Property page  中,下面是它 



  的形式: 



 //{{AFX_DATA_MAP(CSmilePropPage) 

        DDP_Text(pDX; IDC_CAPTION; m_caption; _T(〃Caption〃) ); 

        DDX_Text(pDX; IDC_CAPTION; m_caption); 

        DDP_Check(pDX; IDC_SAD; m_sad; _T(〃sad〃) ); 

        DDX_Check(pDX; IDC_SAD; m_sad); 

        //}}AFX_DATA_MAP 



                                                                                   621 


…………………………………………………………Page 684……………………………………………………………

               第篇    深入  MFC  程式設計 



                什么是Property page ?这是最新流行(Microsoft 强力推销?)的接口。这种接口用来解 



                决过于拥挤的对话框。ClassWizard 就有四个Property page ,我们又称为tag  (附页)。 



                拥有property page  的对话框称为property sheet ,也就是tagged dialog  (带有附页的对话 



                盒)。 



        如何唤起对话框 



              【Pen Widths 】对话框是一个所谓的Modal 对话框,意思是除非它关闭(结束),否则 



              它会紧抓住这个程序的控制权,但不影响其它程序。相对于Modal 对话框,有一种 



              Modeless 对话框就不会影响程序其它动作的进行;通常你在文字处理软件中看到的文字 



              搜寻对话框就是Modeless 对话框。 



              过去,MFC 有两个类别,分别负责Modal 对话框和Modeless 对话框,它们是 



              CModalDialog 和CDialog。如今已经合并为一,就是CDialog。不过为了回溯兼容, 



              MFC 有这么一个定义: 



               #define CModalDialog Cdialog 



              要做出Modal 对话框,只要调用CDialog::DoMoal  即可。 



              我们希望Step3 的命令项【Pen/Pen Widths 】被按下时,【Pen Widths 】对话框能够执行 



              起来。要唤起此一对话框,得做到两件事情: 



               1。 产生一个CPenWidthsDlg 对象,负责管理对话框。 



               2。 显示对话框窗口。这很简单,调用DoMoal  即可办到。 



              为了把命令消息连接上CPenWidthsDlg,我们再次使用ClassWizard,这一次要为 



              CScribbleDoc 加上一个命令处理例程。为什么选择在CScribbleDoc 而不是其它类别中 



              处理此一命令呢?因为不论是粗笔或细笔,乃至于目前正使用的笔,其宽度都被记录在 



              CScribbleDoc 中成为它的一个成员变量: 



622 


…………………………………………………………Page 685……………………………………………………………

                                                                    10      MFC 

                                                                 第 章           與對話盒 



 // in SCRIBDOC。H 

class CScribbleDoc : public CDocument 

 { 

protected: 

    UINT            m_nPenWidth;    // current user…selected pen width 

    UINT            m_nThinWidth; 

    UINT            m_nThickWidth; 

 。。。 

 } 



所以由CScribDoc 负责唤起对话框,接受笔宽设定,是很合情合理的事。 



如果命令消息处理例程名为OnPenWidths,我们希望在这个函数中先唤起对话框,由对 



话盒取得粗笔和细笔的宽度,然后再把这两个值设定给CScribbleDoc 中的两个对应变 



数。下面是设计步骤。 



   执行ClassWizard,选择【Message Map 】附页,并选择CScribbleDoc。 



     

 在【Object IDs 】清单中选择ID_PEN_ WIDTHS。 



     

 在【Messages 】清单中选择MAND 。 

     

 按下【Add Function 】钮并接受ClassWizard 给予的函数名称OnPenWidths。 



                                                                                                623 


…………………………………………………………Page 686……………………………………………………………

                    第篇    深入  MFC  程式設計 



                       按下【Edit Code 】钮,光标落在OnPenWidths 函数内,键入以下内容: 

                     



                        // SCRIBDOC。CPP 

                        #include 〃pendlg。h〃 

                        。。。 

                        void CScribbleDoc::OnPenWidths() 

                        { 

                            CPenWidthsDlg dlg; 

                            // Initialize dialog data 

                            dlg。m_nThinWidth = m_nThinWidth; 

                            dlg。m_nThickWidth = m_nThickWidth; 



                            // Invoke the dialog box 

                            if (dlg。DoModal() == IDOK) 

                            { 

                                // retrieve the dialog data 

                                m_nThinWidth = dlg。m_nThinWidth; 

                                m_nThickWidth = dlg。m_nThickWidth; 



                                // Update the pen that is used by views when drawing new strokes; 

                                // to reflect the new pen width definitions for 〃thick〃 and 〃thin〃。 

                                ReplacePen(); 

                            } 

                        } 



                    现在,Scribble Step3 全部完成
返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!