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

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

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






832 


…………………………………………………………Page 895……………………………………………………………

                            16                           ponents & ActiveX Controls 

                         第 章 站眾的肩膀 使用 



        afx_msg void OnSelChangeGrid(); 

        DECLARE_EVENTSINK_MAP() 

        //}}AFX_MSG 

        DECLARE_MESSAGE_MAP() 

}; 



GRIDDLG。CPP 



BEGIN_MESSAGE_MAP(CGridDlg; CDialog) 

        //{{AFX_MSG_MAP(CGridDlg) 

        ON_BN_CLICKED(IDC_UPDATEVALUE; OnUpdatevalue) 

        //}}AFX_MSG_MAP 

END_MESSAGE_MAP() 



//////////////////////////////////////////////////////////////////////// 

///// 

// CGridDlg message handlers 



BEGIN_EVENTSINK_MAP(CGridDlg; CDialog) 

    //{{AFX_EVENTSINK_MAP(CGridDlg) 

    ON_EVENT(CGridDlg; IDC_GRID; 2 /* SelChange */; OnSelChangeGrid; VTS_NONE) 

    //}}AFX_EVENTSINK_MAP 

END_EVENTSINK_MAP() 



BOOL CGridDlg::OnInitDialog() 

{ 

        CDialog::OnInitDialog(); 



        // TODO: Add extra initialization here 



        return TRUE;  // return TRUE unless you set the focus to a control 

                      // EXCEPTION: OCX Property Pages should return FALSE 

} 



void CGridDlg::OnOK() 

{ 

        // TODO: Add extra validation here 



        CDialog::OnOK(); 

} 



void CGridDlg::OnCancel() 

{ 

        // TODO: Add extra cleanup here 



        CDialog::OnCancel(); 



                                                                                              833 


…………………………………………………………Page 896……………………………………………………………

                  第篇    深入  MFC  程式設計 



                   } 



                  void CGridDlg::OnUpdatevalue() 

                   { 

                          // TODO: Add your control notification handler code here 

                   } 



                  void CGridDlg::OnSelChangeGrid() 

                   { 

                          // TODO: Add your control notification handler code here 

                   } 



            为对话框加上一些变量 



                  进入ClassWizard,进入【Member Variables 】附页,选按其中的【Add Variable 】钮,为 



                  OcxTest 加上两笔成员变量。其中一笔用来储存目前被选中的电子表格方格内容,另一笔 



                  资料用来做为Grid 对象,其变量类型是CGridCtrl: 



                 这两个动作为我们带来这样的程序代码: 



                  GRIDDLG。H 



                  class CGridDlg : public CDialog 

                   { 

                   // Dialog Data 

                          //{{AFX_DATA(CGridDlg) 

                          enum { IDD = IDD_GRID }; 



834 


…………………………………………………………Page 897……………………………………………………………

                                  16                         ponents & ActiveX Controls 

                                第 章 站眾的肩膀 使用 



                CGridCtrl   m_OcxGrid; 

                CString     m_cellValue; 

                //}}AFX_DATA 

         。。。 

         }; 



        GRIDDLG。CPP 



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

                : CDialog(CGridDlg::IDD; pParent) 

         { 

                //{{AFX_DATA_INIT(CGridDlg) 

                m_cellValue = _T(〃〃); 

                //}}AFX_DATA_INIT 

         } 



        void CGridDlg::DoDataExchange(CDataExchange* pDX) 

         { 

                CDialog::DoDataExchange(pDX); 

                //{{AFX_DATA_MAP(CGridDlg) 

                DDX_Control(pDX; IDC_GRID; m_OcxGrid); 

                DDX_Text(pDX; IDC_VALUE; m_cellValue); 

                //}}AFX_DATA_MAP 

         } 



