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

第164部分

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

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

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






          程序初始化时就把二维数组的初值设定好(本例不进行文件读写),并产生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 二维数组中。 



                  GRIDDLG。CPP 



                   #0001 

                   #0002  BOOL CGridDlg::OnInitDialog() 

                   #0003  { 

                   #0004      CString str; 

                   #0005      int   i; j; 



838 


…………………………………………………………Page 901……………………………………………………………

                             16                            ponents & ActiveX Controls 

                          第 章 站眾的肩膀 使用 



#0006      CRect rect; 

#0007 

#0008      CDialog::OnInitDialog(); 

#0009 

#0010      VERIFY(m_OcxGrid。GetCols() == (long)MAXCOL); 

#0011      VERIFY(m_OcxGrid。GetRows() == (long)MAXROW); 

#0012 

#0013      m_OcxGrid。SetRow(0);             // #0 Row 

#0014      for (i = 0; i 《 MAXCOL; i++) {   // 所有的 Cols 

#0015          if (i) { // column headings 

#0016              m_OcxGrid。SetCol(i); 

#0017              if (i == (MAXCOL…1)) 

#0018                  m_OcxGrid。SetText(CString(〃Total〃)); 

#0019              else 

#0020                  m_OcxGrid。SetText(CString('A' + i 1)); 

#0021          } 

#0022      } 

#0023 

#0024      m_OcxGrid。SetCol(0);             // #0 Col 

#0025      for (j = 0; j 《 MAXROW; j++) {   // 所有的 Rows 

#0026          if (j) { // row headings 

#0027              m_OcxGrid。SetRow(j); 

#0028              if (j == (MAXROW…1)) 

#0029                  m_OcxGrid。SetText(CString(〃Total〃)); 

#0030              else { 

#0031                  str。Format(〃%d〃; j); 

#0032                  m_OcxGrid。SetText(str); 

#0033              } 

#0034          } 

#0035      } 

#0036 

#0037      // sets the spreadsheet values from m_dArray 

#0038      for (i = 1; i 《 (MAXCOL…1); i++) { 

#0039          m_OcxGrid。SetCol(i); 

#0040          for (j = 1; j 《 (MAXROW…1); j++) { 

#0041              m_OcxGrid。SetRow(j); 

#0042              str。Format(〃%8。2f〃; m_dArray'i''j'); 

#0043              m_OcxGrid。SetText(str); 

#0044          } 

#0045      } 

#0046 

#0047      puteSums(); 

#0048 

#0049      // be sure there's a selected cell 

#0050      m_OcxGrid。SetCol(1); 

#0051      m_OcxGrid。SetRow(1); 



                                                                                                  839 


…………………………………………………………Page 902……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   #0052      m_cellValue = m_OcxGrid。GetText(); 

                   #0053      UpdateData(FALSE); // calls DoDataExchange to update edit control 

                   #0054      return TRUE; 

                   #0055  } 

                   #0056 

                   #0057  void CGridDlg::OnOK() 

                   #0058  { 

                   #0059      int i; j; 

                   #0060 

                   #0061      for (i = 1; i 《 (MAXCOL…1); i++) { 

                   #0062          m_OcxGrid。SetCol(i); 

                   #0063          for (j = 1; j 《 (MAXROW…1); j++) { 

                   #0064              m_OcxGrid。SetRow(j); 

                   #0065              m_dArray'i''j' = atof(m_OcxGrid。GetText()); 

                   #0066          } 

                   #0067      } 

                   #0068      CDialog::OnOK(); 

                   #0069  } 

                   #0070 

                   #0071  void CGridDlg::OnUpdatevalue() 

                   #0072  { 

                   #0073      CString str; 

                   #0074      double value; 

                   #0075      // LONG   lRow; lCol; 

                   #0076      int   Row; Col; 

                   #0077 

                   #0078      if (m_OcxGrid。GetCellSelected() == 0) { 

                   #0079        AfxMessageBox(〃No cell selected〃); 

                   #0080        return; 

                   #0081      } 

                   #0082 

                   #0083      UpdateData(TRUE); 

                   #0084      value = atof(m_cellValue); 

                   #0085      str。Format(〃%8。2f〃; value); 

                   #0086 

                   #0087      // saves current cell selection 

                   #0088      Col = m_OcxGrid。GetCol(); 

                   #0089      Row = m_OcxGrid。GetRow(); 

                   #0090 

                   #0091      m_OcxGrid。SetText(str); // copies new value to 

                   #0092                              //  the selected cell 

                   #0093      puteSums(); 

                   #0094 

                   #0095      // restores current cell selection 

                   #0096      m_OcxGrid。SetCol(Col); 

                   #0097      m_OcxGrid。SetRow(Row); 



