深入浅出MFC第2版(PDF格式)-第164部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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椅磳懳恼戮靡樱
深入湷錾钊霚