新增一个菜单项目 



       利用资源编辑器,将菜单修改如下: 



      注意,我所改变的菜单是IDR_MAINFRAME ,这是在没有任何子窗口存在时才会出现的 



      菜单。所以如果你要执行OcxTest 并看到Grid 组件,你必须先将所有的子窗口关闭。 



       现在利用ClassWizard 在主窗口的消息映射表中拦截它的命令消息: 



                                                                                               835 


…………………………………………………………Page 898……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   获得对应的程序代码如下: 



                   MA INFRM。H 



                   class CMainFrame : public CMDIFrameWnd 

                   { 

                   。。。 

                   protected: 

                           //{{AFX_MSG(CMainFrame) 

                           afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); 

                           afx_msg void OnGridTest(); 

                           //}}AFX_MSG 

                           DECLARE_MESSAGE_MAP() 

                   }; 



                   MAINFRM。CPP 



                   BEGIN_MESSAGE_MAP(CMainFrame; CMDIFrameWnd) 

                           //{{AFX_MSG_MAP(CMainFrame) 

                           ON_WM_CREATE() 

                           ON_MAND(ID_GridTest; OnGridTest) 

                           //}}AFX_MSG_MAP 

                   END_MESSAGE_MAP() 



836 


…………………………………………………………Page 899……………………………………………………………

                              16                     ponents & ActiveX Controls 

                            第 章 站眾的肩膀 使用 



        void CMainFrame::OnGridTest() 

        { 

                // TODO: 

        } 



        为了让这个新增菜单命令真正发挥效用,将Grid 对话窗唤起,我在OnGridTest 函数加 



        两行: 



        #include 〃GridDlg。h〃 

        。。。 

        void CMainFrame::OnGridTest() 

        { 

            CGridDlg dlg;          // constructs the dialog 

            dlg。DoModal();         // starts the dialog 

        } 



        现在,将OcxTest 编译连结一遍,得到一个可以顺利执行的程序,但Grid 之中全无内容。 



Grid  相关程序设计 



        现在我要开始设计Grid 相关函数。我的主要的工作是: 



          准备一个二维(7x14 )的DWORD 数组,用来储存Grid  的方格内容。 



          程序初始化时就把二维数组的初值设定好(本例不进行文件读写),并产生Grid 



         对话框。 



          对话框一出现,程序立刻把电子表格的行、列、宽、高,以及字段名称都设定好, 



         并且把二维数组的数值放到对应方格中。初值的总和也一并计算出来。 



          把计算每一列每一行总和的工作独立出来,成立一个puteSums 函数。 



        为了放置电子表格内容,必须设计一个7x14 二维数组。虽然电子表格中某些方格(如列标 



        题或行标题)不必有内容,不过为求简化,还是完全配合电子表格的大小来设计数值数组 



        好了。注意,不能把这个变量放在AFX_DATA  之内,因为我并非以ClassWizard 加入此 



        变量。 



                                                                                  837 


…………………………………………………………Page 900……………………………………………………………

                  第篇    深入  MFC  程式設計 



                  GRIDDLG。H 



                   #define MAXCOL 7 

                   #define MAXROW 14 



                   class CGridDlg : public CDialog 

                   { 

                   。。。 

                   // Dialog Data 

                          double m_dArray'MAXCOL''MAXROW'; 



                  private: 

                          void puteSums(); 

                   }; 



                  为了设定Grid  中的表头以及初值,我在OnInitDialog 中先以一个for loop 设定横列表 



                  头再以一个for loop 设定纵行表头,最后再以巢状(两层)for loop 设定每一个方格内 



                  容,然后才调用puteSums 计算总和。 



                  当使用者选择一个方格,其值就被OnSelchangeGrid 拷贝一份到edit 字段中,这时候就 



                  可以开始输入了。 



                  OnUpdatevalue (【Update Value 】按钮的处理例程)有两个主要任务,一是把edit 字段 



                  内容转化为数值放到目前被选择的方格上,一是修正总和。 



                  OnOk 必须能够把每一个方格内容(一个字符串)取出,利用atof 转换为数值,然后储存 



                  到m_dArray 二维数组中。 



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