840 


…………………………………………………………Page 903……………………………………………………………

                             16                           ponents & ActiveX Controls 

                          第 章 站眾的肩膀 使用 



#0098  } 

#0099 

#0100  void CGridDlg::OnSelChangeGrid() 

#0101  { 

#0102      if (m_OcxGrid) { 

#0103          m_cellValue = m_OcxGrid。GetText(); 

#0104          UpdateData(FALSE); // calls DoDataExchange to update edit 

control 

#0105          GotoDlgCtrl(GetDlgItem(IDC_VALUE)); // position edit control 

#0106      } 

#0107  } 

#0108 

#0109  void CGridDlg::puteSums() 

#0110  { 

#0111      int    i; j; nRows; nCols; 

#0112      double sum; 

#0113      CString str; 

#0114 

#0115      // adds up each row and puts the sum in the right col 

#0116      // col count could have been changed by add row/delete row 

#0117      nCols = (int) m_OcxGrid。GetCols(); 

#0118      for (j = 1; j 《 (MAXROW…1); j++) { 

#0119          m_OcxGrid。SetRow(j); 

#0120          sum = 0。0; 

#0121          for (i = 1; i 《 nCols 1; i++) { 

#0122              m_OcxGrid。SetCol(i); 

#0123              sum += atof(m_OcxGrid。GetText()); 

#0124          } 

#0125          str。Format(〃%8。2f〃; sum); 

#0126          m_OcxGrid。SetCol(nCols 1); 

#0127          m_OcxGrid。SetText(str); 

#0128      } 

#0129 

#0130      // adds up each column and puts the sum in the bottom row 

#0131      // row count could have been changed by add row/delete row 

#0132      nRows = (int) m_OcxGrid。GetRows(); 

#0133      for (i = 1; i 《 MAXCOL; i++) { 

#0134          m_OcxGrid。SetCol(i); 

#0135          sum = 0。0; 

#0136          for (j = 1; j 《 nRows 1; j++) { 

#0137              m_OcxGrid。SetRow(j); 

#0138              sum += atof(m_OcxGrid。GetText()); 

#0139          } 

#0140          str。Format(〃%8。2f〃; sum); 

#0141          m_OcxGrid。SetRow(nRows 1); 

#0142          m_OcxGrid。SetText(str); 



                                                                                                841 


…………………………………………………………Page 904……………………………………………………………

                   第篇    深入  MFC  程式設計 



                   #0143      } 

                   #0144  } 



                   下图是  OcxTest  的执行画面。 



 842 


…………………………………………………………Page 905……………………………………………………………

                                        5 



               附錄 



深入湷觥FC 

                2nd Edition 



                                             843 


…………………………………………………………Page 906……………………………………………………………

                            

                  第五篇 附錄  



  844 


…………………………………………………………Page 907……………………………………………………………

                                                            

                                                   附錄A 無責任書評 



         

附錄A 無責任書評 



                   從搖籃到墳墓      

                                                     

            Windows 的完全學習 



                                               侯捷             整理 

                                                     /  1996。08。12  



侯俊傑先生邀請我為他嘔心瀝血的新作 深入湷錾钊霚出 MFC  寫點枺鳌N椅磳懳恼戮靡樱

                                深入湷錾钊霚

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

你可能喜欢的